使用scikit学习OneHotEncoder时如何处理分类数据中的缺失值(NaN)?

时间:2020-06-16 13:09:16

标签: python machine-learning scikit-learn

我最近开始学习python,以使用机器学习方法为研究项目开发预测模型。我有一个包含数字和分类数据的大型数据集。数据集有很多缺失值。我目前正在尝试使用OneHotEncoder对分类功能进行编码。当我读到有关OneHotEncoder的信息时,我的理解是对于缺少的值(NaN),OneHotEncoder会将0分配给所有功能类别,例如:

0     Male 
1     Female
2     NaN

应用OneHotEncoder后:

0     10 
1     01
2     00

但是,在运行以下代码时:

    # Encoding categorical data
    from sklearn.compose import ColumnTransformer
    from sklearn.preprocessing import OneHotEncoder


    ct = ColumnTransformer([('encoder', OneHotEncoder(handle_unknown='ignore'), [1])],
                           remainder='passthrough')
    obj_df = np.array(ct.fit_transform(obj_df))
    print(obj_df)

我收到错误 ValueError:输入包含NaN

所以我想我以前对OneHotEncoder如何处理缺失值的理解是错误的。 有没有办法让我获得上述功能?我知道在编码之前对缺失值进行插值会解决此问题,但是由于我正在处理医学数据,因此我不愿意这样做,并且担心插值会降低模型的预测准确性。

我发现这个question很相似,但是答案没有提供有关如何处理NaN值的足够详细的解决方案。

谢谢,让我知道你的想法。

2 个答案:

答案 0 :(得分:3)

您需要先估算缺失的值。您可以在OneHot编码之前,使用Pipeline设置most_frequent策略,通过插补步骤来定义SimpleImputer

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('encoder', OneHotEncoder(handle_unknown='ignore'))])

preprocessor = ColumnTransformer(
    transformers=[
        ('cat', categorical_transformer, [0])
    ])

df = pd.DataFrame(['Male', 'Female', np.nan])
preprocessor.fit_transform(df)
array([[0., 1.],
       [1., 0.],
       [1., 0.]])

答案 1 :(得分:1)

  1. 使用“其他”更改 NaN值
  2. 然后继续进行一键编码
  3. 然后可以删除“其他”列。