Scikit 的随机状态(伪随机数)

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

我也不明白什么是伪随机数。

259222 次浏览

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设置为某个固定的数字,但是如果您确实需要一个随机(而不是固定)拆分,那么在生产环境中删除它。译注:

关于您的第二个问题,伪随机数生成器是生成几乎真正随机数的数生成器。为什么他们不是真正的随机是在这个问题的范围之外,也许不会在你的情况下,你可以看看 给你形式的更多细节。

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

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

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

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

Parameters: ...
random_state : int, RandomState instance or None, optional (default=None)
如果是 int,那么 Random _ state 是随机数生成器使用的种子; 如果是 RRandom State 实例,那么 Random _ state 是随机数生成器; 如果是 Nothing,那么随机数生成器就是 np.Random 使用的随机数实例。 资料来源: 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

如果在代码中没有提到 Random _ state,那么无论何时执行代码,都会生成一个新的随机值,每次列车和测试数据集都会有不同的值。

然而,如果您每次都为 Random _ state (Random _ state = 1或任何其他值)使用一个特定的值,那么结果将是相同的,即在 train 和 test 数据集中使用相同的值。 请参考以下代码:

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))

现在,每次执行代码时,这里的输出都会有所不同。

随机状态数以随机方式分割测试和训练数据集。除了这里所解释的内容之外,重要的是要记住,随机状态值可以对模型的质量产生重大影响(所谓质量,本质上是指预测的准确性)。例如,如果您使用一个特定的数据集并用它训练一个回归模型,而不指定 Random _ state 值,那么每次都有可能得到不同的准确性结果,这与您所训练的模型对测试数据的准确性结果是不同的。 因此,找到最佳随机状态值以提供最精确的模型非常重要。然后,这个数字将被用来在另一个场合重现你的模型,比如另一个研究实验。 为此,可以通过将随机数赋给 Random _ state 参数:

,在 for 循环中对模型进行分割和训练
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)`


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

如果您看到树分类器(DT 或 RF) ,它们会尝试使用最佳计划构建尝试。尽管大多数情况下,这个计划可能是相同的,但是也有可能出现树可能不同的情况,所以预测也可能不同。当您尝试调试您的模型时,您可能无法重新创建为其生成 Tree 的相同实例。因此,为了避免所有这些麻烦,我们在构建 DecisionTreeClassfier 或 RRandom ForestClassfier 时使用了 Random _ state。

附言: 你可以深入了解一下 DecisionTree 是如何建造这棵树的,以便更好地理解这一点。

随机状态基本上是用来重现你的问题相同的每次运行。如果你没有在 train testsplit 中使用随机状态,那么每次你进行分割的时候,你可能会得到一组不同的 train 和测试数据点,如果你遇到一个问题,这将不会帮助你进行调试。

来自医生:

随机状态是随机数生成器使用的种子; 随机状态是随机数生成器; 随机数生成器是 np.Random 使用的随机状态实例。

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

许多学生和实践者使用这个数字(42)作为随机状态,是因为它被许多教师在网络课程中使用。他们经常将随机状态或麻木的种子设置为数字42,学习者没有仔细考虑就遵循同样的做法。

具体来说,42与人工智能或机器学习没有任何关系。它实际上是一个通用数字,在机器学习中,实际的随机数是多少并不重要,正如 scikit API 文档中提到的,任何 整数都足以完成手头的任务。

42是 银河系漫游指南的参考文献。生命的答案宇宙和一切,并意味着作为一个 开个玩笑。没有别的意义。

返回文章页面

  1. 维基百科: 银河系漫游指南
  2. 堆栈交换: 为什么在表示某个随机数时,数字42是首选
  3. 返回文章页面为什么是42译者:
  4. Quora: 为什么数字42在表示随机事件时更受欢迎
  5. YouTube: 漂亮简单的视频,解释在列车测试分裂中随机状态的使用

The significance of number 42!