在 Scikit 中使用 Column Transformer 预处理带有目标变量的训练和测试数据

Using Column Transformer in Scikit to preprocess train and test data with target variable

我在使用 columntransformer 对整个数据集进行预处理时遇到问题 - 也许您可以提供帮助:

首先,我读入了我的数据集:

X_train, X_test, y_train, y_test = train_test_split(df, target, test_size=0.2, random_state=seed)

然后我进行预处理:

preprocessor = ColumnTransformer(
    transformers=
    [
        ("col_drop", "drop",["col1","col2",]),
        ('enc_1', BinaryEncoder(), ["Bank"]),
        ('enc_2', OneHotEncoder(), ["Chair"]),
        ('log', FunctionTransformer(np.log1p, validate=False), log_features),
        ('log_p', FunctionTransformer(np.log1p, validate=False), ["target_y]),
        ('pow', PowerTransformer(method="yeo-johnson"), pow_features)
      
    ],
     remainder='passthrough',n_jobs=-1)

然后我用预处理器调用管道:

pipe.fit_transform(X_train, y_train)

这会产生错误:给定的列不是数据框的列

这在某种程度上是有意义的,因为我使用预处理器在 target_y,这基本上是我的目标特征,仅存在于 y_train 和 y_test 中。 我认为这是导致错误的原因,因为目标不在 X_train.

问题:是否可以一次预处理 X 和 y,或者是否必须使用另一个 columntransformer/pipeline 作为我的 y 值?请问有什么好的解决办法吗?

通常,一个为特征做管道,另一个为目标值做管道。

您不能在 ColumnTransformerPipeline 中预处理目标(除非您计划将它们与自变量放在一起,然后再将它们分开);但是,有 TransformedTargetRegressor (docs) 用于此用例。