特征哈希究竟是如何工作的?
How exactly does feature hashing work?
我阅读了很多关于机器学习分类变量特征散列的在线文章。不幸的是,我仍然无法掌握这个概念并理解它是如何工作的。我将通过下面从另一个站点获取的示例数据集和哈希函数来说明我的困惑:
>>>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[=28 中有两个 '1' =]和state_5,但是state_0[=28中没有'1' =]、state_1 和 state_2。任何反馈将不胜感激!
当您不知道分类变量的所有可能值时,通常会使用特征哈希。因此,我们无法创建从分类值到列的静态映射。所以用一个哈希函数来确定每个分类值对应于哪一列。
这不是最佳用例,因为我们知道恰好有 50 个状态,可以只使用一种热编码。
哈希函数也会有冲突,不同的值映射到相同的值。这就是这里发生的事情。两个不同的状态名在散列函数中取模运算后散列为同一个值。
减轻冲突的一种方法是使您的特征 space(列数)大于可能的分类值的数量。
我阅读了很多关于机器学习分类变量特征散列的在线文章。不幸的是,我仍然无法掌握这个概念并理解它是如何工作的。我将通过下面从另一个站点获取的示例数据集和哈希函数来说明我的困惑:
>>>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[=28 中有两个 '1' =]和state_5,但是state_0[=28中没有'1' =]、state_1 和 state_2。任何反馈将不胜感激!
当您不知道分类变量的所有可能值时,通常会使用特征哈希。因此,我们无法创建从分类值到列的静态映射。所以用一个哈希函数来确定每个分类值对应于哪一列。
这不是最佳用例,因为我们知道恰好有 50 个状态,可以只使用一种热编码。
哈希函数也会有冲突,不同的值映射到相同的值。这就是这里发生的事情。两个不同的状态名在散列函数中取模运算后散列为同一个值。
减轻冲突的一种方法是使您的特征 space(列数)大于可能的分类值的数量。