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