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

我最近开始学习Python,以便为一个研究项目开发一个预测模型,使用机器学习方法。我有一个包含数值和分类数据的大型数据集。数据集中有很多缺失值。我目前正在尝试使用OneHotEncoder对分类特征进行编码。当我阅读关于OneHotEncoder的内容时,我的理解是,对于缺失值(NaN),OneHotEncoder会为该特征的所有类别分配0s,如下所示:

0     Male 1     Female2     NaN

在应用OneHotEncoder后:

0     10 1     012     00

然而,当我运行以下代码时:

    # 编码分类数据    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: Input contains NaN

所以我猜想我之前对OneHotEncoder如何处理缺失值的理解是错误的。有没有办法让我获得上述描述的功能?我知道在编码之前填补缺失值可以解决这个问题,但我对此不太愿意,因为我处理的是医疗数据,我担心填补可能会降低我的模型的预测准确性。

我找到了一个问题,与此类似,但答案没有提供足够详细的解决方案来处理NaN值。

请告诉我你的想法,谢谢。


回答:

你需要先填补缺失值。你可以定义一个Pipeline,使用SimpleImputer设置constant策略来填补一个新的类别到空字段,然后进行OneHot编码:

from sklearn.compose import ColumnTransformerfrom sklearn.preprocessing import OneHotEncoderfrom sklearn.impute import SimpleImputerfrom sklearn.pipeline import Pipelineimport numpy as npcategorical_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.]])

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注