Hash 在预处理高基数数据时,您是先散列还是先进行一次热编码?

Hash 在预处理高基数数据时,您是先散列还是先进行一次热编码?,hash,machine-learning,dimensionality-reduction,one-hot-encoding,Hash,Machine Learning,Dimensionality Reduction,One Hot Encoding,散列降低了维数,而一个热编码通过将多个分类变量转换为多个二进制变量,基本上破坏了特征空间。所以看起来它们有相反的效果。我的问题是: 在同一数据集上同时执行这两项操作的好处是什么?我读了一些关于捕捉互动的文章,但没有详细介绍——有人能详细介绍一下吗 哪一个先来,为什么 需要二进制1热编码将分类数据提供给具有标准内核的线性模型和支持向量机。 例如,您可能有一个功能,它是一周中的一天。然后为它们中的每一个创建一个热编码 1000000 Sunday 0100000 Monday 0010000 Tue

散列降低了维数,而一个热编码通过将多个分类变量转换为多个二进制变量,基本上破坏了特征空间。所以看起来它们有相反的效果。我的问题是:

在同一数据集上同时执行这两项操作的好处是什么?我读了一些关于捕捉互动的文章,但没有详细介绍——有人能详细介绍一下吗


哪一个先来,为什么

需要二进制1热编码将分类数据提供给具有标准内核的线性模型和支持向量机。

例如,您可能有一个功能,它是一周中的一天。然后为它们中的每一个创建一个热编码

1000000 Sunday
0100000 Monday
0010000 Tuesday
...
0000001 Saturday
特征散列主要用于对参数向量进行显著的存储压缩:将高维输入向量散列到低维特征空间。现在,得到的分类器的参数向量可以存在于低维空间,而不是原始输入空间。这可以作为一种降维方法,因此通常您希望通过降低性能来换取显著的存储好处

中的例子是一个很好的例子。假设您有三个文档:

  • 约翰喜欢看电影
  • 玛丽也喜欢电影
  • 约翰也喜欢足球
使用单词包模型,首先创建下面的文档到单词模型。(每行都是一个文档,矩阵中的每个条目都指示文档中是否出现一个单词)

这个过程的问题是,这样的字典占用了大量的存储空间,并且随着训练集的增长而增大

使用散列技巧的特征向量化器不需要维护字典,而是可以通过将散列函数h应用于所考虑的项目中的特征(例如,单词),然后直接使用散列值作为特征索引,并在这些索引处更新生成的向量,来构建预定义长度的向量

假设您使用3个bucket生成以下散列特性。(将不同的散列函数应用于原始特征,并计算散列值命中存储桶的次数)

现在,您成功地将9维要素转换为3维要素

特性散列的一个更有趣的应用是进行个性化。的原稿中有一个很好的例子

想象一下,您想要设计一个垃圾邮件过滤器,但它是为每个用户定制的。这样做的简单方法是为每个用户训练一个单独的分类器,这在训练(训练和更新个性化模型)或服务(将所有分类器保存在内存中)方面都是不可行的。智能方式如下所示:

  • 通过将每个单词与唯一的用户id连接起来,复制每个标记,并对一个副本进行个性化处理(请参见USER123_NEUUSER123_Votre
  • bag of words模型现在包含常用关键字,也使用特定关键字
  • 然后将所有单词散列到低维OANL特征空间中,在该空间中对文档进行训练和分类
现在回答您的问题:

对。一个热编码应该首先出现,因为它正在将分类特征转换为二进制特征,以使其可供线性模型使用。 只要使用压缩的特征空间有好处,就可以在同一个数据集上应用这两种方法。注意:如果可以容忍原始特征尺寸,则不需要特征散列。例如,在常见的数字识别问题中,例如,图像由28x28个二进制像素表示。输入尺寸仅为784。当然,在这种情况下,功能散列不会有任何好处

       bucket1 bucket2  bucket3
doc1:    3         2        0
doc2:    2         2        0
doc3:    1         0        2