【问题标题】:scikit-learn random state in splitting datasetscikit-learn 分割数据集中的随机状态
【发布时间】:2017-06-30 17:02:45
【问题描述】:

谁能告诉我为什么我们在拆分训练集和测试集时将随机状态设置为零。

X_train, X_test, y_train, y_test = \
    train_test_split(X, y, test_size=0.30, random_state=0)

我见过这样的情况,随机状态设置为 1!

X_train, X_test, y_train, y_test = \
    train_test_split(X, y, test_size=0.30, random_state=1)

这种随机状态在交叉验证中的后果是什么?

【问题讨论】:

  • @Scott Hunter 它来自 sklearn.cross_validation。但是随机状态为 0 和 1 对训练和测试拆分有何影响?
  • train_test_split 的文档是怎么说的?
  • 这只是为了确保每次运行脚本时都获得相同的拆分。阅读一些关于 Pseudo-random-number-generators 的内容。 (像 32525352 这样的数字将与 0 或 1 具有相同的效果;它只是一个映射到某个内部状态的常量)如果您不这样做,它会根据时间播种,从而在大多数运行中产生不同的结果.

标签: python random machine-learning scikit-learn


【解决方案1】:

random_state 是 0 还是 1 或任何其他整数都没有关系。重要的是,如果您想通过多次运行代码来验证您的处理,那么它应该设置为相同的值。顺便说一句,我看到random_state=42 在许多官方的 scikit 示例以及其他地方都使用过。

random_state 顾名思义,用于初始化内部随机数生成器,在您的情况下,它将决定将数据拆分为训练和测试索引。在documentation中声明:

如果 random_state 为 None 或 np.random,则返回随机初始化的 RandomState 对象。

如果 random_state 是一个整数,则它用于为新的 RandomState 对象播种。

如果 random_state 是一个 RandomState 对象,则它被传递。

这是为了在多次运行代码时检查和验证数据。将random_state 设置为固定值将保证每次运行代码时都会生成相同的随机数序列。除非过程中存在其他随机性,否则产生的结果将与往常一样。这有助于验证输出。

【讨论】:

  • 这很奇怪,每次我似乎重新运行我的分类指标(如特异性和灵敏度等)时,尽管我有一个 set_seed,但我的分数会有所变化。知道为什么会这样吗?除了 train _test 拆分之外,我是否还需要在其他任何地方设置_seed,例如在 .fit() 或 .score 或 .predict() 下?我不相信我在任何地方都有任何其他随机性来源。
  • @mathlover 我也在我的输出中观察到同样的随机性。我发现的是,当您将某个值设置为 random_state 时,在我的情况下,像 mean_absolute_error 这样的输出会得到修复(我的意思是每次我运行它时,它的输出都是一样的)
  • 当值本身无关紧要时,为什么它不只是一个布尔值?
  • @Ben 因为在内部,random_state 中提供的值将充当numpy 中使用的伪随机数生成器的种子。如果未设置,则大多数实现将使用当前系统时间作为种子。因此,将其设置为布尔值是不合适的。
  • 随机种子通常设置为 42,因为《银河系漫游指南》中的“生命、宇宙和一切终极问题的答案是 42”。但想想大多数人都知道这一点。以防万一感兴趣,请参阅... en.wikipedia.org/wiki/…
【解决方案2】:

random_state 拆分随机选择的数据,但有一个扭曲。扭曲是对于 random_state 的特定值,数据的顺序将是相同的。您需要了解它不是 bool 可接受的值。从 0 开始到任何整数 no,如果您作为 random_state 传递,它将是它的永久订单。例如:您将在random_state=0 中获得的顺序保持不变。之后,如果您执行random_state=5 并再次返回random_state=0,您将获得相同的订单。就像所有整数的 0 一样。 random_state=None 每次都随机分裂。

如果还有疑问请关注this

【讨论】:

    【解决方案3】:

    如果您没有在代码中提及 random_state,那么每当您执行代码时,都会生成一个新的随机值,并且训练和测试数据集每次都会有不同的值。

    但是,如果您每次使用 random_state 的特定值(random_state = 1 或任何其他值)结果将是相同的,即训练和测试数据集中的相同值。

    【讨论】:

      【解决方案4】:

      我们使用 random_state 参数来重现每个 epoch 之后训练数据集的初始洗牌。

      【讨论】:

        【解决方案5】:

        当 random_state 设置为 integer 时,train_test_split 将为每次执行返回 same 结果。

        当 random_state 设置为 None 时,train_test_split 将为每次执行返回 不同结果。

        见下例:

        from sklearn.model_selection import train_test_split
        
        X_data = range(10)
        y_data = range(10)
        
        for i in range(5):
            X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size = 0.3,random_state = 0) # zero or any other integer
            print(y_test)
        
        print("*"*30)
        
        for i in range(5): 
            X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size = 0.3,random_state = None)
            print(y_test)
        

        输出

        [2, 8, 4]

        [2, 8, 4]

        [2, 8, 4]

        [2, 8, 4]

        [2, 8, 4]


        [4, 7, 6]

        [4,3,7]

        [8,1,4]

        [9, 5, 8]

        [6,4,5]

        【讨论】:

          【解决方案6】:

          对于我们模型的多次执行,随机状态确保训练和测试数据集的数据值相同。它修复了 train_test_split 的数据顺序

          【讨论】:

            【解决方案7】:

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

            但是,如果像 random_state = 0 或 1 或 42 那样分配一个固定值,那么无论您执行多少次代码,结果都将是相同的。即,在 train 和测试数据集。

            【讨论】:

              【解决方案8】:

              random_state 默认为 None,这意味着每次运行程序时,您都会得到不同的输出,因为 train 和 test 之间的分割会有所不同。

              random_state = 任何 int 值意味着每次运行程序时都会得到相同的输出,因为训练和测试之间的拆分不会在内部变化。

              【讨论】:

                【解决方案9】:

                random_state 是一个整数值,表示选择训练和测试的随机组合。当您将 test_size 设置为 1/4 时,会生成一组排列组合以及训练和测试组合,并且每个组合都有一个状态。 假设你有一个数据集---> [1,2,3,4]

                Train   |  Test   | State
                [1,2,3]    [4]      **0**
                [1,3,4]    [2]      **1**
                [4,2,3]    [1]      **2**
                [2,4,1]    [3]      **3**
                

                我们需要它,因为模型相同状态的参数调整会一次又一次地考虑。 这样就不会有任何关于准确性的推断。

                但在随机森林的情况下,也有类似的故事,但方式不同。

                【讨论】:

                  【解决方案10】:

                  假设我们的数据集有一个特征和 10 个数据点。 X=[0,1,2,3,4,5,6,7,8,9] 假设 0.3(30% 是测试集)指定为测试数据百分比,那么我们将有 10C3=120 种不同的数据组合。[请参阅链接中的图片以获取表格说明]:https://i.stack.imgur.com/FZm4a.png

                  根据指定的随机数,系统将选择随机状态并分配训练和测试数据

                  【讨论】:

                    猜你喜欢
                    • 2015-03-28
                    • 2021-07-02
                    • 2015-03-19
                    • 1970-01-01
                    • 2015-04-20
                    • 2016-06-22
                    • 2018-04-23
                    • 2013-04-26
                    相关资源
                    最近更新 更多