Scikit学习中的随机状态(伪随机数)


148

我想在scikit learning中实现机器学习算法,但我不明白此参数的random_state作用?我为什么要使用它?

我也无法理解什么是伪随机数。

Answers:


220

train_test_split将数组或矩阵拆分为随机训练和测试子集。这意味着,每次运行时不指定random_state,您都会得到不同的结果,这是预期的行为。例如:

运行1:

>>> a, b = np.arange(10).reshape((5, 2)), range(5)
>>> train_test_split(a, b)
[array([[6, 7],
        [8, 9],
        [4, 5]]),
 array([[2, 3],
        [0, 1]]), [3, 4, 2], [1, 0]]

运行2

>>> train_test_split(a, b)
[array([[8, 9],
        [4, 5],
        [0, 1]]),
 array([[6, 7],
        [2, 3]]), [4, 2, 0], [3, 1]]

它改变。另一方面,如果使用random_state=some_number,则可以保证运行1的输出与运行2的输出相等,即,拆分将始终相同。实际的random_state数字是42,0,21,...无关紧要。重要的是,每次使用42时,第一次进行拆分时总会得到相同的输出。如果您想要可重现的结果(例如在文档中),这将很有用,这样每个人在运行示例时都可以始终看到相同的数字。实际上,我会说,random_state在测试材料时,应将设置为某个固定数字,但如果确实需要随机(而不是固定)分割,则应在生产中将其删除。

关于第二个问题,伪随机数生成器是一个生成几乎真正随机数的数字生成器。为什么它们不是真正随机的,超出了这个问题的范围,并且可能对您而言无关紧要,您可以在此处查看更多详细信息。


7
所以我应该设定什么随机状态,我通常会看到这个数字42。–
伊丽莎白·苏珊·约瑟夫

1
@ElizabethSusanJoseph,没关系,如果我想要可重复性,我总是使用0,否则使用None。可能是像42
岁的

53
这可能解释了如此频繁使用的数字42:en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy
denson 2015年

3
好人,这里有更多的可能性
elyase 2015年

1
@赫伯特这是一个棘手的问题。核心PRNG数据基于numpy,它是一致的(在过去出现问题后,他们为此引入了许多检查)。如果sklearn中的使用没有错误,它的行为也将保持一致。我会假设这一点(特别是对于不太复杂的功能,例如train-test-split和co)编辑:哎呀,有点晚了:-)
sascha

13

如果未random_state在代码中指定,则每次运行(执行)代码时,都会生成一个新的随机值,并且训练和测试数据集每次将具有不同的值。

但是,如果像这样分配一个固定值,则random_state = 42无论您执行了多少次代码,结果都将相同,即训练和测试数据集中的值相同。


4

如果您在代码中未提及random_state,则每次执行代码时都会生成一个新的随机值,并且训练和测试数据集每次都将具有不同的值。

但是,如果每次将特定值用于random_state(random_state = 1或任何其他值),则结果将相同,即训练和测试数据集中的值相同。请参考以下代码:

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,random_state = 1,test_size = .3)
size25split = train_test_split(test_series,random_state = 1,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

不管运行代码多少次,输出都是70。

70

尝试删除random_state并运行代码。

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,test_size = .3)
size25split = train_test_split(test_series,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

现在,每次执行代码时,输​​出将有所不同。


3

random_state数字以随机方式拆分测试和训练数据集。除了此处要说明的内容外,还必须记住,random_state值可能会对模型的质量产生重大影响(按质量,我实质上是指预测的准确性)。例如,如果您采用某个数据集并使用其训练回归模型,而未指定random_state值,则有可能每次都会在测试数据上为训练后的模型获得不同的准确性结果。因此,找到最佳的random_state值以为您提供最准确的模型很重要。然后,该数字将用于在另一个场合(例如另一个研究实验)重现您的模型。为此,

for j in range(1000):

            X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =j,     test_size=0.35)
            lr = LarsCV().fit(X_train, y_train)

            tr_score.append(lr.score(X_train, y_train))
            ts_score.append(lr.score(X_test, y_test))

        J = ts_score.index(np.max(ts_score))

        X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =J, test_size=0.35)
        M = LarsCV().fit(X_train, y_train)
        y_pred = M.predict(X_test)`


1

如果没有提供任何randomstate,系统将使用内部生成的randomstate。因此,当您多次运行该程序时,您可能会看到不同的训练/测试数据点,并且行为将不可预测。万一您的模型有问题,您将无法重新创建它,因为您不知道运行程序时生成的随机数。

如果您看到树分类器-DT或RF,它们会尝试使用最佳计划进行尝试。尽管大多数时候该计划可能是相同的,但是在某些情况下树可能会有所不同,因此预测也是如此。当您尝试调试模型时,可能无法重新创建为其构建Tree的实例。因此,为了避免所有这些麻烦,我们在构建DecisionTreeClassifier或RandomForestClassifier时使用了random_state。

PS:您可以深入了解如何在DecisionTree中构建Tree,以更好地理解这一点。

randomstate基本上用于在每次运行时均重现您的问题。如果您不在traintestsplit中使用randomstate,则每次进行拆分时,您可能会得到一组不同的train和test数据点,并且在遇到问题时将无助于调​​试。

从文档:

如果为int,则randomstate是随机数生成器使用的种子;否则为false。如果是RandomState实例,则randomstate是随机数生成器;如果为None,则随机数生成器是np.random使用的RandomState实例。


很好的解释。我只想补充一点,我们将通过随机状态的原因是,例如,如果我们尝试优化超参数,由于基于随机数的不同初始化,我们不希望分数出现波动,这可能会覆盖或隐藏实际优化的效果,因此我们无法确定得分变化的哪些部分是由于参数变化而引起的,以及什么是由于RNG的起始状态不同而引起的。
jottbe

-1
sklearn.model_selection.train_test_split(*arrays, **options)[source]

将数组或矩阵拆分为随机训练和测试子集

Parameters: ... 
    random_state : int, RandomState instance or None, optional (default=None)

如果为int,则random_state是随机数生成器使用的种子;否则为false。如果是RandomState实例,则random_state是随机数生成器;如果为None,则随机数生成器是np.random使用的RandomState实例。来源:http : //scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

关于随机状态,在sklearn中许多随机算法中使用它来确定传递给伪随机数生成器的随机种子。因此,它不支配算法行为的任何方面。结果,在验证集中表现良好的随机状态值与在新的,看不见的测试集中表现良好的随机状态值不对应。确实,根据算法的不同,您可能仅通过更改训练样本的顺序即可看到完全不同的结果。'''来源:https : //stats.stackexchange.com/questions/263999/is-random-state-a-parameter -调

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.