cross_val_score 与 sklearn 中的不同分类器的行为不同

Posted

技术标签:

【中文标题】cross_val_score 与 sklearn 中的不同分类器的行为不同【英文标题】:cross_val_score behaves differently with different classifiers in sklearn 【发布时间】:2020-08-25 22:37:06 【问题描述】:

我在sklearn 中使用cross_val_score() 时遇到了一些困难。

我已经使用以下代码实例化了KNeighborsClassifier

clf = KNeighborsClassifier(n_neighbors=28)

然后我使用交叉验证来了解此分类器在我的 df 特征 (x) 和目标系列 (y) 上的准确性,具体如下:

cv_score_av = np.mean(cross_val_score(clf, x, y, cv=5))

每次我运行脚本时,我都希望获得不同的结果,但是没有设置random_state=None 的选项,例如RandomForestClassifier()。有没有办法在每次运行时获得不同的结果,或者在我的 KNeighborsClassifier 模型上运行 cross_val_score 之前,我必须手动随机打乱我的数据。

【问题讨论】:

【参考方案1】:

您似乎对此有一些误解;随机森林中的 random_state 参数是指算法本身,而不是交叉验证部分。这样的论点在这里是必要的,因为 RF 确实在模型构建中包含了一些随机性(实际上,其中有很多,正如算法的名称所暗示的那样);但是 knn 相比之下,是一种确定性算法,所以原则上它不需要使用任何random_state

也就是说,您的问题确实有效;我过去有commented,因为在cross_val_score 中没有洗牌的争论令人讨厌且不方便。深入研究documentation,我们看到在底层,该函数使用StratifiedKFoldKFold 来构建折叠:

cv : int,交叉验证生成器或可迭代的,可选的

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

您可以从链接的文档页面中轻松看到这两个函数都使用 shuffle=False 作为默认值。

无论如何,解决方案很简单,只需要一行额外的代码;您只需要将cv=5 替换为对先前定义的StratifiedKFold 对象的调用,并使用shuffle=True

from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True)
cv_score_av = np.mean(cross_val_score(ml_10_knn, x, y, cv=skf))

【讨论】:

以上是关于cross_val_score 与 sklearn 中的不同分类器的行为不同的主要内容,如果未能解决你的问题,请参考以下文章

Sklearn cross_val_score 给出的数字与 model.score 明显不同?

当设置 n_job=-1 并且 TF 在单个 GPU 上运行时,带有 TF 模型的 KerasClassifier 可以与 sklearn.cross_val_score 一起使用吗?

sklearn.model_selection.cross_val_score的score函数公式是啥?

为啥 xgboost.cv 和 sklearn.cross_val_score 给出不同的结果?

在 sklearn cross_val_score 上评估多个分数

使用joblib在sklearn中重用由cross_val_score拟合的模型