了解 sklearn FeatureHasher

数据挖掘 scikit-学习 特征工程 特征提取 嵌入
2022-02-17 12:03:41

想了解“哈希技巧”,我编写了以下测试代码:

import pandas as pd
from sklearn.feature_extraction import FeatureHasher
test = pd.DataFrame({'type': ['a', 'b', 'c', 'd', 'e','f','g','h']})
h = FeatureHasher(n_features=4, input_type='string')
f = h.transform(test.type)
print(f.toarray())

在上面的示例中,我将 8 个类别映射到 4 列,输出为:

[[ 0.  0.  1.  0.]<-a
 [ 0. -1.  0.  0.]<-b
 [ 0. -1.  0.  0.]<-c
 [ 0.  0.  0.  1.]<-d
 [ 0.  0.  0.  1.]<-e
 [ 0.  0.  0.  1.]<-f
 [ 0.  0. -1.  0.]<-g
 [ 0. -1.  0.  0.]]<-g

在生成的矩阵中,我可以看到重复和某些类别以相同的方式表示。这是为什么?如果我使用二进制表示,8 个类别可以映射到 4 列。

有人可以解释一下这种技术的输出,也许可以详细说明一下吗?

1个回答

FeatureHasher 将每个标记分配给输出中的单个列;它不会进行那种允许您将更多功能忠实地编码到更小的空间的二进制编码。相反,重点是您不必像在 OneHotEncoder 中那样查找给定类别映射到哪一列:您只需将散列函数应用于该值。使用较低维的目标空间会保证碰撞,但即使是较大的目标空间也可能会产生一些碰撞。