我最近开始学习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值的足够详细的解决方案。
谢谢,让我知道你的想法。
答案 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)