python - stratifiedshufflesplit - train_test_split
Estado aleatorio(nĂºmero pseudoaleatorio) en Scikit learn (6)
Si no especifica
random_state
en su código, cada vez que ejecuta (ejecuta) su código, se genera un nuevo valor aleatorio y los conjuntos de datos de tren y prueba tendrán valores diferentes cada vez.
Sin embargo, si se asigna un valor fijo como
random_state = 42
, 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.
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.
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 un intento 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 volver a crear la misma instancia para la que se creó un Árbol. Entonces, para evitar toda esta molestia, usamos un 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 tren y prueba 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.
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.
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 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, es posible dividir y entrenar el modelo en un ciclo for mediante la asignación de números aleatorios al parámetro random_state:
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)`
train_test_split
divide matrices o matrices en subconjuntos aleatorios de trenes y pruebas.
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 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 número
random_state
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_state
en un 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 here obtener más detalles.
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 la instancia de 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 que se pasa 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, es posible que vea resultados completamente diferentes simplemente cambiando el orden de las muestras de entrenamiento '''' ''fuente: https://stats.stackexchange.com/questions/263999/is-random-state-a-parameter-to-tune