I'm using scikit-learn and numpy and I want to set the global seed so that my work is reproducible.
Should I use numpy.random.seed
or random.seed
?
From the link in the comments, I understand that they are different, and that the numpy version is not thread-safe. I want to know specifically which one to use to create IPython notebooks for data analysis. Some of the algorithms from scikit-learn involve generating random numbers, and I want to be sure that the notebook shows the same results on every run.
@ShayanAmani Numpy is faster for larger arrays of random indexes.
Seed function is used to save the state of a random function, so that it can generate same random numbers on multiple executions of the code on the same machine or on different machines (for a specific seed value). The seed value is the previous value number generated by the generator.
The numpy random seed is a numerical value that generates a new set or repeats pseudo-random numbers. The value in the numpy random seed saves the state of randomness. If we call the seed function using value 1 multiple times, the computer displays the same random numbers.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With