我正在使用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()
,所以在X_train
中包含cross_val_score
还是有意义的,还是应该使用X_train
的标准化形式(即{{1 }})?
std_X_train
答案 0 :(得分:5)
您选择了避免数据泄漏的正确方法-嵌套简历。
在嵌套的简历中,您估计的不是您可以“掌握”的真实估计器的得分,而是不存在的“元估计器”的得分,该得分也描述了模型选择过程。 / p>
含义-在外部交叉验证的每一轮中(在您的情况下,以 cross_val_score 表示),估算器 clf_auc 均经过内部CV验证,该CV选择给定条件下的最佳模型外部简历的倍数。 因此,对于外部CV的每一折,您都会为内部CV选择的估算器评分。
例如,在一个外部CV折叠中,评分模型可以是将参数 algo__min_child_weight 选择为1的模型,而在另一个模型中将参数选择为2的模型。
因此,外部简历的得分代表了更高层次的得分:“在合理的模型选择过程中,我选择的模型将得到多大的概括”。
现在,如果您想用一个真实的模型来完成此过程,则必须以某种方式选择它(cross_val_score不会为您完成此操作)。
这样做的方法是使您的内部模型适合整个数据。 执行的意义:
clf_auc.fit(X, y)
现在是时候了解您在这里所做的事情:
关于问题2-如果缩放器是管道的一部分,则没有理由在外部操纵X_train。