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

2024-03-15

我最近开始学习 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 https://stackoverflow.com/questions/58222008/nan-giving-valueerror-in-onehotencoder-in-scikit-learn这是类似的,但答案没有提供关于如何处理 NaN 值的足够详细的解决方案。

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


您需要先估算缺失值。您可以定义一个Pipeline https://scikit-learn.org/stable/modules/generated/sklearn.pipeline.Pipeline.html使用插补步骤SimpleImputer https://scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html设置一个constant在 OneHot 编码之前为空字段输入新类别的策略:

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

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., 0.],
       [1., 0., 0.],
       [0., 0., 1.]])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 scikit-learn OneHotEncoder 时如何处理分类数据中的缺失值 (NaN)? 的相关文章

随机推荐