train_test_split
divise les tableaux ou les matrices en sous-ensembles aléatoires de train et de test. Cela signifie que chaque fois que vous l'exécutez sans le spécifier random_state
, vous obtiendrez un résultat différent, c'est le comportement attendu. Par exemple:
Exécution 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]]
Exécutez 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'un autre côté, si vous utilisez random_state=some_number
, vous pouvez 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 random_state
nombre réel de 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 le fractionnement. Ceci est utile si vous voulez des résultats reproductibles, par exemple dans la documentation, afin que tout le monde puisse voir systématiquement les mêmes nombres quand ils exécutent les exemples. En pratique, je dirais que vous devriez définir random_state
un nombre fixe pendant que vous testez des éléments, mais supprimez-le en production si vous avez vraiment 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 vraiment aléatoires. Pourquoi ils ne sont pas vraiment aléatoires est hors du champ de cette question et n'aura probablement pas d'importance dans votre cas, vous pouvez jeter un œil ici pour plus de détails.