【发布时间】:2015-03-19 19:40:41
【问题描述】:
我想在scikit learn中实现一个机器学习算法,但是不明白random_state这个参数是做什么的?我为什么要使用它?
我也无法理解什么是伪随机数。
【问题讨论】:
标签: python random scikit-learn
我想在scikit learn中实现一个机器学习算法,但是不明白random_state这个参数是做什么的?我为什么要使用它?
我也无法理解什么是伪随机数。
【问题讨论】:
标签: python random scikit-learn
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,那么您可以保证Run 1 的输出将等于Run 2 的输出,即您的拆分将是总是一样。
实际的 random_state 数字是 42, 0, 21, ... 并不重要,重要的是每次使用 42 时,第一次进行拆分时总是会得到相同的输出。
如果您想要可重现的结果(例如在文档中),这很有用,这样每个人在运行示例时都可以一致地看到相同的数字。
在实践中,我会说,您应该在测试内容时将random_state 设置为某个固定数字,但如果您确实需要随机(而不是固定)拆分,请在生产中将其删除。
关于您的第二个问题,伪随机数生成器是一种生成几乎真正随机数的数字生成器。为什么它们不是真正随机的超出了这个问题的范围,并且可能对您的情况无关紧要,您可以查看here 以获取更多详细信息。
【讨论】:
如果您没有在代码中指定 random_state,那么每次运行(执行)代码时都会生成一个新的随机值,并且训练和测试数据集每次都会有不同的值。
但是,如果像 random_state = 42 这样分配了一个固定值,那么无论您执行多少次代码,结果都将是相同的。即,训练和测试数据集中的值相同。
【讨论】:
如果您没有在代码中提及 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))
现在每次执行代码时,这里的输出都会不同。
【讨论】:
random_state number 以随机方式分割测试和训练数据集。除了这里解释的内容之外,重要的是要记住 random_state 值会对模型的质量产生重大影响(质量我本质上是指预测的准确性)。例如,如果您使用某个数据集并用它训练一个回归模型,但没有指定 random_state 值,那么每次您的训练模型在测试数据上都会得到不同的准确度结果。 因此,找到最佳的 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)`
【讨论】:
什么是“随机状态”以及为什么使用它,上面的人已经很好地回答了这个问题。我将尝试回答问题“为什么我们在训练机器学习模型时经常选择随机状态为 42?为什么我们不选择 12 或 32 或 5?” 有科学解释吗?
许多学生和从业者使用这个数字(42)作为随机状态是因为它被许多教师在线课程中使用。他们经常将随机状态或 numpy 种子设置为 42 号,学习者遵循相同的做法而不加考虑。
具体来说,42 与 AI 或 ML 无关。它实际上是一个通用数,在机器学习中,实际随机数是多少并不重要,正如 scikit API 文档中提到的,任何 INTEGER 都足以完成手头的任务。
42 是 银河系漫游指南 的参考。生命宇宙和一切的答案是一个笑话。它没有其他意义。
参考文献:
【讨论】:
如果没有提供随机状态,系统将使用内部生成的随机状态。因此,当您多次运行程序时,您可能会看到不同的训练/测试数据点,并且行为将是不可预测的。如果您的模型有问题,您将无法重新创建它,因为您不知道运行程序时生成的随机数。
如果您看到树分类器 - DT 或 RF,它们会尝试使用最佳计划构建尝试。虽然大多数时候这个计划可能是相同的,但在某些情况下,树可能会有所不同,因此预测也会有所不同。当您尝试调试模型时,您可能无法重新创建构建树的相同实例。因此,为了避免所有这些麻烦,我们在构建 DecisionTreeClassifier 或 RandomForestClassifier 时使用了 random_state。
PS:您可以深入了解一下如何在 DecisionTree 中构建树以更好地理解这一点。
randomstate 基本上用于在每次运行时都以相同的方式重现您的问题。如果您在 traintestsplit 中不使用随机状态,则每次进行拆分时,您可能会得到一组不同的训练和测试数据点,并且在遇到问题时无法帮助您进行调试。
来自文档:
如果是int,则randomstate是随机数生成器使用的种子;如果是 RandomState 实例,则 randomstate 是随机数生成器;如果为 None,则随机数生成器是 np.random 使用的 RandomState 实例。
【讨论】:
sklearn.model_selection.train_test_split(*arrays, **options)[source]
将数组或矩阵拆分为随机训练和测试子集
Parameters: ...
random_state : int, RandomState instance or None, optional (default=None)
如果是int,则random_state是随机数生成器使用的种子;如果是 RandomState 实例,则 random_state 是随机数生成器;如果没有,随机数生成器是 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
【讨论】: