Scikit GridSearchCV – fit()和predict()如何与ColumnTransformers和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(),目标编码器和缩放器被拟合到训练集上,但它们从未被转换过,所以数据从未改变。GridSearch如何基于未转换的训练集计算分数?

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

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


回答:

在调用管道的predict()函数时,数据转换是隐式应用的。这在文档中已明确提及:

对数据应用转换,并使用最终的估计器进行预测

因此,无需显式地转换数据。在最终估计器进行预测之前,会自动完成。也没有数据泄露,因为管道在对数据应用predict()时会调用每一步的transform()方法。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注