当随机态为非随机态时,分层shufflesplit函数(scikitlearn)的不同结果

2024-10-01 22:42:05 发布

您现在位置:Python中文网/ 问答频道 /正文

为了正确分类,我正在进行交叉验证。首先,我使用了scikit learn中的StratifiedKfold函数。在某种程度上,我想进行更多的迭代,于是我改为分层shufflesplit。有了这个新函数,我得到的结果就变了。最后,我意识到,如果我指定一个随机的_状态,我会得到与使用StratifiedKfold计算CV时得到的结果相似的结果。在

总之,如果我指定random_state,对于不同的值,我得到的结果略有不同,类似于我用StratifiedKfold获得的结果(一次迭代,或者自己计算洗牌,如here)。但是,如果random_state为none或未指定,则结果将完全更改。在

我检查了random_state为None时,列车和测试指标是不同的,并按预期进行了分层。在

我没有随机数生成器的经验,但这对我没有任何意义

看着代码,我意识到当random_state为None时,函数check_random_state被调用。如果seed为none,则此函数返回np.随机(link)。在

我给你写了一段有问题的代码。 如果我将注释行改为下面的一行,我会得到不同的结果。在

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版本。在

你有什么解释或线索可以帮助你理解发生了什么?在


Tags: 函数代码testnone分层nprandomstate
2条回答

(分层)ShuffleSplit在拆分之前随机洗牌数据。(伪)随机性由random_state构造函数参数控制。默认的None值意味着每个新调用将产生不同的洗牌。要获得确定性洗牌,您可以选择传递一个整数种子。在

我也不是随机生成器的专家,但据我所知,如果不定义random_state,则会调用不同的random state类型。以下是我发现的解释:

“如果seed为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

这对你有帮助吗?在

相关问题 更多 >

    热门问题