2

我已经阅读了许多关于机器学习分类变量特征散列的在线文章。不幸的是,我仍然无法掌握这个概念并理解它是如何工作的。我将通过我从另一个站点获取的示例数据集和散列函数来说明我的困惑:

>>>data

   pop     state  year
0  1.5      Ohio  2000
1  1.7      Ohio  2001
2  3.6  New York  2002
3  2.4    Nevada  2001
4  2.9    Nevada  2002
5  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_3
0  1.5  2000        0        0        1        0
1  1.7  2001        0        0        1        0
2  3.6  2002        0        0        0        1
3  2.4  2001        0        1        0        0
4  2.9  2002        0        1        0        0
5  1.8  2003        0        0        0        1

>>> print(hash_col(data, 'state',5))
   pop  year  state_0  state_1  state_2  state_3  state_4
0  1.5  2000        1        0        0        0        0
1  1.7  2001        1        0        0        0        0
2  3.6  2002        1        0        0        0        0
3  2.4  2001        0        0        1        0        0
4  2.9  2002        0        0        1        0        0
5  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_5
0  1.5  2000        0        0        0        0        1        0
1  1.7  2001        0        0        0        0        1        0
2  3.6  2002        0        0        0        0        0        1
3  2.4  2001        0        0        0        1        0        0
4  2.9  2002        0        0        0        1        0        0
5  1.8  2003        0        0        0        0        0        1

我无法理解的是“state_0”、“state_1”、“state_2”等列分别代表什么。此外,由于我的数据集中有 4 个独特的州(俄亥俄州、纽约州、内华达州、俄勒冈州),为什么所有“ 1 ”都分配给 3 个“state_n”列,而不是像一个热编码中的 4 个?例如,当我将维度数设置为 6 时,输出在 state_3、state_4 和 state_5 中有两个“ 1state_0state_1state_2中没有“ 1 ” 。任何反馈将不胜感激!

4

1 回答 1

4

当您不知道分类变量的所有可能值时,通常使用特征散列。因此,我们无法创建从分类值到列的静态映射。因此使用哈希函数来确定每个分类值对应于哪一列。

这不是最好的用例,因为我们知道正好有 50 个状态,并且可以只使用一种热编码。

哈希函数也会有冲突,其中不同的值映射到相同的值。这就是这里发生的事情。在哈希函数中进行取模运算后,两个不同的状态名称哈希为相同的值。

减轻冲突的一种方法是使您的特征空间(列数)大于可能的分类值的数量。

于 2018-04-16T12:33:02.023 回答