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?
编辑:
通过注释中的链接,我知道它们是不同的,并且numpy版本不是线程安全的。 我想特别知道要使用哪个创建IPython笔记本进行数据分析。 scikit-learn的某些算法涉及生成随机数,我想确保笔记本在每次运行时都显示相同的结果。
-
使用np.random.seed()您将不需要导入任何内容,但是使用random.seed()您将需要导入random模块
-
请不要设置全局种子,这是不安全的。 您可以创建自己的random对象并设置其种子。 阅读Muhammad Alkarouri对此问题的最后评论,以寻求更安全的解决方法:stackoverflow.com/a/3717456/1524913
-
@Leb感谢您的链接,但不清楚在我的情况下应该使用哪一个。 我编辑了问题。
-
@JeromeJ尚不清楚该示例如何使用color_rnd。 如果我运行color_rnd.seed(1234),是否会像sklearn.cross_validation.KFold这样的函数"知道"使用它而不是通常使用的RNG?
-
如果他们直接不幸地依赖random,他们可能不会。 我的意思是,至少到那时。 每当您键入代码时,请避免直接使用random本身。 我不确定在您的情况下该怎么做,那真是太无聊了。 也许是一个装饰器,但我认为您必须修改函数上下文,但我不是100%肯定,因此Id必须对其进行更深入的研究。
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)。我倾向于将单个全局种子用于脚本,然后基于全局种子为任何并行函数生成新的随机种子。
-
我在控制台中使用numpy.random生成任何随机数。我不知道sklearn在内部使用什么。因此,我的问题。
-
谢谢。我问的一个原因是,将numpy.random.RandomState实例传递给sklearn.grid_search.GridSearchCV的唯一方法是显式地将对象传递给其cv自变量,例如sklearn.cross_validation.StratifiedKFold。但是,该构造函数要求您在实例化模型时知道数据集中的行数。这意味着无论何时要将模型适合新数据,都必须重新实例化它,而这不是您应该使用这些对象的方式。生病了要有针对性的跟进
-
我不确定我是否真的了解您的动机。对于某些GridSearchCV中的不同搜索参数,为什么要使交叉验证折叠数不同,是否有某些特殊原因?据我所知,这无关紧要。
-
那不是我的意思。我希望每次打开笔记本并按"全部运行"时褶皱都一样,因为我需要结果是可重现的。
-
好的,在这种情况下,您每次想适合一些新数据时,是否只能创建一个新的cv实例(使用相同的全局种子,或使用从其衍生的一些新的随机种子)?
-
我希望避免这种情况。但是我只是对其进行了演示,因此必须创建一个新实例以适应新数据实际上可能是一项功能,而不是错误。"显式优于隐式"等。
-
作为一般原则,我认为最好将任何一种元优化代码与模型类分开。它不仅更加明确,而且还倾向于导致可重用的代码。