sklearn.compose.make_column_transformer:在一个数据帧列上一步使用SimpleImputer和OneHotEncoder

问题描述

我有一个数据框,其中包含带有分类变量的列,其中还包含NaN。

  Category
1 A
2 A
3 Na
4 B

我想使用sklearn.compose.make_column_transformer()以干净的方式准备df。我试图使用以下代码来估算nan值和OneHotEncode列:

from sklearn.preprocessing import OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.compose import make_column_transformer

transformer= make_column_transformer(
    (SimpleImputer(missing_values=np.nan,strategy='most_frequent'),['Category']),(OneHotEncoder(sparse=False),['Category'])
)

根据我的训练数据运行变压器会提高

ValueError:输入包含NaN

transformer.fit(X_train)
X_train_trans = transformer.transform(X_train)

所需的输出将是这样的:

  A B
1 1 0
2 1 0
3 1 0
4 0 1

这引发了两个问题:

  1. 转换器是根据原始数据还是按照我在转换器中引入的顺序并行计算SimpleImputerOneHotEncoder

  2. 如何更改代码,以使OneHotEncoder获得估算值作为输入?我知道我可以通过两个不同的步骤用熊猫在变压器外部解决问题,但我希望代码采用简洁的管道格式

解决方法

您应该使用sklearn Pipeline依次应用一系列转换

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

s = pd.DataFrame(data={'Category': ['A','A',np.nan,'B']})

category_pipeline = Pipeline(steps=[
    ('imputer',SimpleImputer(missing_values=np.nan,strategy='most_frequent')),('ohe',OneHotEncoder(sparse=False))
    ]
)

transformer = ColumnTransformer(transformers=[
    ('category',category_pipeline,['Category'])
    ],)

transformer.fit_transform(s)
array([[1.,0.],[1.,[0.,1.]])