我正在使用scikit-learn和numpy,我想设置全局种子,以便我的工作可以重现。
我应该使用numpy.random.seed
还是random.seed
?
修改
从评论中的链接,我知道它们是不同的,并且numpy版本不是线程安全的。我想知道哪一个用于创建IPython笔记本进行数据分析。 scikit-learn中的一些算法涉及生成随机数,我想确保笔记本在每次运行时都显示相同的结果。
1 个答案:
答案 0 :(得分:27)
Should I use np.random.seed or random.seed?
That depends on whether in your code you are using numpy's random number generator or the one in random.
The random number generators in numpy.random and random have totally separate internal states, so numpy.random.seed() will not affect the random sequences produced by random.random(), and likewise random.seed() will not affect numpy.random.randn() etc. If you are using both random and numpy.random in your code then you will need to separately set the seeds for both.
Update
Your question seems to be specifically about scikit-learn's random number generators. As far as I can tell, scikit-learn uses numpy.random throughout, so you should use np.random.seed() rather than random.seed().
One important caveat is that np.random is not threadsafe - if you set a global seed, then launch several subprocesses and generate random numbers within them using np.random, each subprocess will inherit the RNG state from its parent, meaning that you will get identical random variates in each subprocess. The usual way around this problem is to pass a different seed (or numpy.random.Random instance) to each subprocess, such that each one has a separate local RNG state.
Since some parts of scikit-learn can run in parallel using joblib, you will see that some classes and functions have an option to pass either a seed or an np.random.RandomState instance (e.g. the random_state= parameter to sklearn.decomposition.MiniBatchSparsePCA). I tend to use a single global seed for a script, then generate new random seeds based on the global seed for any parallel functions.