我应该使用“ random.seed”还是“ numpy.random.seed”来控制“ scikit-learn”中的随机数生成?

发布于 2021-01-29 19:11:52

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

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

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

关注者
0
被浏览
125
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

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

    随机数生成器中numpy.random,并random具有完全独立的内部状态,所以numpy.random.seed()不会影响所产生的随机序列random.random(),同样random.seed()不会影响numpy.random.randn()如果你同时使用等random,并numpy.random在你的代码,那么你就需要分别设置两个种子。

    更新资料

    您的问题似乎专门针对scikit-learn的随机数生成器。据我所知,scikit-
    learnnumpy.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)。我倾向于将单个全局种子用于脚本,然后基于全局种子为任何并行函数生成新的随机种子。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看