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.