【发布时间】:2021-10-06 16:22:47
【问题描述】:
我对 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()是在哪里发生的呢?
【问题讨论】:
标签: python machine-learning scikit-learn grid-search gridsearchcv