我正在执行交叉验证以正确分类。首先,我使用了scikit-learn中的StratifiedKfold函数。在某些时候,我想进行更多的迭代,我改成了StratifiedShuffleSplit。有了这个新功能,我获得的结果发生了变化。最后,我意识到,如果我指定一个random_state我会再次得到与我在CV中使用StratifiedKfold时获得的结果相似的结果。
总之,如果我指定random_state,对于不同的值,我得到的结果略有不同,类似于我使用 StratifiedKfold 获得的结果(一次迭代,或自己计算洗牌,如下所示)。但是,如果random_state为无或未指定,则我获得的结果完全改变。
我检查了当random_state为"无"时,训练和测试指标是不同的,并且是分层的,正如预期的那样。
我没有使用随机数生成器的经验,但这对我来说没有任何意义
查看代码,我意识到当random_state为None时,将调用函数check_random_state。如果种子为none,则此函数返回np.random(链接)使用的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, ...)
我使用的是 sklearn 的 0.14 版。
您有任何解释或线索可以帮助理解正在发生的事情吗?
(分层)ShuffleSplit在拆分之前随机洗牌数据。(伪)随机性由 random_state
构造函数参数控制。默认的None
值意味着每个新调用将产生不同的随机播放。要获得确定性洗牌,您可以选择传递整数种子。
我也不是随机生成器的专家,但据我所知,如果您不定义random_state,则会调用不同的 RandomState 类型。 这是我找到的解释:
"如果种子是None,那么RandomState将尝试从/dev/urandom(或Windows模拟)读取数据(如果可用)或从时钟中读取种子。[1]
"如果大小是整数,则返回一个填充有生成值的一维数组。[1]
您可以在此处的"check_random_state"中看到调用的两个不同随机生成器的代码 [2]。
[1] http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.RandomState.html
[2] https://github.com/scikit-learn/scikit-learn/blob/0.14.X/sklearn/utils/validation.py
这对你有帮助吗?