【问题标题】:sklearn.compose.make_column_transformer(): using SimpleImputer() and OneHotEncoder() in one step on one dataframe columnsklearn.compose.make_column_transformer():在一个数据帧列上一步使用 SimpleImputer() 和 OneHotEncoder()
【发布时间】:2021-01-09 11:06:28
【问题描述】:

我有一个数据框,其中包含一个包含分类变量的列,其中还包括 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 将估算值作为输入?我知道我可以用 pandas 在变压器之外通过两个不同的步骤解决它,但我希望代码采用干净的管道格式

【问题讨论】:

    标签: python scikit-learn pipeline one-hot-encoding imputation


    【解决方案1】:

    您应该使用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., 0.],
           [0., 1.]])
    

    【讨论】:

      猜你喜欢
      • 2020-10-06
      • 2016-07-24
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多