哈希处理可以降低维度,而独热编码则通过将多类别变量转换为多个二进制变量,实际上是扩大了特征空间。因此,它们似乎具有相反的效果。我的问题是:
在同一数据集上同时使用这两种方法有什么好处?我读到了一些关于捕捉交互作用的内容,但没有详细说明——有人能详细解释一下吗?
哪一种方法应该先进行,为什么?
回答:
二进制独热编码是将类别数据输入到线性模型和使用标准核的SVM中所必需的。
例如,你可能有一个特征是星期几。然后你为每个星期几创建一个独热编码。
1000000 星期日0100000 星期一0010000 星期二...0000001 星期六
特征哈希主要用于允许对参数向量进行显著的存储压缩:将高维输入向量哈希到一个较低维的特征空间中。因此,结果分类器的参数向量可以存在于较低维的空间中,而不是在原始输入空间中。这可以作为一种降维方法,因此通常你期望以牺牲一些性能为代价来换取显著的存储优势。
维基百科上的例子很好。假设你有三份文档:
- John喜欢看电影。
- Mary也喜欢电影。
- John也喜欢足球。
使用词袋模型,你首先创建下面的文档到词模型。(每行是一个文档,矩阵中的每个条目表示一个词是否出现在文档中)。
这种处理的问题在于这样的词典占用了大量的存储空间,并且随着训练集的增长而增长。
与其维护一个词典,使用哈希技巧的特征向量化器可以通过对考虑项中的特征(例如,词)应用哈希函数h,然后直接使用哈希值作为特征索引,并在这些索引处更新结果向量,从而构建一个预定义长度的向量。
假设你生成了3个桶的哈希特征。(你对原始特征应用k
个不同的哈希函数,并计算哈希值命中桶的次数)。
桶1 桶2 桶3doc1: 3 2 0doc2: 2 2 0doc3: 1 0 2
现在你成功地将9维的特征转换为了3维的特征。
特征哈希的一个更有趣的应用是进行个性化。特征哈希的原始论文中包含了一个很好的例子。
想象一下,你想设计一个垃圾邮件过滤器,但要针对每个用户进行定制。做这件事的简单方法是为每个用户训练一个单独的分类器,这在训练(训练和更新个性化模型)或服务(在内存中保存所有分类器)方面都是不可行的。一个聪明的方法如下所示:
- 每个标记都被复制,并且其中一份通过将每个词与唯一的用户ID连接起来进行个性化处理。(参见USER123_NEU和USER123_Votre)。
- 词袋模型现在包含了通用关键词和特定用户的关键词。
- 然后所有词都被哈希到一个低维特征空间中,在那里对文档进行训练和分类。
现在回答你的问题:
是的,独热编码应该先进行,因为它是将类别特征转换为二进制特征,使其能够被线性模型使用。你当然可以对同一数据集同时应用这两种方法,只要使用压缩特征空间有好处即可。注意,如果你能容忍原始特征维度,则不需要特征哈希。例如,在常见的数字识别问题中,例如MINST,图像由28×28的二进制像素表示。输入维度只有784。在这种情况下,特征哈希肯定不会有任何好处。