sklearn ColumnTransformer:变压器中的重复列

Posted

技术标签:

【中文标题】sklearn ColumnTransformer:变压器中的重复列【英文标题】:sklearn ColumnTransformer: Duplicate columns in transformers 【发布时间】:2020-12-08 01:21:38 【问题描述】:

我正在寻求使用 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 的两列)

【问题讨论】:

【参考方案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")

【讨论】:

以上是关于sklearn ColumnTransformer:变压器中的重复列的主要内容,如果未能解决你的问题,请参考以下文章

sklearn ColumnTransformer:变压器中的重复列

sklearn OneHotEncoder 与 ColumnTransformer 导致稀疏矩阵代替创建假人

sklearn Pipeline:“ColumnTransformer”类型的参数不可迭代

sklearn.compose.ColumnTransformer:fit_transform() 接受 2 个位置参数,但给出了 3 个

Sklearn ColumnTransformer + Pipeline = TypeError

将 FunctionTransformer 与 sklearn Pipeline 和 ColumnTransformer 一起使用 - 错误:无效的类型提升