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

sha*_*ker 33 python random numpy scikit-learn random-seed

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

我应该使用numpy.random.seedrandom.seed

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

ali*_*i_m 31

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

  • 作为一般原则,我认为最好将任何类型的元优化代码与模型类分开.它不仅更明​​确,而且还倾向于导致更多可重用的代码. (3认同)
  • 谢谢。我问的一个原因是因为将 `numpy.random.RandomState` 实例传递给 `sklearn.grid_search.GridSearchCV` 的唯一方法是将对象显式传递给它的 `cv` 参数,例如 `sklearn.cross_validation.StratifiedKFold `. 但是,该构造函数要求您在实例化模型时知道数据集中的行数。这意味着每当您想将模型拟合到新数据上时,您都必须重新实例化模型,这不是您应该使用这些对象的方式。我会问有针对性的跟进 (2认同)