我对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))
每次运行脚本时,我都希望获得不同的结果,但是没有一个选项可以像RandomForestClassifier()
那样设置RandomForestClassifier()
。是否有一种方法可以在每次运行时获得不同的结果,或者在我的cross_val_score
模型上运行KNeighborsClassifier
之前,我必须随机地手动对数据进行洗牌。
发布于 2020-05-10 05:06:05
从您的部分来看,这里似乎有一些误解;随机森林中的random_state
参数是指算法本身,而不是交叉验证部分。在这里,这样的论点是必要的,因为RF在模型构建中确实包含了一些随机性(事实上,正如alforithm的名称所暗示的那样);但是knn,相反,是一个确定性的算法,所以原则上它不需要使用任何random_state
。
尽管如此,您的问题确实是正确的;我曾在评论上讨论过cross_val_score
中这种烦人和不方便的混乱论点。深入了解文档,我们可以看到,在遮罩下,函数使用StratifiedKFold
或KFold
来构建折叠:
cv : int,交叉验证生成器或可迭代的可选。 对于整数/无输入,如果估计器是分类器,且
y
为二进制或多类,则使用StratifiedKFold
。在所有其他情况下,都使用KFold
。
从链接的文档页面中可以很容易地看到,这两个函数都使用shuffle=False
作为默认值。
无论如何,解决方案很简单,包含一行额外的代码;您只需要用调用先前定义的cv=5
对象来替换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))
https://stackoverflow.com/questions/61711886
复制