使用 Scikit-Learn 在管道中包含预测器

Posted

技术标签:

【中文标题】使用 Scikit-Learn 在管道中包含预测器【英文标题】:Including a Predictor in a Pipeline with Scikit-Learn 【发布时间】:2021-06-30 10:33:27 【问题描述】:

其实这个疑问更像是——“为什么这段代码能正常工作?”。

我正在从教科书中解决一个问题。具体来说,问题是构建一个具有数据准备阶段(删除 NA 值、执行特征缩放等)和预测阶段的管道,该阶段涉及在转换后的数据集上训练的预测器并返回其预测。

在这里,我们使用了支持向量回归模块 (sklearn.svm.svr)。

我尝试了我的一些代码,但没有成功。于是查了一下教科书作者提供的实际解决方案——

prepare_select_and_predict_pipeline = Pipeline([
    ('preparation', data_prep),
    ('svm_reg', SVR(kernel='rbf',C=30000,gamma='scale'))
])

prepare_select_and_predict_pipeline.fit(x_train,y_train)

some_data = x_train.iloc[:4]
print("Predictions for a subset of Training Set:",prepare_select_and_predict_pipeline.predict(some_data))

我尝试了这段代码,它确实按预期工作。 它如何才能正常工作?我的主要反对意见是:

    我们只有 fit 数据集,但我们实际上在哪里 改造了吗?我们不会在任何地方调用 transform() 函数...

    另外,我们如何在这个管道中使用 predict() 函数? SVR 可能是这条管道的一部分,但其他变压器也是如此, 而且它们没有 predict() 函数。

提前感谢您的回答!

【问题讨论】:

【参考方案1】:

当您在 Pipeline 上执行 fit 时,scikit-learn 在预处理步骤的 fit_transform 和最后一步(分类器|回归器)的 fit 下执行。当您在Pipeline scikit-learn 上调用predict 时,在预处理阶段执行transform,在最后一步执行predict

现在,模型的定义不是最后一步,而是所有接收数据和输出结果的步骤。 Pipeline 现在是一个模型。如果您使用具有 Pipelines 的 GridSearchCV,并且 Pipelines 具有预处理和最终步骤(回归器|分类器),那么 GridSearchCV 现在就是模型。

见Pipeline Documentation

【讨论】:

以上是关于使用 Scikit-Learn 在管道中包含预测器的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn - 将管道预测转换为原始值/比例

特征不匹配:通过 scikit-learn 管道进行预测

如何在 scikit-learn 的管道中对变换参数进行网格搜索

在执行 K 折交叉验证后,我们如何在初始数据集/数据帧中包含预测列?

是否可以将 TransformedTargetRegressor 添加到 scikit-learn 管道中?

如何在 Scikit-learn 的管道中创建我们的自定义特征提取器函数并将其与 countvectorizer 一起使用