Scikit learn 通过管道和网格搜索使用交叉值分数拟合嵌套交叉验证

Scikit learn 通过管道和网格搜索使用交叉值分数拟合嵌套交叉验证,scikit-learn,nested,pipeline,cross-validation,grid-search,Scikit Learn,Nested,Pipeline,Cross Validation,Grid Search,我在scikit工作,我正在尝试调整我的XGBoost。 我尝试使用嵌套交叉验证,使用管道重新缩放训练折叠(以避免数据泄漏和过度拟合),并与GridSearchCV并行进行参数调整和交叉验证,以获得最后的roc_auc分数 from imblearn.pipeline import Pipeline from sklearn.model_selection import RepeatedKFold from sklearn.model_selection import GridSearchC

我在scikit工作,我正在尝试调整我的XGBoost。 我尝试使用嵌套交叉验证,使用管道重新缩放训练折叠(以避免数据泄漏和过度拟合),并与GridSearchCV并行进行参数调整和交叉验证,以获得最后的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\u val\u score
与培训数据相匹配

问题2。 既然我在管道中包括了
StandardScaler()
,那么在
cross\u-val\u分数中包括
X\u列
是否有意义,或者我应该使用
X\u列
的标准形式(即
std\u列


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

在嵌套CV中,你估计的不是你可以“拿在手里”的真实估计器的分数,而是描述模型选择过程的不存在的“元估计器”的分数

含义-在每一轮外部交叉验证中(在您的案例中,以交叉分数表示),估计器clf_auc接受内部CV,在外部CV的给定倍数下选择最佳模型。 因此,对于外部CV的每一个倍数,您都要对内部CV选择的不同估计值进行评分

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

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

现在,如果你想在手头有一个真实的模型的情况下完成这个过程,你必须以某种方式选择它(cross_val_score不会帮你)

实现这一点的方法是现在在整个数据上拟合您的内部模型。 履行的含义:

clf_auc.fit(X, y)
现在是了解您在这里所做工作的时候:

  • 您有一个可以使用的模型,该模型适用于所有可用数据
  • 当你被问到“该模型对新数据的概括程度如何?”时,答案是你在嵌套简历中得到的分数——它将模型选择过程作为模型评分的一部分

  • 关于问题#2-如果定标器是管道的一部分,那么没有理由从外部操纵X#U序列

    @ShaharA没有足够的话来感谢你。非常感谢你明确的回答和友好的回复。我非常感谢你花时间提供如此详细的解释。你帮我了解了更多。再次感谢你,伙计!!
    clf_auc.fit(X, y)