【问题标题】:Should I use `random.seed` or `numpy.random.seed` to control random number generation in `scikit-learn`?我应该使用“random.seed”还是“numpy.random.seed”来控制“scikit-learn”中的随机数生成?
【发布时间】:2015-09-12 11:08:33
【问题描述】:

我正在使用 scikit-learn 和 numpy,我想设置全局种子,以便我的工作可重现。

我应该使用numpy.random.seed 还是random.seed

从 cmets 中的链接,我了解到它们是不同的,并且 numpy 版本不是线程安全的。我想具体了解使用哪一个来创建 IPython 笔记本以进行数据分析。 scikit-learn 的一些算法涉及生成随机数,我想确保 notebook 在每次运行时显示相同的结果。

【问题讨论】:

  • 使用np.random.seed()你不需要导入任何东西,但使用random.seed()你需要导入random模块
  • 请不要设置全局种子,这是不安全的。您可以创建自己的 Random 对象并设置其种子。阅读 Muhammad Alkarouri 在此问题中的最后一条评论,以获得更安全的解决方法:stackoverflow.com/a/3717456/1524913
  • @Leb 感谢您的链接,但目前尚不清楚我应该使用哪一个。我编辑了问题。
  • @JeromeJ 不清楚如何根据该示例使用color_rnd。如果我运行color_rnd.seed(1234),像sklearn.cross_validation.KFold 这样的函数会“知道”使用它而不是它通常使用的任何RNG吗?
  • 如果他们遗憾地直接依赖random,他们可能不会。我的观点是,至少在那时。每当您键入代码时,请避免直接使用random 本身。我不确定在您的情况下该怎么做,这有点令人沮丧。也许是一个装饰器,但我认为你必须修改函数上下文,但我不能 100% 确定,我必须更深入地了解它才能确定。

标签: python numpy random scikit-learn random-seed


【解决方案1】:

我应该使用 np.random.seed 还是 random.seed?

这取决于您在代码中使用的是 numpy 的随机数生成器还是 random 中的随机数生成器。

numpy.randomrandom 中的随机数生成器具有完全独立的内部状态,因此numpy.random.seed() 不会影响random.random() 产生的随机序列,同样random.seed() 也不会影响numpy.random.randn() 等。如果您在代码中同时使用randomnumpy.random,则需要分别为两者设置种子。

更新

您的问题似乎专门针对 scikit-learn 的随机数生成器。据我所知,scikit-learn 始终使用numpy.random,所以你应该使用np.random.seed() 而不是random.seed()

一个重要的警告是np.random 不是线程安全的 - 如果你设置一个全局种子,然后启动几个子进程并使用np.random 在其中生成随机数,每个子进程将从其父进程继承 RNG 状态,这意味着您将在每个子流程中获得相同的随机变量。解决此问题的常用方法是将不同的种子(或 numpy.random.Random 实例)传递给每个子进程,这样每个子进程都有一个单独的本地 RNG 状态。

由于 scikit-learn 的某些部分可以使用 joblib 并行运行,您会看到某些类和函数可以选择传递种子或 np.random.RandomState 实例(例如 random_state= 参数到 sklearn.decomposition.MiniBatchSparsePCA )。我倾向于对脚本使用单个全局种子,然后根据全局种子为任何并行函数生成新的随机种子。

【讨论】:

  • 我在控制台中使用numpy.random 生成任何随机数。我不知道sklearn 在内部使用什么。因此我的问题。
  • 谢谢。我要问的一个原因是因为将numpy.random.RandomState 实例传递给sklearn.grid_search.GridSearchCV 的唯一方法是将对象显式传递给它的cv 参数,例如sklearn.cross_validation.StratifiedKFold。但是,该构造函数要求您在实例化模型时知道数据集中的行数。这意味着您必须在要将模型拟合到新数据时重新实例化模型,这不是您应该使用这些对象的方式。我会问有针对性的跟进
  • 我不确定我是否真的理解你的动机。您是否有某些特殊原因希望GridSearchCV 中的不同搜索参数的交叉验证折叠不同?据我所知,这不重要。
  • 我不是这个意思。我希望每次打开笔记本并按“全部运行”时折叠都相同,因为我需要结果可重现。
  • 作为一般原则,我认为最好将任何类型的元优化代码与模型类分开。它不仅更明​​确,而且还倾向于导致更多可重用的代码。
猜你喜欢
  • 1970-01-01
  • 2014-11-12
  • 2018-01-14
  • 2017-04-06
  • 2013-06-01
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多