作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用非常稀疏标记的数据进行机器学习项目。有几个分类特征,导致特征之间大约有一百个不同的类别。
例如:
0 red
1 blue
2 <missing>
color_cat = pd.DataFrame(['red', 'blue', np.NAN])
color_enc = OneHotEncoder(sparse=True, handle_unknown='ignore')
color_one_hot = color_enc.fit_transform(color_cat)
在我将这些通过 scikit 的 OneHotEncoder
后,我期望丢失的数据被编码为 00
,因为文档声明 handle_unknown='ignore'
使编码器返回一个全零数组。用 [SimpleImputer][1]
替换另一个值对我来说不是一个选项。
我的期望:
0 10
1 01
2 00
相反,OneHotEncoder
将缺失值视为另一个类别。
我得到的:
0 100
1 010
2 001
我看到了相关问题:How to handle missing values (NaN) in categorical data when using scikit-learn OneHotEncoder?但是解决方案对我不起作用。我明确要求零向量。
最佳答案
从未真正使用过稀疏矩阵,但一种方法是删除与您的 nan
值对应的列。从您的模型中获取 categories_
并在不是 nan
的地方创建一个 bool 掩码(我使用 pd.Series.notna
但可能是其他方式)并创建一个新的(或重新分配)稀疏矩阵。基本上添加到您的代码中:
# currently you have
color_one_hot
# <3x3 sparse matrix of type '<class 'numpy.float64'>'
# with 3 stored elements in Compressed Sparse Row format>
# line of code to add
new_color_one_hot = color_one_hot[:,pd.Series(color_enc.categories_[0]).notna().to_numpy()]
# and now you have
new_color_one_hot
# <3x2 sparse matrix of type '<class 'numpy.float64'>'
# with 2 stored elements in Compressed Sparse Row format>
# and
new_color_one_hot.todense()
# matrix([[0., 1.],
# [1., 0.],
# [0., 0.]])
编辑:get_dummies
也给出类似的结果 pd.get_dummies(color_cat[0], sparse=True)
编辑:仔细查看后,您可以在 OneHotEncoder
中指定参数 categories
,所以如果您这样做:
color_cat = pd.DataFrame(['red', 'blue', np.nan])
color_enc = OneHotEncoder(categories=[color_cat[0].dropna().unique()], ## here
sparse=True, handle_unknown='ignore')
color_one_hot = color_enc.fit_transform(color_cat)
color_one_hot.todense()
# matrix([[1., 0.],
# [0., 1.],
# [0., 0.]])
关于python - 缺失的分类数据应使用全零单热向量进行编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71054166/
我是一名优秀的程序员,十分优秀!