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()
方法。
我对 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()
方法。