Arg*_*zen 2 python random machine-learning scikit-learn cross-validation
我正在执行交叉验证以便正确分类.首先,我使用scikit-learn中的StratifiedKfold函数.在某些时候,我想进行更多迭代,然后我改为StratifiedShuffleSplit.通过这个新功能,我获得的结果发生了变化.最后,我意识到如果我指定一个random_state,我会再次获得与使用StratifiedKfold作为CV时获得的结果类似的结果.
总之,如果我指定random_state,对于不同的值,我会得到稍微不同的结果,类似于我使用StratifiedKfold获得的结果(通过一次迭代,或者计算我自己的混洗,如此处所示).但是,如果random_state为none或未指定,则我获得的结果完全改变.
我检查了当random_state为None时,列车和测试索引是不同的,并按预期分层.
我没有随机数生成器的经验,但这对我没有任何意义
查看代码,我意识到当random_state为None时,调用函数check_random_state.此函数,如果seed为none,则返回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, ...)
Run Code Online (Sandbox Code Playgroud)
我正在使用sklearn的0.14版本.
你有任何解释或线索可以帮助理解正在发生的事情吗?
(分层)ShuffleSplit在分割之前随机地对数据进行混洗.(伪)随机性由random_state构造函数参数控制.默认None值意味着每个新呼叫将产生不同的混洗.要获得确定性的混洗,您可以选择传递整数种子.