【问题标题】:How to specify the parameter for FeatureUnion to let it pass to underlying transformer如何为FeatureUnion指定参数让它传递给底层的transformer
【发布时间】:2023-01-07 23:34:02
【问题描述】:

在我的代码中,我试图访问StandardScalersample_weight。然而,这个StandardScalerPipeline中,而Pipeline又在FeatureUnion中。我似乎无法正确获得此参数名称:scaler_pipeline__scaler__sample_weight 应在预处理器对象的 fit 方法中指定。

我收到以下错误:KeyError: 'scaler_pipeline

这个参数名称应该是什么?或者,如果有更好的方法来执行此操作,请随时提出。

下面的代码是一个独立的例子。

from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.pipeline import Pipeline, FeatureUnion
from sklearn.preprocessing import StandardScaler
import pandas as pd

class ColumnSelector(BaseEstimator, TransformerMixin):
    """Select only specified columns."""

    def __init__(self, columns):
        self.columns = columns

    def fit(self, X, y=None):
        return self

    def transform(self, X):
        return X[self.columns]

    def set_output(self, *, transform=None):
        return self

df = pd.DataFrame({'ds':[1,2,3,4],'y':[1,2,3,4],'a':[1,2,3,4],'b':[1,2,3,4],'c':[1,2,3,4]})
sample_weight=[0,1,1,1]

scaler_pipeline = Pipeline(
    [
        (
            "selector",
            ColumnSelector(['a','b']),
        ),
        ("scaler", StandardScaler()),
    ]
)

remaining_pipeline = Pipeline([("selector", ColumnSelector(["ds","y"]))])

# Featureunion fitting training data
preprocessor = FeatureUnion(
    transformer_list=[
        ("scaler_pipeline", scaler_pipeline),
        ("remaining_pipeline", remaining_pipeline),
    ]
).set_output(transform="pandas")

df_training_transformed = preprocessor.fit_transform(
    df, scaler_pipeline__scaler__sample_weight=sample_weight
)

【问题讨论】:

    标签: python pandas scikit-learn pipeline


    【解决方案1】:

    fit_transform 没有名为 scaler_pipeline__scaler__sample_weight 的参数。

    相反,它期望收到“传递给每个步骤的拟合方法的参数”作为字符串的字典,“其中每个参数名称都带有前缀,使得步骤 s 的参数 p 具有键 s__p”.

    因此,在您的示例中,它应该是:

    df_training_transformed = preprocessor.fit_transform(
        df, {"scaler_pipeline__scaler__sample_weight":sample_weight}
    )
    

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 2012-02-14
      • 2020-02-13
      • 2018-11-15
      • 1970-01-01
      相关资源
      最近更新 更多