train_test_split train test stratifiedshufflesplit kfold example data cross code and python scikit-learn

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