Estado aleatorio (número pseudoaleatorio) en Scikit learn

148

Quiero implementar un algoritmo de aprendizaje automático en scikit learn, pero no entiendo qué hace este parámetro random_state. ¿Por qué debería usarlo?

Tampoco pude entender qué es un número pseudoaleatorio.

Elizabeth Susan Joseph
fuente

Respuestas:

220

train_test_splitdivide matrices o matrices en trenes aleatorios y subconjuntos de prueba. Eso significa que cada vez que lo ejecute sin especificar random_state, obtendrá un resultado diferente, este es el comportamiento esperado. Por ejemplo:

Ejecución 1:

>>> a, b = np.arange(10).reshape((5, 2)), range(5)
>>> train_test_split(a, b)
[array([[6, 7],
        [8, 9],
        [4, 5]]),
 array([[2, 3],
        [0, 1]]), [3, 4, 2], [1, 0]]

Correr 2

>>> train_test_split(a, b)
[array([[8, 9],
        [4, 5],
        [0, 1]]),
 array([[6, 7],
        [2, 3]]), [4, 2, 0], [3, 1]]

Cambia. Por otro lado, si lo usa random_state=some_number, puede garantizar que la salida de la ejecución 1 será igual a la salida de la ejecución 2 , es decir, su división será siempre la misma. No importa cuál sea el random_statenúmero real 42, 0, 21, ... Lo importante es que cada vez que use 42, siempre obtendrá la misma salida la primera vez que realice la división. Esto es útil si desea resultados reproducibles, por ejemplo en la documentación, para que todos puedan ver los mismos números de manera consistente cuando ejecutan los ejemplos. En la práctica, diría que debe establecer random_stateun número fijo mientras prueba cosas, pero luego eliminarlo en producción si realmente necesita una división aleatoria (y no fija).

Con respecto a su segunda pregunta, un generador de números pseudoaleatorios es un generador de números que genera números casi verdaderamente aleatorios. Por qué no son realmente aleatorios está fuera del alcance de esta pregunta y probablemente no importará en su caso, puede echar un vistazo aquí para obtener más detalles.

elyase
fuente
77
Entonces, ¿qué estado aleatorio debo establecer, comúnmente veo este número 42.
Elizabeth Susan Joseph
1
@ElizabethSusanJoseph, no importa mucho, siempre uso 0 si quiero reproducibilidad o Ninguno de lo contrario. Pueden ser chicos de scikit como 42.
elyase
53
Esto probablemente explica el número 42 que se usa con tanta frecuencia: en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy
denson
3
Buena, aquí hay más posibilidades .
elyase
1
@Herbert Esa es una pregunta difícil. El núcleo de PRNG se basa en numpy, que es consistente (introdujeron muchas comprobaciones para esto después de algún problema en el pasado). Si no hay errores de uso en sklearn, también se comportará de manera coherente. Supongo que esto (especialmente para las funciones menos complejas como train-test-split y co) Editar : oops, un poco tarde :-)
sascha
13

Si no especifica el random_stateen su código, cada vez que ejecuta (ejecuta) su código, se genera un nuevo valor aleatorio y el tren y los conjuntos de datos de prueba tendrían valores diferentes cada vez.

Sin embargo, si se asigna un valor fijo como random_state = 42entonces, no importa cuántas veces ejecute su código, el resultado sería el mismo, es decir, los mismos valores en los conjuntos de datos de tren y prueba.

Umar Salman
fuente
4

Si no menciona random_state en el código, cada vez que ejecute su código se generará un nuevo valor aleatorio y el tren y los conjuntos de datos de prueba tendrán valores diferentes cada vez.

Sin embargo, si usa un valor particular para random_state (random_state = 1 o cualquier otro valor) cada vez que el resultado sea el mismo, es decir, los mismos valores en los conjuntos de datos de tren y prueba. Consulte el siguiente código:

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,random_state = 1,test_size = .3)
size25split = train_test_split(test_series,random_state = 1,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

No importa cuántas veces ejecute el código, el resultado será 70.

70

Intenta eliminar random_state y ejecuta el código.

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,test_size = .3)
size25split = train_test_split(test_series,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

Ahora aquí la salida será diferente cada vez que ejecute el código.

Rishi Bansal
fuente
3

random_state number divide los conjuntos de datos de prueba y entrenamiento de manera aleatoria. Además de lo que se explica aquí, es importante recordar que el valor de random_state puede tener un efecto significativo en la calidad de su modelo (por calidad me refiero a la precisión para predecir). Por ejemplo, si toma un determinado conjunto de datos y entrena un modelo de regresión con él, sin especificar el valor de random_state, existe la posibilidad de que cada vez obtenga un resultado de precisión diferente para su modelo entrenado en los datos de prueba. Por lo tanto, es importante encontrar el mejor valor de random_state para proporcionarle el modelo más preciso. Y luego, ese número se utilizará para reproducir su modelo en otra ocasión, como otro experimento de investigación. Para hacerlo

for j in range(1000):

            X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =j,     test_size=0.35)
            lr = LarsCV().fit(X_train, y_train)

            tr_score.append(lr.score(X_train, y_train))
            ts_score.append(lr.score(X_test, y_test))

        J = ts_score.index(np.max(ts_score))

        X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =J, test_size=0.35)
        M = LarsCV().fit(X_train, y_train)
        y_pred = M.predict(X_test)`
Arad Haselirad
fuente
1

Si no hay un estado aleatorio siempre que el sistema utilice un estado aleatorio que se genera internamente. Entonces, cuando ejecuta el programa varias veces, puede ver diferentes puntos de datos de tren / prueba y el comportamiento será impredecible. En caso de que tenga un problema con su modelo, no podrá volver a crearlo, ya que no conoce el número aleatorio que se generó cuando ejecutó el programa.

Si ve los clasificadores de árbol, ya sea DT o RF, intentan crear una prueba utilizando un plan óptimo. Aunque la mayoría de las veces este plan podría ser el mismo, podría haber casos en los que el árbol podría ser diferente y, por lo tanto, las predicciones. Cuando intenta depurar su modelo, es posible que no pueda recrear la misma instancia para la que se creó un Árbol. Por lo tanto, para evitar toda esta molestia, usamos random_state al construir un DecisionTreeClassifier o RandomForestClassifier.

PD: Puede profundizar un poco sobre cómo se construye el Árbol en DecisionTree para comprenderlo mejor.

randomstate se usa básicamente para reproducir su problema de la misma manera cada vez que se ejecuta. Si no utiliza un estado aleatorio en traintestsplit, cada vez que realice la división, puede obtener un conjunto diferente de puntos de datos de prueba y tren y no lo ayudará a depurar en caso de que surja un problema.

De Doc:

Si int, randomstate es la semilla utilizada por el generador de números aleatorios; Si es una instancia RandomState, randomstate es el generador de números aleatorios; Si no hay ninguno, el generador de números aleatorios es la instancia RandomState utilizada por np.random.

MdNazmulHossain
fuente
Buena explicación. Solo agregaría que una razón por la que pasaríamos el estado aleatorio es que, por ejemplo, si intentamos optimizar los hiperparámetros, no queremos tener fluctuaciones en el puntaje debido a diferentes inicializaciones basadas en números aleatorios, que podrían cubrir u ocultar el efecto de la optimización real y, por lo tanto, no pudimos identificar qué parte del cambio de puntuación se debió al cambio de parámetro y qué se debió al diferente estado de inicio del RNG.
jottbe
-1
sklearn.model_selection.train_test_split(*arrays, **options)[source]

Dividir matrices o matrices en trenes aleatorios y subconjuntos de prueba

Parameters: ... 
    random_state : int, RandomState instance or None, optional (default=None)

Si int, random_state es la semilla utilizada por el generador de números aleatorios; Si es una instancia RandomState, random_state es el generador de números aleatorios; Si no hay ninguno, el generador de números aleatorios es la instancia RandomState utilizada por np.random. fuente: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

'' 'Con respecto al estado aleatorio, se utiliza en muchos algoritmos aleatorios en sklearn para determinar la semilla aleatoria pasada al generador de números pseudoaleatorios. Por lo tanto, no gobierna ningún aspecto del comportamiento del algoritmo. Como consecuencia, los valores de estado aleatorio que funcionaron bien en el conjunto de validación no corresponden a los que funcionarían bien en un nuevo conjunto de prueba invisible. De hecho, dependiendo del algoritmo, puede ver resultados completamente diferentes simplemente cambiando el orden de las muestras de entrenamiento '' 'fuente: /stats/263999/is-random-state-a-parameter sintonizar

Bogdan Korecki
fuente