我最近开始学习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.]])