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

2025-03-18 08:55:00
admin
原创
44
摘要:问题描述:我想在 scikit learn 中实现一个机器学习算法,但我不明白这个参数有什么random_state用?为什么要使用它?我也不明白什么是伪随机数。解决方案 1:train_test_split将数组或矩阵拆分为随机训练和测试子集。这意味着每次运行它而不指定时random_state,您都会得到...

问题描述:

我想在 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 是《银河系漫游指南》一书中的引用。生命宇宙和一切的答案,纯属玩笑。没有其他意义。

参考

  1. 维基百科:关于银河系漫游指南

  2. Stack Exchange:为什么在表示随机事物时首选数字 42

  3. 为什么是42

  4. Quora:为什么在表示随机事物时首选数字 42

  5. YouTube:精彩简单的视频,解释在训练-测试-分割中使用随机状态

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

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

解决方案 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

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2482  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1533  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   0  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   0  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   0  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用