传递 sklearn 管道中的所有列

passthrough all columns in sklearn pipeline

我正在尝试将 PCA 的结果加入到原始特征中,为此我尝试了 PCA 的 FeatureUnion 和一个列变换器,它只是 passthrough 所有列

feature_selector = FeatureUnion(
    [
        ("original", make_column_transformer(('drop', []), reminder='passthrough'),
        ("pca", PCA())
    ])
my_pipeline = make_pipeline(preprocessor, feature_selector, model)

但这似乎有点违反直觉。
有没有更清洁的方法来做到这一点?也许是 select 或 select 所有列而不是列转换器的功能?

我认为也许最简洁的方法是使用 FunctionTransformer。请特别注意,参数 func 的默认值为您提供了一个“身份转换器”:

[...] If func is None, then func will be the identity function.

为了添加,我找到了另一种方法。
简单地使用 make_pipeline('passthrough') 并且此代码按预期工作

feature_selector = FeatureUnion(
    [
        ("original", make_pipeline('passthrough'),
        ("pca", PCA())
    ])
my_pipeline = make_pipeline(preprocessor, feature_selector, model)

这是另一种方法,只使用 ColumnTransformer。这里的主要丑陋之处(IMO)是选择每个变压器中的所有列;有很多方法可以指定它,但到目前为止最干净的似乎是 blank/default make_column_selector.

ColumnTransformer([
    ('pass', "passthrough", make_column_selector()),
    ('pca', PCA(), make_column_selector()),
])