sklearn.cross_validation.cross_val_score "cv" 参数问题

数据挖掘 Python scikit-学习 交叉验证
2022-03-05 13:44:56

我正在阅读 Kaggle 上关于泰坦尼克号灾难的教程,根据我使用的细节,我得到了不同的结果cross_validation.cross_val_score

如果我这样称呼它:

scores = cross_validation.cross_val_score(alg, titanic[predictors], titanic["Survived"], cv=3)

print(scores.mean())

0.801346801347

我得到的分数与我这样称呼它不同:

kf = KFold(titanic.shape[0], n_folds=3, random_state=1)

scores = cross_validation.cross_val_score(alg, titanic[predictors], titanic["Survived"], cv=kf)

print(scores.mean())

0.785634118967

这些数字很接近,但差异足以显着。据我了解,这两个代码片段都要求采用 3 折交叉验证策略。谁能解释导致分数略低的第二个示例的幕后情况?

2个回答

来自 sklearn文档cross_val_scorecv 参数:

对于 int/None 输入,如果估计器是分类器并且 y 是二元或多类,则使用 StratifiedKFold。在所有其他情况下,使用 KFold。

我相信在第一种情况下,StratifiedKFold被用作默认值。在第二种情况下,您明确传递了一个KFold生成器。

两者之间的区别也记录在docs中。

KFold将所有样本分成组样本,称为折叠(如果 ,这相当于留一个策略),大小相等(如果可能)。kk=n

[...]

StratifiedKFoldk-fold返回 stratified折叠的变体:每个集合包含的每个目标类的样本百分比与完整集合大致相同。

这种折叠的差异是导致分数差异的原因。

作为旁注,我注意到您正在将random_state参数传递给KFold对象。但是,您应该注意,仅当您还将KFold的 shuffle 参数设置为 时才使用此种子True,默认情况下为False.

正如@Reii Nakano 所提到的,如果我们的估计器是分类器并且您的是二进制将被使用,否则将被使用。YStratifiedKFoldKFold

这里还有一个有趣的部分是你正在使用random_state = 1in KFold因此,在 的情况下拆分的数据KFold不一定Splitscross_val_score.
因此,您的最终分数可能会有所不同。