【发布时间】:2021-03-14 10:21:24
【问题描述】:
在实施机器学习模型之前,我正在预处理我的数据。一些特征具有高基数,例如国家和语言。
由于将这些特征编码为 one-hot-vector 会产生稀疏数据,因此我决定研究 the hashing trick 并像这样使用 python 的 category_encoders:
from category_encoders.hashing import HashingEncoder
ce_hash = HashingEncoder(cols = ['country'])
encoded = ce_hash.fit_transform(df.country)
encoded['country'] = df.country
encoded.head()
查看结果时,我可以看到碰撞
col_0 col_1 col_2 col_3 col_4 col_5 col_6 col_7 country
0 0 0 1 0 0 0 0 0 US <━┓
1 0 1 0 0 0 0 0 0 CA. ┃ US and SE collides
2 0 0 1 0 0 0 0 0 SE <━┛
3 0 0 0 0 0 0 1 0 JP
进一步调查将我带到this Kaggle article。 Hashing 的例子包括 X 和 y。
- y 的目的是什么,它是否有助于解决碰撞问题?
- 我是否应该向编码器添加更多列并将多个特征一起编码(例如国家和语言)?
希望了解如何使用散列技巧对此类类别进行编码。
更新: 根据我从@CoMartel 获得的 cmets,我查看了Sklearn FeatureHasher 并编写了以下代码来对国家列进行哈希处理:
from sklearn.feature_extraction import FeatureHasher
h = FeatureHasher(n_features=10,input_type='string')
f = h.transform(df.country)
df1 = pd.DataFrame(f.toarray())
df1['country'] = df.country
df1.head()
得到以下输出:
0 1 2 3 4 5 6 7 8 9 country
0 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 US
1 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 US
2 -1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 -1.0 0.0 US
3 0.0 -1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 CA
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 -1.0 0.0 SE
5 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 JP
6 -1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 AU
7 -1.0 0.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 AU
8 -1.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 DK
9 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 -1.0 0.0 SE
- 这是使用库来编码高分类的方式吗? 价值观?
- 为什么有些值是负数?
- 您将如何选择“正确的”
n_features值? - 如何查看碰撞率?
【问题讨论】:
-
看source code,
y似乎只是为了保持与sklearn的兼容性而存在。请注意,您的示例已有 2 年历史,sklearn集成了自己的 FeatureHasher。y也未使用。简单示例:from sklearn.feature_extraction import FeatureHasher h = FeatureHasher(n_features=15) f = h.fit_transform(df[['country']].to_dict(orient='records')) f.toarray() -
添加更多列对我的示例不起作用(即使使用 n_cols > 基数也会发生冲突),但在我的情况下,同时编码 2 列似乎可以纠正冲突。我试过:
df = pd.DataFrame([_ for _ in 'abcdefghij'],columns=['country'])分组编码的第二列:df['language'] = [_ for _ in 'abcdefghij'[::-1]]
标签: python machine-learning data-science