【问题标题】:Choosing random_state for sklearn algorithms为 sklearn 算法选择 random_state
【发布时间】:2014-11-23 17:30:05
【问题描述】:

我了解random_state 用于各种 sklearn 算法,以打破具有相同度量值的不同预测变量(树)之间的联系(例如在 GradientBoosting 中)。但是文档没有对此进行澄清或详细说明。喜欢

1) 这些种子还用于随机数生成的什么地方?比如说RandomForestClassifier,随机数可以用来找到一组随机特征来构建一个预测器。使用子采样的算法可以使用随机数来获得不同的子样本。同一种子 (random_state) 能否/是否在多个随机数生成中发挥作用?

我主要关心的是

2) 这个 random_state 变量的影响有多远。 ?该值能否对预测(分类或回归)产生很大影响。如果是,我应该更关心什么样的数据集?还是更注重稳定性而不是结果质量?

3) 如果它可以产生很大的不同,那么如何最好地选择 random_state?在没有直觉的情况下进行 GridSearch 是一件很困难的事情。特别是如果数据集是这样的,一份简历可能需要一个小时。

4) 如果动机是只对我的模型进行稳定的结果/评估并在重复运行中交叉验证分数,如果我在使用任何算法之前设置random.seed(X)(并使用@ 987654326@ 无)。

5) 假设我在 GradientBoosted 分类器上使用 random_state 值,并且我正在交叉验证以找到我的模型的优点(每次都在验证集上评分)。一旦满意,我将在整个训练集上训练我的模型,然后再将其应用于测试集。现在,在交叉验证中,完整的训练集比较小的训练集有更多的实例。因此,与 cv 循环中发生的情况相比,random_state 值现在可以导致完全不同的行为(特征和单个预测变量的选择)。类似地,最小样本叶等也可能导致模型较差,因为设置与 CV 中的实例数有关,而实际实例数更多。这是正确的理解吗?有什么方法可以防止这种情况发生?

【问题讨论】:

    标签: machine-learning scikit-learn random-forest


    【解决方案1】:

    是的,随机种子的选择会影响您的预测结果,正如您在第四个问题中指出的那样,这种影响是不可预测的。

    防止偶然预测的好坏的常用方法是训练多个模型(基于不同的随机状态)并以有意义的方式平均它们的预测。同样,您可以将交叉验证视为一种通过对多个训练/测试数据拆分的性能进行平均来估计模型“真实”性能的方法。

    【讨论】:

      【解决方案2】:

      1) 这些种子还用于随机数生成的什么地方?说 RandomForestClassifier ,随机数可用于找到一组随机特征来构建预测器。使用子采样的算法可以使用随机数来获得不同的子样本。同一个种子(random_state)能否/是否在多个随机数生成中发挥作用?

      random_stateis used wherever randomness is needed:

      如果您的代码依赖于随机数生成器,则绝不应使用 numpy.random.randomnumpy.random.normal 之类的函数。这种方法可能会导致单元测试中的可重复性问题。相反,应该使用numpy.random.RandomState 对象,该对象是从传递给类或函数的random_state 参数构建的。

      2) 这个 random_state 变量的影响有多远。 ?该值能否对预测(分类或回归)产生很大影响。如果是,我应该更关心什么样的数据集?还是更注重稳定性而不是结果质量?

      好的问题不应该过多依赖random_state

      3) 如果它可以产生很大的不同,那么如何最好地选择 random_state?在没有直觉的情况下进行 GridSearch 是一件很困难的事情。特别是如果数据集是这样的,一份简历可能需要一个小时。

      不要选择它。而是尝试优化分类的其他方面以获得良好的结果,不管random_state

      4) 如果动机是只对我的模型进行稳定的结果/评估并在重复运行中交叉验证分数,如果我在使用任何算法之前设置 random.seed(X) 是否具有相同的效果(并使用 random_state 作为 None)。

      截至Should I use `random.seed` or `numpy.random.seed` to control random number generation in `scikit-learn`?,sklearn 不使用random.seed(X)。如果需要对此进行控制,可以改为设置np.random.seed()

      5) 假设我在 GradientBoosted 分类器上使用 random_state 值,并且我正在交叉验证以找到我的模型的优点(每次都在验证集上评分)。一旦满意,我将在整个训练集上训练我的模型,然后再将其应用于测试集。现在,在交叉验证中,完整的训练集比较小的训练集有更多的实例。因此,与 cv 循环中发生的情况相比,random_state 值现在可以导致完全不同的行为(特征和单个预测变量的选择)。类似地,最小样本叶等也可能导致模型较差,因为设置与 CV 中的实例数有关,而实际实例数更多。这是一个正确的理解吗?有什么方法可以防止这种情况发生?

      How can I know training data is enough for machine learning 的回答大多表明数据越多越好。

      如果您进行大量模型选择,也许Sacred 也可以提供帮助。除此之外,它sets 并且可以log 为每个评估提供随机种子,例如:

      >>./experiment.py with seed=123
      

      【讨论】:

        【解决方案3】:

        在实验过程中,为了调整和再现性,您暂时固定随机状态,但您使用不同的随机状态重复实验并取结果的平均值。

        import os
        
        # Set a Random State value
        RANDOM_STATE = 42
        
        # Set Python a random state
        os.environ['PYTHONHASHSEED'] = str(RANDOM_STATE)
        
        # Set Python random a fixed value
        import random
        random.seed(RANDOM_STATE)
        
        # Set numpy random a fixed value
        import numpy as np
        np.random.seed(RANDOM_STATE)
        
        # Set other library like TensorFlow random a fixed value
        import tensorflow as tf
        tf.set_seed(RANDOM_STATE)
        os.environ['TF_DETERMINISTIC_OPS'] = '1'
        os.environ['TF_CUDNN_DETERMINISTIC'] = '1'
        
        # Eventually don't forget to set random_state parameter in function like
        RandomizedSearchCV(random_state = RANDOM_STATE, ...)
        

        对于生产系统,您可以通过将其设置为 None 来移除随机状态

        # Set a Random State value
        RANDOM_STATE = None
        

        【讨论】:

          猜你喜欢
          • 2020-04-09
          • 2019-03-25
          • 2019-01-18
          • 2020-09-04
          • 1970-01-01
          • 2018-07-18
          • 1970-01-01
          • 2017-04-06
          • 2016-02-04
          相关资源
          最近更新 更多