Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sklearn FeatureHasher输出有很多冲突和未使用的列_Python_Scikit Learn_Hash_Data Science - Fatal编程技术网

Python sklearn FeatureHasher输出有很多冲突和未使用的列

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

我用它来为机器学习编码分类变量。我的分类变量是数字ID,比如1、2、3、6、18、19、20等等。我总共有18000个唯一ID,最高ID是28000

我想对它们进行散列以将它们编码为类别,因为一个热编码是不可能的,因为它将创建18000列,而我的数据集已经有4000000行,这将是非常痛苦的

我不能显示我的数据帧,所以我在一个示例数据帧上进行了说明

来自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()
产生更符合我喜好的输出


谢谢

是的,谢谢你!