使用带有管道和 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 CV 之后进行预测时是不是遵循管道步骤