在预处理具有高基数的数据时,您首先进行哈希编码还是首先进行一次热编码?

New*_*bie 3 hash machine-learning dimensionality-reduction one-hot-encoding

散列减少了维度,而单热编码通过将多分类变量转换为许多二进制变量来实质上炸毁了特征空间.所以看起来他们有相反的效果.我的问题是:

在同一数据集上执行这两个操作有什么好处?我读了一些关于捕捉互动但没有详细说明的内容 - 有人可以详细说明吗?

哪一个首先出现,为什么?

gre*_*ess 8

需要二进制单热编码来将分类数据馈送到具有标准内核的线性模型和SVM.

例如,您可能拥有一周中的某一天的功能.然后为每个创建一个热门编码.

1000000 Sunday
0100000 Monday
0010000 Tuesday
...
0000001 Saturday
Run Code Online (Sandbox Code Playgroud)

特征散列主要用于允许对参数向量进行显着的存储压缩:将高维输入向量散列到较低维度的特征空间中.现在,结果分类器的参数向量因此可以存在于较低维空间而不是原始输入空间中.这可以用作减少尺寸的方法,因此通常您希望通过显着的存储效益来降低性能.

维基百科中的例子是一个很好的例子.假设您有三个文件:

  • 约翰喜欢看电影.
  • 玛丽也喜欢电影.
  • 约翰也喜欢足球.

使用词袋模型,首先创建下面的文档到单词模型.(每行是一个文档,矩阵中的每个条目表示文档中是否出现一个单词).

在此输入图像描述

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

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

假设您使用3个桶生成以下散列功能.(k对原始要素应用不同的散列函数,并计算散列值到达存储桶的次数).

       bucket1 bucket2  bucket3
doc1:    3         2        0
doc2:    2         2        0
doc3:    1         0        2
Run Code Online (Sandbox Code Playgroud)

现在,您已成功将9维特征转换为3维.

功能散列的一个更有趣的应用是进行个性化.功能散列的原始论文包含一个很好的例子.

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

在此输入图像描述

  • 每个令牌都是重复的,并且通过将每个单词与唯一的用户ID连接来个性化一个副本.(参见USER123_NEUUSER123_Votre).
  • 单词包模型现在包含常用关键字和特定于用户的关键字.
  • 然后将所有单词散列到低维度特征空间中,在该空间中对文档进行训练和分类.

现在回答你的问题:

是.单热编码应该首先应用,因为它将分类特征转换为二元特征,使其可以被线性模型消费.只要有使用压缩特征空间的好处,您就可以在同一数据集上同时应用它们.请注意,如果您可以容忍原始要素尺寸,则不需要进行要素散列.例如,在常见的数字识别问题中,例如MINST,图像由28×28二进制像素表示.输入维度仅为784.在这种情况下,确保功能散列不会有任何好处.