sklearn中不同分类器的cross_val_score表现不同

问题描述 投票:0回答:1

我有一些困难 cross_val_score()sklearn.

我已经实例化了一个 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() 比如说。有什么方法可以让每次运行都有不同的结果,还是说我必须在运行 cross_val_score 在我 KNeighborsClassifier 模型。

python scikit-learn random-forest cross-validation nearest-neighbor
1个回答
2
投票

你似乎对这里有一些误解。random_state 随机森林中的参数指的是算法本身,而不是交叉验证部分。在这里,这样的论点是必要的,因为RF在模型构建中确实包含了一些随机性(a 大量 的,事实上,alforithm的名字已经暗示了这一点);但相比之下,knn是一个确定性算法,所以原则上它不需要使用任何的 random_state.

话说回来,你的问题确实有道理,我有。评论 在过去,在这个恼人的和不方便的缺席洗牌的论点,在 cross_val_score. 挖掘 文件,我们看到,在外壳下,该函数使用的是 StratifiedKFoldKFold 以建立褶皱。

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

对于整数None输入,如果估计器是一个分类器,并且 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))
© www.soinside.com 2019 - 2024. All rights reserved.