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

时间:2015-01-21 10:17:51

标签: python scikit-learn

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

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

7 个答案:

答案 0 :(得分:147)

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设置为某个固定数字,但如果你真的需要一个随机(而不是固定的)分割,那么就在生产中删除它。

关于第二个问题,伪随机数生成器是一个生成几乎真正随机数的数字生成器。为什么它们不是真正随机的不属于这个问题的范围,并且在您的情况下可能不重要,您可以查看更多详细信息{/ 3}}。

答案 1 :(得分:8)

如果您未在代码中指定random_state,那么每次运行(执行)代码时,都会生成一个新的随机值,每次列车和测试数据集都会有不同的值。

但是,如果指定了固定值,如random_state = 42,则无论执行代码多少次,结果都是相同的。即,列车和测试数据集中的值相同。

答案 2 :(得分:2)

如果您在代码中未提及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 :(得分:1)

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

`范围内的j(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)`

答案 4 :(得分:1)

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

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

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

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

来自文档:

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

答案 5 :(得分:0)

什么是“随机状态”以及为什么使用它的问题,上面的人已经很好地回答了上面的问题。我将尝试回答这个问题“为什么我们在训练机器学习模型时经常选择随机状态为 42?为什么我们不选择 12、32 或 5?” 有科学的解释吗?

许多学生和从业者使用这个数字 (42) 作为随机状态,因为许多教师在在线课程中使用它。他们经常将随机状态或 numpy 种子设置为数字 42,学习者遵循相同的做法而没有考虑太多。

具体来说,42 与 AI 或 ML 无关。它实际上是一个通用数字,在机器学习中,实际随机数是什么并不重要,正如 scikit API 文档中提到的,任何 INTEGER 都足以完成手头的任务。 >

42 是银河系漫游指南的参考。对生命宇宙和一切事物的回答是一个笑话。没有其他意义。

参考资料

  1. Wikipedia: on Hitchhikers guide to galaxy
  2. Stack Exchange: Why the Number 42 is preferred when indicating something random
  3. Why the Number 42
  4. Quora: Why the Number 42 is preferred when indicating something random
  5. YouTube: Nice Simple video explaining use of random state in train-test-split

The significance of number 42!

答案 6 :(得分:-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-to-tune