使用管道和 GridSearch 使用 cross_val_score 进行嵌套交叉验证
Fitting in nested cross-validation with cross_val_score with pipeline and GridSearch
我在 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')
问题一。
如何将 cross_val_score
拟合到训练数据?
问题2。
由于我将 StandardScaler()
包含在管道中,因此将 X_train
包含在 cross_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)
您选择了正确的方式来避免您所说的数据泄露 - nested CV.
事情是在嵌套 CV 中你估计的不是你可以 "hold in your hand" 的真实估计器的分数,而是一个不存在的 "meta-estimator" 的分数,它描述了你的模型 select离子过程也是如此。
含义——在每一轮外部交叉验证中(在你的例子中由cross_val_score表示),估计器clf_auc 经过内部 CV,select 是外部 CV 给定折叠下的最佳模型。
因此,对于外部 CV 的每一次折叠,您都会对内部 CV 选择的不同估计量进行评分。
例如,在一个外部 CV 折叠中,模型得分可以是select将参数 algo__min_child_weight 设为 1 的模型,而在另一个select将其编辑为 2 的模型。
因此,外部简历的分数代表更高级别的分数:"under the process of reasonable model selection, how well will my selected model generalize"。
现在,如果你想用手头的真实模型完成这个过程,你必须 select 以某种方式完成(cross_val_score 不会为你这样做)。
这样做的方法是现在将您的内部模型拟合到整个数据上。
意思是执行:
clf_auc.fit(X, y)
现在是了解您在这里所做的事情的时刻:
- 您有一个可以使用的模型,该模型适用于所有可用数据。
- 当您被问到 "how well does that model generalizes on new data?" 时,答案是您在嵌套 CV 中获得的分数 - 捕获模型 selection 过程作为模型评分的一部分。
关于问题 #2 - 如果缩放器是管道的一部分,则没有理由在外部操作 X_train。
我在 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')
问题一。
如何将 cross_val_score
拟合到训练数据?
问题2。
由于我将 StandardScaler()
包含在管道中,因此将 X_train
包含在 cross_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)
您选择了正确的方式来避免您所说的数据泄露 - nested CV.
事情是在嵌套 CV 中你估计的不是你可以 "hold in your hand" 的真实估计器的分数,而是一个不存在的 "meta-estimator" 的分数,它描述了你的模型 select离子过程也是如此。
含义——在每一轮外部交叉验证中(在你的例子中由cross_val_score表示),估计器clf_auc 经过内部 CV,select 是外部 CV 给定折叠下的最佳模型。 因此,对于外部 CV 的每一次折叠,您都会对内部 CV 选择的不同估计量进行评分。
例如,在一个外部 CV 折叠中,模型得分可以是select将参数 algo__min_child_weight 设为 1 的模型,而在另一个select将其编辑为 2 的模型。
因此,外部简历的分数代表更高级别的分数:"under the process of reasonable model selection, how well will my selected model generalize"。
现在,如果你想用手头的真实模型完成这个过程,你必须 select 以某种方式完成(cross_val_score 不会为你这样做)。
这样做的方法是现在将您的内部模型拟合到整个数据上。 意思是执行:
clf_auc.fit(X, y)
现在是了解您在这里所做的事情的时刻:
- 您有一个可以使用的模型,该模型适用于所有可用数据。
- 当您被问到 "how well does that model generalizes on new data?" 时,答案是您在嵌套 CV 中获得的分数 - 捕获模型 selection 过程作为模型评分的一部分。
关于问题 #2 - 如果缩放器是管道的一部分,则没有理由在外部操作 X_train。