应该使用诸如StandardScaler之类的数据预处理器来fit_transform训练集,而仅转换(不适合)测试集。我希望相同的拟合/变换过程适用于交叉验证以调整模型。然而,我发现cross_val_score和GridSearchCVfit_transform整个列车组与预处理器(而不是fit_transform的inner_train集,改造inner_validation集)。我相信这可以人为地从inner_validation集中删除方差,从而使cv得分(用于通过GridSearch选择最佳模型的度量)出现偏差。这是一个问题还是我实际上错过了任何事情?
为了演示上述问题,我使用Kaggle的乳腺癌威斯康星州(诊断)数据集尝试了以下三个简单的测试案例。
StandardScaler()X_sc = StandardScaler().fit_transform(X)
lr = LogisticRegression(penalty='l2', random_state=42)
cross_val_score(lr, X_sc, y, cv=5)
Run Code Online (Sandbox Code Playgroud)
Pipeline并运行cross_val_scorepipe = Pipeline([
('sc', StandardScaler()),
('lr', LogisticRegression(penalty='l2', random_state=42))
])
cross_val_score(pipe, X, y, cv=5)
Run Code Online (Sandbox Code Playgroud)
GridSearchCVpipe = Pipeline([
('sc', StandardScaler()),
('lr', LogisticRegression(random_state=42))
])
params = {
'lr__penalty': ['l2']
}
gs=GridSearchCV(pipe,
param_grid=params, cv=5).fit(X, y)
gs.cv_results_
Run Code Online (Sandbox Code Playgroud)
它们都产生相同的验证分数。[0.9826087、0.97391304、0.97345133、0.97345133、0.99115044]
pipeline machine-learning scikit-learn cross-validation grid-search