我应该使用 `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

从评论中的link,我了解到它们是不同的,并且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)。我倾向于为脚本使用单个全局种子,然后根据全局种子为任何并行函数生成新的随机种子。