¿Debo usar `random.seed` o` numpy.random.seed` para controlar la generación de números aleatorios en `scikit-learn`?

Estoy usando scikit-learn y numpy y quiero establecer la semilla global para que mi trabajo sea reproducible.

¿Debo usar numpy.random.seed o random.seed ?

Edición: Del enlace en los comentarios, entiendo que son diferentes y que la versión numpy no es segura para subprocesos. Quiero saber específicamente cuál usar para crear cuadernos IPython para el análisis de datos. Algunos de los algoritmos de scikit-learn implican la generación de números aleatorios, y quiero estar seguro de que la notebook muestre los mismos resultados en cada ejecución.

¿Debo usar np.random.seed o random.seed?

Eso depende de si en tu código estás usando el generador de números aleatorios de numpy o el random .

Los generadores de números aleatorios en numpy.random y random tienen estados internos totalmente separados, por lo que numpy.random.seed() no afectará a las secuencias aleatorias producidas por random.random() , y también random.seed() no afectará a numpy.random.randn() etc. Si está usando random y numpy.random en su código, entonces deberá establecer las semillas por separado para ambos.

Actualizar

Su pregunta parece ser específicamente sobre los generadores de números aleatorios de scikit-learn. Por lo que puedo decir, scikit-learn usa numpy.random todo momento, por lo que deberías usar np.random.seed() lugar de random.seed() .

Una advertencia importante es que np.random no es seguro para subprocesos: si establece una semilla global, entonces inicie varios subprocesos y genere números aleatorios dentro de ellos usando np.random , cada subproceso heredará el estado RNG de su padre, lo que significa que obtendrá Variables aleatorias idénticas en cada subproceso. La forma habitual de solucionar este problema es pasar una semilla diferente (o numpy.random.Random instance) a cada subproceso, de modo que cada uno tenga un estado RNG local separado.

Como algunas partes de scikit-learn pueden ejecutarse en paralelo utilizando joblib, verá que algunas clases y funciones tienen la opción de pasar una instancia de seed o np.random.RandomState (por ejemplo, el parámetro random_state= a sklearn.decomposition.MiniBatchSparsePCA ). Tiendo a usar una única semilla global para un script, luego generar nuevas semillas aleatorias basadas en la semilla global para cualquier función paralela.