我应该使用 `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.random
和random
中的随机数生成器具有完全独立的内部状态,因此numpy.random.seed()
不会影响random.random()
生成的随机序列,同样random.seed()
不会影响 numpy.random.randn()
等。如果您在代码中同时使用 random
和 numpy.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
)。我倾向于为脚本使用单个全局种子,然后根据全局种子为任何并行函数生成新的随机种子。
我正在使用 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.random
和random
中的随机数生成器具有完全独立的内部状态,因此numpy.random.seed()
不会影响random.random()
生成的随机序列,同样random.seed()
不会影响 numpy.random.randn()
等。如果您在代码中同时使用 random
和 numpy.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
)。我倾向于为脚本使用单个全局种子,然后根据全局种子为任何并行函数生成新的随机种子。