Scikit GridSearchCV - fit() 和 predict() 如何与 ColumnTranformers 和 Pipelines 一起工作

Scikit GridSearchCV - How does fit() and predict() work in conjunction with ColumnTranformers and Pipelines

我对 GridSearchCV 的实际工作方式有点困惑,所以让我们想象一个任意的回归问题,我想在其中预测房屋的价格:

假设我们使用一个简单的预处理器,对训练集进行目标编码: 目标编码器应在 X_train 上调用 fit_transform() 并在 X_test 上调用 transform() 以防止数据泄漏。

preprocessor = ColumnTransformer(
    transformers=
    [      
        ('encoded_target_price', TargetEncoder(), ["Zipcodes"]),  
    ],
     remainder='passthrough',n_jobs=-1)

我们使用一些具有缩放功能的管道,缩放器应该再次针对 训练和测试集。

pipe = Pipeline(steps=[("preprocessor", preprocessor),
                       ("scaler", RobustScaler()),
                       ('clf', LinearSVR()),
                      ])

使用一些任意参数初始化 GridSearch:

gscv = GridSearchCV(estimator = pipe, 
                    param_grid = tuned_parameters,                
                    cv = kfold,                                   
                    n_jobs = -1,
                    random_state=seed
                    )

现在我们可以调用 gscv.fit(X_train, ytrain)gscv.predict(X_test)

我不明白这是如何工作的。例如通过调用 fit() 目标编码器 和 Scaler 适合训练集,但它们从未被转换,因此数据永远不会改变。 GridSearch 如何根据未转换的训练集计算分数?

predict方法我完全不懂。如果不将 preprocessor 的转换应用到测试集 X_test,如何进行预测?我的意思是当我在训练集上做一些大的转换,比如缩放、编码等时,它们也必须在测试集上完成吗?

但是Gridsearch内部只调用了best_estimator_.predict(),那么测试集上的.transform()发生在哪里呢?

调用管道的 predict() 函数时隐式应用数据转换。 documentation:

中明确提到

Apply transforms to the data, and predict with the final estimator

因此无需显式转换数据。它会在最终估算器做出预测之前自动完成。也没有数据泄漏,因为在将 predict() 应用于数据时,管道将调用每个步骤的 transform() 方法。