【问题标题】:How exactly does feature hashing work?特征哈希究竟是如何工作的?
【发布时间】:2018-09-25 14:18:38
【问题描述】:

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

>>>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_4state_5 中有两个 '1',但是有在 state_0state_1state_2 中没有“1”。任何反馈将不胜感激!

【问题讨论】:

    标签: pandas machine-learning hash scikit-learn string-hashing


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢@Bert。我的另一个问题是,如果特征空间(列数)等于或大于可能的分类值的数量,那不会产生与一个热编码相同的列数,因为 OHE 每个分类有 1 个特征列特征?如果是这样,与 OHE 相比,特征散列的优势是什么?
    • 当您不提前了解所有类别时使用它。例如,考虑变量“衬衫品牌”。您可以从您的训练集中创建一个热编码,但是当您看到带有不在训练集中的品牌的样本时,在预测时会发生什么?
    猜你喜欢
    • 1970-01-01
    • 2018-01-29
    • 2015-06-27
    • 2011-06-26
    • 2021-08-15
    • 2012-06-08
    • 2011-10-11
    • 2013-07-05
    • 1970-01-01
    相关资源
    最近更新 更多