使用管道和 GridSearch 使用 cross_val_score 进行嵌套交叉验证

Fitting in nested cross-validation with cross_val_score with pipeline and GridSearch

我在 scikit 工作,我正在尝试调整我的 XGBoost。 我尝试使用嵌套交叉验证使用管道重新缩放训练折叠(以避免数据泄漏和过度拟合)并与 GridSearchCV 并行进行参数调整和 cross_val_score 以获得 roc_auc 得分在最后。

from imblearn.pipeline import Pipeline 
from sklearn.model_selection import RepeatedKFold 
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
from xgboost import XGBClassifier


std_scaling = StandardScaler() 
algo = XGBClassifier()

steps = [('std_scaling', StandardScaler()), ('algo', XGBClassifier())]

pipeline = Pipeline(steps)

parameters = {'algo__min_child_weight': [1, 2],
              'algo__subsample': [0.6, 0.9],
              'algo__max_depth': [4, 6],
              'algo__gamma': [0.1, 0.2],
              'algo__learning_rate': [0.05, 0.5, 0.3]}

cv1 = RepeatedKFold(n_splits=2, n_repeats = 5, random_state = 15)

clf_auc = GridSearchCV(pipeline, cv = cv1, param_grid = parameters, scoring = 'roc_auc', n_jobs=-1, return_train_score=False)

cv1 = RepeatedKFold(n_splits=2, n_repeats = 5,  random_state = 15)                       
outer_clf_auc = cross_val_score(clf_auc, X_train, y_train, cv = cv1, scoring = 'roc_auc')

问题一。 如何将 cross_val_score 拟合到训练数据?

问题2。 由于我将 StandardScaler() 包含在管道中,因此将 X_train 包含在 cross_val_score 中是否有意义,或者我应该使用 X_train 的标准化形式(即 std_X_train)?

std_scaler = StandardScaler().fit(X_train)
std_X_train = std_scaler.transform(X_train)
std_X_test = std_scaler.transform(X_test)

您选择了正确的方式来避免您所说的数据泄露 - nested CV.

事情是在嵌套 CV 中你估计的不是你可以 "hold in your hand" 的真实估计器的分数,而是一个不存在的 "meta-estimator" 的分数,它描述了你的模型 select离子过程也是如此。

含义——在每一轮外部交叉验证中(在你的例子中由cross_val_score表示),估计器clf_auc 经过内部 CV,select 是外部 CV 给定折叠下的最佳模型。 因此,对于外部 CV 的每一次折叠,您都会对内部 CV 选择的不同估计量进行评分。

例如,在一个外部 CV 折叠中,模型得分可以是select将参数 algo__min_child_weight 设为 1 的模型,而在另一个select将其编辑为 2 的模型。

因此,外部简历的分数代表更高级别的分数:"under the process of reasonable model selection, how well will my selected model generalize"。

现在,如果你想用手头的真实模型完成这个过程,你必须 select 以某种方式完成(cross_val_score 不会为你这样做)。

这样做的方法是现在将您的内部模型拟合到整个数据上。 意思是执行:

clf_auc.fit(X, y)

现在是了解您在这里所做的事情的时刻:

  1. 您有一个可以使用的模型,该模型适用于所有可用数据。
  2. 当您被问到 "how well does that model generalizes on new data?" 时,答案是您在嵌套 CV 中获得的分数 - 捕获模型 selection 过程作为模型评分的一部分。

关于问题 #2 - 如果缩放器是管道的一部分,则没有理由在外部操作 X_train。