Scikit 学习中的随机状态(伪随机数)
- 2025-03-18 08:55:00
- admin 原创
- 45
问题描述:
我想在 scikit learn 中实现一个机器学习算法,但我不明白这个参数有什么random_state
用?为什么要使用它?
我也不明白什么是伪随机数。
解决方案 1:
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]]
它会变化。另一方面,如果您使用,那么您可以保证运行 1random_state=some_number
的输出将等于运行 2的输出,即,您的拆分将始终相同。实际数字是 42、0、21……并不重要,重要的是每次使用 42 时,您在第一次拆分时总会获得相同的输出。如果您想要可重复的结果(例如在文档中),这将很有用,以便每个人在运行示例时都能始终看到相同的数字。在实践中,我想说,您应该在测试东西时将设置为某个固定数字,但如果您确实需要随机(而不是固定)拆分,则在生产中将其删除。random_state
`random_state`
关于你的第二个问题,伪随机数生成器是一种生成几乎真正随机数的数字生成器。为什么它们不是真正随机的超出了这个问题的范围,对你的情况可能也不重要,你可以在这里查看更多详细信息。
解决方案 2:
如果您未random_state
在代码中指定,那么每次运行(执行)代码时都会生成一个新的随机值,并且训练和测试数据集每次都会具有不同的值。
但是,如果分配了一个固定值random_state = 42
,那么无论执行代码多少次,结果都是相同的,即训练和测试数据集中的值相同。
解决方案 3:
那么,什么是“随机状态”以及为什么要使用它的问题,上面的人已经很好地回答了。我将尝试回答这个问题“为什么我们在训练机器学习模型时经常选择 42 作为随机状态?为什么我们不选择 12 或 32 或 5?”有科学的解释吗?
许多学生和从业者使用这个数字(42)作为随机状态,是因为许多在线课程的讲师都使用它。他们经常将随机状态或 numpy 种子设置为数字 42,而学习者也会不假思索地遵循相同的做法。
具体来说,42 与 AI 或 ML 无关。它实际上是一个通用数字,在机器学习中,实际的随机数是什么并不重要,正如 scikit API 文档中提到的那样,任何INTEGER都足以完成手头的任务。
42 是《银河系漫游指南》一书中的引用。生命宇宙和一切的答案,纯属玩笑。没有其他意义。
参考:
维基百科:关于银河系漫游指南
Stack Exchange:为什么在表示随机事物时首选数字 42
为什么是42
Quora:为什么在表示随机事物时首选数字 42
YouTube:精彩简单的视频,解释在训练-测试-分割中使用随机状态
解决方案 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))
现在,每次执行代码时,输出都会有所不同。
解决方案 5:
random_state 数字以随机方式分割测试和训练数据集。除了这里解释的内容之外,重要的是要记住 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)`
解决方案 6:
如果没有提供随机状态,系统将使用内部生成的随机状态。因此,当您多次运行该程序时,您可能会看到不同的训练/测试数据点,并且行为将无法预测。如果您的模型出现问题,您将无法重新创建它,因为您不知道运行该程序时生成的随机数。
如果您看到树分类器(DT 或 RF),它们会尝试使用最佳计划构建尝试。虽然大多数情况下这个计划可能是相同的,但在某些情况下树可能会有所不同,因此预测也会不同。当您尝试调试模型时,您可能无法重新创建为其构建树的相同实例。因此,为了避免所有这些麻烦,我们在构建 DecisionTreeClassifier 或 RandomForestClassifier 时使用 random_state。
PS:您可以深入了解决策树中树的构建方式,以便更好地理解这一点。
randomstate 基本上用于在每次运行时重现相同的问题。如果您在 traintestsplit 中不使用 randomstate,则每次进行拆分时,您可能会得到一组不同的训练和测试数据点,并且在您遇到问题时不会帮助您进行调试。
来自文档:
如果是 int,randomstate 是随机数生成器使用的种子;如果是 RandomState 实例,randomstate 是随机数生成器;如果是 None,随机数生成器是 np.random 使用的 RandomState 实例。
解决方案 7:
考虑这样一种情况,我们有一个包含 10 个数字的数据集,范围从 1 到 10,我们想将其分成一个训练数据集和一个测试数据集,其中测试数据集的大小占整个数据集的 20%。
训练数据集将有 8 个数据样本,测试数据集将有 2 个数据样本。我们确保随机过程每次都会输出相同的结果,以使代码可重现。如果我们不打乱数据集,每次都会产生不同的数据集,每次用不同的数据训练模型并不好。
对于所有随机数据集,每个数据集都被分配一个random_state
值。这意味着一个random_state
值有一个固定的数据集,因此每次我们用值 1 运行代码时random_state
,它都会产生相同的分割数据集。
下图显示了random_state
所做的一切:
另请参阅:什么是 random_state?
解决方案 8:
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 是随机数生成器;如果是 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
扫码咨询,免费领取项目管理大礼包!