【问题标题】:Understanding the hashing trick results了解散列技巧结果
【发布时间】:2021-03-11 12:05:44
【问题描述】:

有一个带有语言列的 DF,我试图了解使用 HashingEncoder 得到的结果。

简化的 DF(DF 中有更多列):

      language country
0      English      US
1      English      US
2      English      US
3      English      AU
4      Italian      IT
5   Portuguese      JP
6      English      US
7      English      AU
8      English      US
9       German      DE
10      French      CA
11     English      UK
12     English      US
13     English      US
14     Italian      IT
15     Italian      IT
16     English      UK
17     English      US
18     English      US
19     English      AU
20     English      AU
21     English      AU
22     Italian      IT
23     English      UK
24     English      US
25      French      FR
26     English      UK
27     English      US
28     English      US
29    Japanese      AU
30     English      AU
31     English      AU
32     English      US
33     English      AU
34     English      AU
35     English      UK
36     English      AU
37     English      UK
38     English      US
39     English      US
40     English      US
41     English      AU
42     English      US
43     English      UK
44     English      AU
45     English      AU
46     English      UK
47     English      US
48     English      AU
49     English      US

我已经使用以下代码转换了语言列:

from category_encoders.hashing import HashingEncoder
ce_hash = HashingEncoder(cols = ['language'])
df2 = ce_hash.hashing_trick(df,N=2)
df2['lang'] = df['language']

结果:

   col_0  col_1        lang
0     26      7     English
1     20     13     English
2     23     10     English
3     18     15     English
4     22     11     Italian
5     19     14  Portuguese
6     20     13     English
7     19     14     English
8     19     14     English
9     19     14      German

为什么我在col_0 col_1 中得到相同语言的不同值?

更新: 当我从 DF 中删除其他列并仅保留语言列时,结果如下所示:

   col_0  col_1        lang
0      1      0     English
1      1      0     English
2      1      0     English
3      1      0     English
4      0      1     Italian
5      0      1  Portuguese
6      1      0     English
7      1      0     English
8      1      0     English
9      1      0      German

我的猜测是hashing_trick 方法正在使用来自 DF 中其他列的信息。

问:如何使用散列技巧对语言类别进行编码,冲突最少?

【问题讨论】:

  • @DaniMesejo 我添加了 DF 的简化版本
  • 您只是在寻找分类吗?你想做什么?
  • @AndrasDeak 我的数据受到数字和分类值的影响,有些像语言是具有高基数的类别。我正在研究散列技巧以避免稀疏数据。

标签: python pandas dataframe hash


【解决方案1】:

根据Wikipedia,散列技巧:

将任意特征转换为向量或矩阵中的索引

这里的N,是输出维度(上面提到的向量中的索引数),所以为了尽量减少碰撞增加输出维度,例如:

df2 = ce_hash.hashing_trick(df, N=6, cols=['language'])
df2['lang'] = df['language']
print(df2)

输出

   col_0  col_1  col_2  col_3  col_4  col_5        lang
0      0      0      0      0      1      0     English
1      0      0      0      0      1      0     English
2      0      0      0      0      1      0     English
3      0      0      0      0      1      0     English
4      0      0      0      1      0      0     Italian
5      0      1      0      0      0      0  Portuguese
6      0      0      0      0      1      0     English
7      0      0      0      0      1      0     English
8      0      0      0      0      1      0     English
9      1      0      0      0      0      0      German

关于用于哈希的输入列数,通过查看code可以看出:

if cols is None:
    cols = X.columns.values

基本上它将使用输入 df 的所有列。 hashing_trick 函数不使用调用对象的任何信息。

最后要自动确定输出维数,使用fit_transform

df2 = ce_hash.fit_transform(df)
df2['lang'] = df['language']
print(df2)

输出

   col_0  col_1  col_2  col_3  col_4  col_5  col_6  col_7        lang
0      0      0      0      0      1      0      0      0     English
1      0      0      0      0      1      0      0      0     English
2      0      0      0      0      1      0      0      0     English
3      0      0      0      0      1      0      0      0     English
4      0      0      0      0      0      1      0      0     Italian
5      0      1      0      0      0      0      0      0  Portuguese
6      0      0      0      0      1      0      0      0     English
7      0      0      0      0      1      0      0      0     English
8      0      0      0      0      1      0      0      0     English
9      0      0      0      0      0      0      1      0      German

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2019-01-21
    • 2014-04-11
    • 2016-01-04
    • 2014-01-05
    • 2012-04-14
    相关资源
    最近更新 更多