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,我们看到在底层,该函数使用StratifiedKFold
或KFold
来构建折叠:
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 给出不同的结果?