Je souhaite implémenter un algorithme d'apprentissage machine dans scikit learn, mais je ne comprends pas ce que fait ce paramètre random_state
Pourquoi devrais-je l'utiliser?
Je ne pouvais pas non plus comprendre ce qu'est un nombre pseudo-aléatoire.
train_test_split
divise les tableaux ou les matrices en trains et en tests aléatoires. Cela signifie que chaque fois que vous l'exécutez sans spécifier random_state
, vous obtiendrez un résultat différent, il s'agit du comportement attendu. Par exemple:
Run 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]]
Run 2
>>> train_test_split(a, b)
[array([[8, 9],
[4, 5],
[0, 1]]),
array([[6, 7],
[2, 3]]), [4, 2, 0], [3, 1]]
Ça change. D'autre part, si vous utilisez random_state=some_number
, vous pouvez alors garantir que la sortie de Run 1 sera égale à la sortie de Run 2, c'est-à-dire que votre partage sera toujours le même. Peu importe le nombre actuel de random_state
42, 0, 21, ... L’important est que chaque fois que vous utilisez 42, vous obtiendrez toujours la même sortie la première fois que vous effectuez la scission ..__ Ceci est utile si vous souhaitez obtenir des résultats reproductibles, par exemple dans la documentation, afin que tout le monde puisse voir systématiquement les mêmes chiffres lorsqu’ils exécutent les exemples. En pratique, je dirais que vous devez définir le random_state
sur un nombre fixe pendant que vous testez des éléments, puis le supprimer en production si vous avez réellement besoin d’un fractionnement aléatoire (et non fixe).
En ce qui concerne votre deuxième question, un générateur de nombres pseudo-aléatoires est un générateur de nombres qui génère des nombres presque réellement aléatoires. Pourquoi ils ne sont pas vraiment aléatoires est hors du champ de cette question et n'aura probablement aucune importance dans votre cas, vous pouvez jeter un coup d'oeil ici forme plus de détails.
Si vous ne spécifiez pas le random_state
dans votre code, chaque fois que vous exécutez (exécutez) votre code, une nouvelle valeur aléatoire est générée et les ensembles de données train et test auront des valeurs différentes à chaque fois.
Cependant, si une valeur fixe est affectée, telle que random_state = 42
, quel que soit le nombre d'exécution du code, le résultat sera le même .i.e, les mêmes valeurs dans les jeux de données train et test.
random_state number divise les jeux de données de test et d'apprentissage de manière aléatoire. En plus de ce qui est expliqué ici, il est important de rappeler que la valeur random_state peut avoir un effet significatif sur la qualité de votre modèle (par qualité, je parle essentiellement de la précision à prédire). Par exemple, si vous prenez un certain jeu de données et entraînez un modèle de régression avec celui-ci, sans spécifier la valeur random_state, vous obtiendrez à chaque fois un résultat d'exactitude différent pour votre modèle formé sur les données de test. Il est donc important de trouver la meilleure valeur random_state pour vous fournir le modèle le plus précis. Et ensuite, ce numéro sera utilisé pour reproduire votre modèle à une autre occasion, telle qu'une autre expérience de recherche. Pour cela, il est possible de scinder et d’entraîner le modèle dans une boucle for en affectant des nombres aléatoires au paramètre random_state:
`pour j dans la plage (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)`
Si vous ne mentionnez pas random_state dans le code, chaque fois que vous exécutez votre code, une nouvelle valeur aléatoire est générée et les ensembles de données train et test auront des valeurs différentes à chaque fois.
Toutefois, si vous utilisez une valeur particulière pour random_state (random_state = 1 ou toute autre valeur) chaque fois que le résultat sera identique, c'est-à-dire les mêmes valeurs dans les ensembles de données train et test .
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))
Peu importe le nombre de fois que vous exécutez le code, la sortie sera 70.
70
Essayez de supprimer le random_state et exécutez le code.
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))
Maintenant, la sortie sera différente chaque fois que vous exécuterez le code.