我阅读了许多关于机器学习中分类变量特征哈希的在线文章。不幸的是,我仍然无法理解这个概念和它的工作原理。我将通过下面的示例数据集和从另一个网站获取的哈希函数来说明我的困惑:
>>>data pop state year0 1.5 Ohio 20001 1.7 Ohio 20012 3.6 New York 20023 2.4 Nevada 20014 2.9 Nevada 20025 1.8 Oregon 2003>>> def hash_col(df, col, N): cols = [col + "_" + str(i) for i in range(N)] def xform(x): tmp = [0 for i in range(N)]; tmp[hash(x) % N] = 1; return pd.Series(tmp,index=cols) df[cols] = df[col].apply(xform) return df.drop(col,axis=1)
下面的函数用于通过指定不同维数(换句话说,即哈希特征)来打印出不同的转换输出:
>>> print(hash_col(data, 'state',4)) pop year state_0 state_1 state_2 state_30 1.5 2000 0 0 1 01 1.7 2001 0 0 1 02 3.6 2002 0 0 0 13 2.4 2001 0 1 0 04 2.9 2002 0 1 0 05 1.8 2003 0 0 0 1>>> print(hash_col(data, 'state',5)) pop year state_0 state_1 state_2 state_3 state_40 1.5 2000 1 0 0 0 01 1.7 2001 1 0 0 0 02 3.6 2002 1 0 0 0 03 2.4 2001 0 0 1 0 04 2.9 2002 0 0 1 0 05 1.8 2003 0 0 0 0 1>>> print(hash_col(data, 'state',6)) pop year state_0 state_1 state_2 state_3 state_4 state_50 1.5 2000 0 0 0 0 1 01 1.7 2001 0 0 0 0 1 02 3.6 2002 0 0 0 0 0 13 2.4 2001 0 0 0 1 0 04 2.9 2002 0 0 0 1 0 05 1.8 2003 0 0 0 0 0 1
我不明白的是,每个‘state_0’, ‘state_1’, ‘state_2’等列代表什么。此外,由于我的数据集中有4个独特的州(Ohio, New York, Nevada, Oregon),为什么所有的’1‘只分配给了3个‘state_n’列,而不是像独热编码那样分配给4个列?例如,当我将维数设置为6时,输出在state_3, state_4和state_5中有两个’1‘,但在state_0, state_1和state_2中没有’1‘。任何反馈都将不胜感激!
回答:
特征哈希通常在你不知道分类变量的所有可能值时使用。正因为如此,我们无法创建从分类值到列的静态映射。因此,使用哈希函数来确定每个分类值对应哪个列。
这不是最佳用例,因为我们知道有确切的50个州,可以直接使用独热编码。
哈希函数也会有碰撞,不同的值被映射到同一个值。这就是这里发生的情况。两个不同的州名在哈希函数的模运算后被映射到同一个值。
减轻碰撞的一种方法是使特征空间(列数)大于可能的分类值数量。