关于python:我应该使用`random.seed`还是`numpy.random.seed`来控制`scikit-learn`中的随机数生成吗?

Should I use `random.seed` or `numpy.random.seed` to control random number generation in `scikit-learn`?

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

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

编辑:
通过注释中的链接,我知道它们是不同的,并且numpy版本不是线程安全的。 我想特别知道要使用哪个创建IPython笔记本进行数据分析。 scikit-learn的某些算法涉及生成随机数,我想确保笔记本在每次运行时都显示相同的结果。


Should I use np.random.seed or 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)。我倾向于将单个全局种子用于脚本,然后基于全局种子为任何并行函数生成新的随机种子。