Sklearn:是不是可以在 OneHotEncoder 中为未知类别指定 null 或 NaN 值?

Posted

技术标签:

【中文标题】Sklearn:是不是可以在 OneHotEncoder 中为未知类别指定 null 或 NaN 值?【英文标题】:Sklearn: is it possible to specify null or NaN values for unknown categories in OneHotEncoder?Sklearn:是否可以在 OneHotEncoder 中为未知类别指定 null 或 NaN 值? 【发布时间】:2021-06-26 23:57:06 【问题描述】:

我正在使用混合分类变量和数值变量的数据集。有很多缺失的数据,因此,我希望通过分类器做一些插补。我目前正在使用来自impyute.imputation.csfast_knnfast_knn 是一个易于使用的函数,它使用 kNN 模型填充缺失值。

我希望将numpy 数组传递给fast_knn,其中包含分类变量的一个热编码,np.nan 用于缺失的值,与来自数字属性的数据混合(也与np.nan 用于缺失值)。

困难在于确保在将分类数据转换为一种热编码后缺失值显而易见。 如何将分类数据转换为一种热编码,以便缺失值导致np.nan(而不是一种热编码)?我已经为此苦苦挣扎了一段时间——我很尴尬来自scikitOneHotEncoder 的印象是为缺失值放置0 填充数组,但我不认为这是正确的。

我想用一个一次性的例子。假设我有一个包含三个特征的数据集,两个分类和一个数字。这是我想要的最终结构的示例。前两个特征是分类的,第三个是数字的:

#np.nan is in place for any missing value. 

[
[[0, 0], [0, 1], [1, 0], [1, 1], np.nan],
[[0, 0, 0], [0, 0, 1], [1, 0, 1], [1, 1, 1], np.nan] #Suppose this category has 8 possible values the attribute can take on. 
[1, 3, np.nan, 3, 5]
]

fast_knn 会在有np.nan 的地方进行估算。

我希望我的问题很清楚。请记住,分类子集非常大 - 145000 行 x 5 列。最好不要做一些计算成本很高的事情。我希望有一种技术,除了将缺失值指定为分类属性可以采用的另一种值,然后迭代一个热编码以将其改回np.nan

【问题讨论】:

您能否详细说明为未知类别估算缺失值的原因? @Miguel Trejo 谢谢你这么好的回答。通过估算缺失值,我可以获得一个完整的数据集——这将使我能够进行预测。看起来我遇到了另一个错误:ValueError: setting an array element with a sequence. 我认为这个错误是因为数据集包含一个热编码和数值(对于数字数据)的混合。我希望避免使用序数或标签编码,以避免强加不必要的方向性。我已经制作了一个热门编码,并将通过 PCA 进行降维以保持一切整洁。 【参考方案1】:

1。一个热编码器(不支持未知值的 np.nan)

如果您想使用一种热编码方法,OneHotEncoder 确实为未知值设置了一个零数组,例如

from sklearn.preprocessing import OneHotEncoder
import numpy as np
import pandas as pd

enc = OneHotEncoder(handle_unknown='ignore', sparse=False)
s = pd.Series(list('abca'))

enc.fit(s.values.reshape(-1, 1))

t = enc.transform(np.array(['a', 'c', 'Other', 'b', 'Another']).reshape(-1, 1))
t
>>>
array([[1., 0., 0.],
       [0., 0., 1.],
       [0., 0., 0.],
       [0., 1., 0.],
       [0., 0., 0.]])

未知类别OtherAnother 是零数组。替换t中的所有零数组

zero_cond = (t == 0).all(axis=1)
t[zero_cond] = np.nan
t
>>> 
array([[ 1.,  0.,  0.],
       [ 0.,  0.,  1.],
       [nan, nan, nan],
       [ 0.,  1.,  0.],
       [nan, nan, nan]])

您现在可以将其传递给 imputer。

2。 Ordinal Encoder(未知值可以设置为np.nan)

为未知变量设置Nan 的另一个处理分类变量的选项是OrdinalEncoder(自 scikit-learn 版本 0.24 起)

from sklearn.preprocessing import OrdinalEncoder
enc = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=np.nan)

enc.fit(s.values.reshape(-1, 1))

enc.transform(np.array(['a', 'c', 'Other', 'b', 'Another']).reshape(-1, 1))
>>>
array([[ 0.],
       [ 2.],
       [nan],
       [ 1.],
       [nan]])

【讨论】:

以上是关于Sklearn:是不是可以在 OneHotEncoder 中为未知类别指定 null 或 NaN 值?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn,DecisionTreeRegressor:我可以优先考虑一列数据而不是其他列吗?

克隆实验是不是适用于 sklearn 函数?

用Python,在 import sklearn 总是报错怎么办

Sklearn 决策树分类器显示浮点错误 Python [不是重复的]

sklearn 是不是支持动态数据的特征选择?

sklearn中LinearRegression关键源码解读