Python sklearn FeatureHasher输出有很多冲突和未使用的列
我用它来为机器学习编码分类变量。我的分类变量是数字ID,比如1、2、3、6、18、19、20等等。我总共有18000个唯一ID,最高ID是28000 我想对它们进行散列以将它们编码为类别,因为一个热编码是不可能的,因为它将创建18000列,而我的数据集已经有4000000行,这将是非常痛苦的 我不能显示我的数据帧,所以我在一个示例数据帧上进行了说明Python sklearn FeatureHasher输出有很多冲突和未使用的列,python,scikit-learn,hash,data-science,Python,Scikit Learn,Hash,Data Science,我用它来为机器学习编码分类变量。我的分类变量是数字ID,比如1、2、3、6、18、19、20等等。我总共有18000个唯一ID,最高ID是28000 我想对它们进行散列以将它们编码为类别,因为一个热编码是不可能的,因为它将创建18000列,而我的数据集已经有4000000行,这将是非常痛苦的 我不能显示我的数据帧,所以我在一个示例数据帧上进行了说明 来自sklearn.feature\u提取导入FeatureHasher 将numpy作为np导入 作为pd进口熊猫 将matplotlib.pyp
来自sklearn.feature\u提取导入FeatureHasher
将numpy作为np导入
作为pd进口熊猫
将matplotlib.pyplot作为plt导入
tmpdf=pd.DataFrame(np.arange(10000),columns=[“test”])
产生
test
0 0
1 1
2 2
3 3
4 4
... ...
9995 9995
9996 9996
9997 9997
9998 9998
9999 9999
[10000 rows x 1 columns]
现在,如果我用字典散列:
H=FeatureHasher(n\u features=50,input\u type=“dict”)
cdict=[{str(i):1}表示范围(10000)内的i]
arr=H.变换(cdict)
plt.matshow(arr.toarray()[::100],cmap=“tab10”,vmin=-5,vmax=4)
plt.色条(收缩=0.4)
plt.show()
这将产生:
如果改为使用字符串散列:
H=FeatureHasher(n\u features=50,input\u type=“string”)
arr=H.transform(tmpdf[“test”].astype(str))
plt.matshow(arr.toarray()[::100],cmap=“tab10”,vmin=-5,vmax=4)
plt.色条(收缩=0.4)
plt.show()
我得到:
问题:
为什么基于字符串的散列的输出看起来如此奇怪?当大量列仍然完全未使用时,似乎发生了大量冲突。。。我用错了吗?对于我的用户ID编码任务,有更好的方法吗?正如Ben Reiniger所评论的,问题是给出一个字符串列表会使哈希器在字符串上迭代,因此例如,字符串“12345”不是按原样哈希,而是子字符串“1”、“2”、“3”、“4”、“5”被哈希。因为我只有数字,所以我只有10个唯一的字符串(数字“0”到“9”),这会导致很多冲突 一个可能的解决方案是将字符串放入列表中,这样哈希程序不会迭代字符串本身,而是遍历列表,然后对整个字符串进行哈希
obj=tmpdf[“test”].astype(str).to_numpy()
obj=obj.重塑(*obj.形状,1)
导致
array([['0'],
['1'],
['2'],
...,
['9997'],
['9998'],
['9999']], dtype=object)
当散列时:
H=FeatureHasher(n\u features=50,input\u type=“string”)
arr=H.变换(obj)
plt.matshow(arr.toarray()[::100],cmap=“tab10”,vmin=-5,vmax=4)
plt.色条(收缩=0.4)
plt.show()
产生更符合我喜好的输出
谢谢 是的,谢谢你!