【发布时间】:2014-05-15 14:11:36
【问题描述】:
我正在执行交叉验证以正确分类。首先,我使用了 scikit-learn 中的 StratifiedKfold 函数。在某个时候,我想进行更多的迭代,于是我改为使用 StratifiedShuffleSplit。有了这个新功能,我得到的结果发生了变化。最后,我意识到,如果我指定一个 random_state,我会再次获得与使用 StratifiedKfold 作为 CV 时获得的结果相似的结果。
总之,如果我指定 random_state,对于不同的值,我得到的结果会略有不同,类似于我使用 StratifiedKfold 获得的结果(一次迭代,或者我自己计算洗牌,如 here)。但是,如果 random_state 为 none 或未指定,我获得的结果将完全改变。
我检查了当 random_state 为 None 时,train 和 test 索引是不同的并且是分层的,正如预期的那样。
我没有使用随机数生成器的经验,但这对我来说没有任何意义
查看代码我意识到当 random_state 为 None 时,函数 check_random_state 被调用。如果种子为无,此函数返回 np.random (link) 使用的 RandomState 单例。
我给你写了有问题的代码。 如果我将注释行更改为下面的行,我会得到不同的结果。
import numpy as np
import sklearn as skl
(...)
#skCVs=skl.cross_validation.StratifiedShuffleSplit(classes,n_iter=iterations*kfoldCV,test_size = 1/float(kfoldCV),random_state=5)
skCVs=skl.cross_validation.StratifiedShuffleSplit(classes,n_iter=iterations*kfoldCV,test_size = 1/float(kfoldCV))
for train,test in skCVs:
(classification, ...)
我使用的是 0.14 版的 sklearn。
你有什么解释或线索可以帮助理解正在发生的事情吗?
【问题讨论】:
标签: python random machine-learning scikit-learn cross-validation