【问题标题】:Fitting in nested cross-validation with cross_val_score with pipeline and GridSearch使用带有管道和 GridSearch 的 cross_val_score 进行嵌套交叉验证
【发布时间】: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)

【问题讨论】:

    标签: scikit-learn nested pipeline cross-validation grid-search


    【解决方案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)
    

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

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

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

    【讨论】:

    • @ShaharA 没有足够的话语来感谢你。非常感谢您的明确回答和您的友好回应。我非常感谢您花时间提供如此详尽的解释。你让我明白了更多。非常感谢再次男人!
    猜你喜欢
    • 2021-05-14
    • 2020-03-07
    • 2022-10-04
    • 1970-01-01
    • 2017-12-22
    • 2020-10-28
    • 2016-11-15
    • 2017-03-16
    • 2012-10-14
    相关资源
    最近更新 更多