train_test_split train test stratify sklearn kfold how data and python numpy random scikit-learn random-seed

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



train test split python (1)

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 ?

Editar: desde el 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 portátiles IPython para el análisis de datos. Algunos de los algoritmos de scikit-learn implican generar números aleatorios, y quiero asegurarme de que el cuaderno muestre los mismos resultados en cada ejecución.


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

Eso depende de si en su código está usando el generador de números aleatorios de numpy o el que está al 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á las secuencias aleatorias producidas por random.random() , y tampoco random.seed() no afectará a numpy.random.randn() etc. Si está utilizando random y numpy.random en su código, entonces necesitará establecer por separado las semillas 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 debes 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, 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 instancia numpy.random.Random ) a cada subproceso, de modo que cada uno tenga un estado RNG local separado.

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