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

Posted

技术标签:

【中文标题】使用带有管道和 GridSearch 的 cross_val_score 进行嵌套交叉验证【英文标题】:Fitting in nested cross-validation with cross_val_score with pipeline and GridSearch 【发布时间】:2019-02-07 20:53:03 【问题描述】:

我在 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')

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

问题2。 由于我在管道中包含了StandardScaler(),因此在cross_val_score 中包含X_train 是否有意义,或者我应该使用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)

【问题讨论】:

【参考方案1】:

正如您所说,您选择了正确的方法来避免数据泄漏 - 嵌套 CV

在嵌套的 CV 中,您估计的不是您可以“握在手中”的真实估计器的分数,而是一个不存在的“元估计器”,它也描述了您的模型选择过程。

含义 - 在外部交叉验证的每一轮中(在您的情况下由 cross_val_score 表示),估计器 clf_auc 经历内部 CV,在给定条件下选择最佳模型外部 CV 的折叠。 因此,对于外部 CV 的每一折,您都在为内部 CV 选择的不同估算器打分。

例如,在一个外部 CV 折叠中,得分的模型可以是选择参数 algo__min_child_weight 为 1 的模型,而在另一个模型中选择参数为 2。

因此外部CV的分数代表了更高层次的分数:“在合理的模型选择过程下,我选择的模型将如何泛化”。

现在,如果你想用一个真实的模型完成这个过程,你必须以某种方式选择它(cross_val_score 不会为你做这件事)。

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

clf_auc.fit(X, y)

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

    您有一个可以使用的模型,该模型适用于所有可用数据。 当您被问到“该模型对新数据的泛化效果如何?”时答案是您在嵌套 CV 中获得的分数 - 它将模型选择过程记录为模型评分的一部分。

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

【讨论】:

@ShaharA 没有足够的话语来感谢你。非常感谢您的明确回答和您的友好回应。我非常感谢您花时间提供如此详尽的解释。你让我明白了更多。非常感谢再次男人!

以上是关于使用带有管道和 GridSearch 的 cross_val_score 进行嵌套交叉验证的主要内容,如果未能解决你的问题,请参考以下文章

在管道/gridSearch 中使用 TFI/DF 和 CountVectorizer

最佳模型的 GridSearch:保存和加载参数

在 GridSearch CV 之后进行预测时是不是遵循管道步骤

在小数据集上使用 GridSearch 并在大数据集上应用结果是个好主意吗?

使用 Gridsearch 进行 RFE 排名

在管道中运行 GridSearch 后提取 best_params