【问题标题】:sklearn ColumnTransformer: Duplicate columns in transformerssklearn ColumnTransformer:变压器中的重复列
【发布时间】:2023-03-18 08:01:01
【问题描述】:

我正在寻求使用 sklearn 的 ColumnTransformer 函数构建数据预处理管道的帮助。

目前我的管道看起来像这样:

from scipy.stats.mstats import winsorize 
from sklearn.compose import ColumnTransformer 
from sklearn.impute import SimpleImputer

ColumnTransformer(remainder='passthrough',
                  transformers=[
                              ('Winsorize', FunctionTransformer(winsorize,
                                                     kw_args={'axis': 0, 'inplace': False, 'limits': [0, 0.01]}), ['feat_1','feat_2']),
                                ('num_impute', SimpleImputer(strategy='median'), ['feat_3', 'feat_4']),
                                ])

请注意,每个转换器都提供了一组独特的功能。

我遇到的问题是如何对相同的特征应用堆叠分析。例如,

ColumnTransformer(remainder='passthrough',
                  transformers=[
                              ('Winsorize', FunctionTransformer(winsorize,
                                                     kw_args={'axis': 0, 'inplace': False, 'limits': [0, 0.01]}), ['feat_1','feat_2']),
                                ('num_impute', SimpleImputer(strategy='median'), ['feat_1', 'feat_2', 'feat_3']),
                                ])

请注意,两个转换器都提供了 feat_1 和 feat_2。

这样的管道将为 feat_1 和 feat_2 创建重复的列(基于 Winsorize 的两列,基于 num_impute 的两列)

【问题讨论】:

    标签: python scikit-learn pipeline


    【解决方案1】:

    据我了解,您可以使用两个ColumnTransformer 和一个FeatureUnion 来实现您想要的。一个ColumnTransformer 将具有remainder='passthrough' 以保留除正在转换的列之外的所有列,而另一个将具有remainder='drop'。可能看起来像这样:

    from sklearn.pipeline import FeatureUnion
    
    ct1 = ColumnTransformer(
        remainder='passthrough',
        transformers=[(
            'Winsorize', FunctionTransformer(
                winsorize,
                kw_args={'axis': 0, 'inplace': False, 'limits': [0, 0.01]}
            ), 
            ['feat_1', 'feat_2']
        )]
    )
    
    ct2 = ColumnTransformer(
        remainder='drop',
        transformers=[('num_impute', SimpleImputer(strategy='median'), ['feat_1', 'feat_2', 'feat_3'])],
    )
    
    union = FeatureUnion([('ct1', ct1), ('ct2', ct2)])
    

    【讨论】:

    • per sklearn doc:“FeatureUnion 获取一个转换器对象列表。在拟合期间,每个对象都独立地拟合数据。转换器并行应用,它们输出的特征矩阵被连接起来并排成一个更大的矩阵”看起来这将连接转换而不是应用在一个系列中
    • 哦,好的,您想在winsorize 步骤之后进行估算?
    • 你是对的。
    【解决方案2】:

    如果您需要对列应用多个转换,您可以使用Pipeline 作为每个列集的转换器。

    from sklearn.pipeline import Pipeline
    from sklearn.compose import ColumnTransformer
    
    imputer = SimpleImputer(strategy="median")
    winsorize = FunctionTransformer(
      winsorize, kw_args={"axis": 0, "inplace": False, "limits": [0, 0.01]})
    
    ColumnTransformer([
      ("F1,F2", Pipeline([
        ("Winsorize", winsorize),
        ("Impute", imputer)
      ]), ["feat_1","feat_2"]),
      ("F3", imputer, ["feat_3"])
    ], remainder="passthrough")
    

    【讨论】:

      猜你喜欢
      • 2022-10-04
      • 2021-06-17
      • 2020-06-30
      • 2021-03-18
      • 2020-04-02
      • 2019-07-09
      • 2019-10-26
      • 2021-02-10
      相关资源
      最近更新 更多