首页 文章

我应该使用`random.seed`或`numpy.random.seed`来控制`scikit-learn`中的随机数生成?

提问于
浏览
25

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

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

Edit: 从评论中的链接,我知道它们是不同的,并且numpy版本不是线程安全的 . 我想知道哪一个用于创建IPython笔记本进行数据分析 . scikit-learn中的一些算法涉及生成随机数,我想确保笔记本在每次运行时都显示相同的结果 .

1 回答

  • 24

    我应该使用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) . 我倾向于使用单个全局种子作为脚本,然后基于任何并行函数的全局种子生成新的随机种子 .

相关问题