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

ina*_*tos 1 pipeline nested scikit-learn cross-validation grid-search

我正在使用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')
Run Code Online (Sandbox Code Playgroud)

问题1.我如何适应cross_val_score训练数据?

问题2。由于我将包含StandardScaler()在管道中,是否应该将包含在内X_traincross_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)
Run Code Online (Sandbox Code Playgroud)

Sha*_*arA 5

您选择了正确的方法来避免嵌套CV时的数据泄漏。

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

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

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

因此,外部简历的分数代表了更高层次的分数:“在合理的模型选择过程中,我选择的模型的推广程度如何”。

现在,如果您想用一个真实的模型来完成此过程,则必须以某种方式选择它(cross_val_score不会为您完成此操作)。

这样做的方法是现在使您的内部模型适合整个数据。执行的含义:

clf_auc.fit(X, y)
Run Code Online (Sandbox Code Playgroud)

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

  1. 您有可以使用的模型,该模型适合所有可用数据。
  2. 当您被问到“该模型在新数据上的推广程度如何?” 答案就是您在嵌套简历中获得的分数-该分数反映了模型选择过程作为模型评分的一部分。

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