散列降低了维度,而单热编码通过将多类别变量转换为许多二进制变量,本质上炸毁了特征空间。因此,它们似乎具有相反的效果。我的问题是:
在同一个数据集上做这两个有什么好处?我读过一些关于捕捉交互的东西,但没有详细说明——有人可以详细说明一下吗?
哪个先出现,为什么?
散列降低了维度,而单热编码通过将多类别变量转换为许多二进制变量,本质上炸毁了特征空间。因此,它们似乎具有相反的效果。我的问题是:
在同一个数据集上做这两个有什么好处?我读过一些关于捕捉交互的东西,但没有详细说明——有人可以详细说明一下吗?
哪个先出现,为什么?
将分类数据提供给具有标准内核的线性模型和 SVM需要二进制 one-hot 编码。
例如,您可能有一个特征是一周中的某一天。然后为它们中的每一个创建一个单热编码。
1000000 Sunday
0100000 Monday
0010000 Tuesday
...
0000001 Saturday
特征散列主要用于允许对参数向量进行显着的存储压缩:将高维输入向量散列到低维特征空间中。现在,生成的分类器的参数向量因此可以存在于低维空间而不是原始输入空间中。这可以用作一种降维方法,因此通常您希望以显着的存储优势来换取一些性能下降。
维基百科中的例子是一个很好的例子。假设您有三个文件:
使用词袋模型,您首先创建下面的文档到词模型。(每一行是一个文档,矩阵中的每个条目表示一个单词是否出现在文档中)。
这个过程的问题是这样的字典占用了大量的存储空间,并且随着训练集的增长而变大。
使用散列技巧的特征向量化器可以通过将散列函数 h 应用于所考虑项目中的特征(例如单词),然后直接使用散列值来构建预定义长度的向量,而不是维护字典作为特征索引并在这些索引处更新结果向量。
假设您生成以下具有 3 个存储桶的散列特征。(您将k
不同的哈希函数应用于原始特征并计算哈希值命中存储桶的次数)。
bucket1 bucket2 bucket3
doc1: 3 2 0
doc2: 2 2 0
doc3: 1 0 2
现在您已成功将 9 维特征转换为 3 维特征。
特征散列的一个更有趣的应用是进行个性化。特征散列的原始论文包含一个很好的例子。
想象一下,您想设计一个垃圾邮件过滤器,但要针对每个用户进行定制。这样做的幼稚方法是为每个用户训练一个单独的分类器,这对于训练(训练和更新个性化模型)或服务(将所有分类器保存在内存中)都是不可行的。一个聪明的方法如下图所示:
现在回答你的问题:
是的。one-hot-encoding 应该首先出现,因为它将分类特征转换为二进制特征以使其可用于线性模型。只要使用压缩的特征空间有好处,您就可以肯定地将两者应用于同一数据集。请注意,如果您可以容忍原始特征维度,则不需要特征散列。例如,在常见的数字识别问题中,例如MINST,图像由 28x28 二进制像素表示。输入维度只有 784。在这种情况下,特征哈希肯定不会有任何好处。