Zufallszustand (Pseudozufallszahl) in Scikit lernen


148

Ich möchte einen Algorithmus für maschinelles Lernen in scikit learn implementieren, verstehe aber nicht, was dieser Parameter random_statebewirkt. Warum sollte ich es benutzen?

Ich konnte auch nicht verstehen, was eine Pseudozufallszahl ist.

Antworten:


220

train_test_splitteilt Arrays oder Matrizen in zufällige Zug- und Testteilmengen auf. Das bedeutet, dass Sie jedes Mal, wenn Sie es ohne Angabe ausführen random_state, ein anderes Ergebnis erhalten. Dies ist das erwartete Verhalten. Beispielsweise:

Lauf 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]]

Führen Sie 2 aus

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

Es ändert. Wenn Sie andererseits verwenden random_state=some_number, können Sie garantieren, dass die Ausgabe von Lauf 1 gleich der Ausgabe von Lauf 2 ist , dh Ihre Aufteilung ist immer gleich. Es spielt keine Rolle, wie random_statehoch die tatsächliche Zahl 42, 0, 21, ... ist. Wichtig ist, dass Sie jedes Mal, wenn Sie 42 verwenden, beim ersten Teilen immer dieselbe Ausgabe erhalten. Dies ist nützlich, wenn Sie reproduzierbare Ergebnisse wünschen, z. B. in der Dokumentation, damit jeder die gleichen Zahlen sehen kann, wenn er die Beispiele ausführt. In der Praxis würde ich sagen, Sie sollten die random_stateZahl beim Testen auf eine feste Zahl setzen, diese dann aber in der Produktion entfernen, wenn Sie wirklich eine zufällige (und keine feste) Aufteilung benötigen.

In Bezug auf Ihre zweite Frage ist ein Pseudozufallszahlengenerator ein Zahlengenerator, der fast wirklich Zufallszahlen generiert. Warum sie nicht wirklich zufällig sind , ist aus dem Rahmen dieser Frage und wird wahrscheinlich nicht in Ihrem Fall egal, können Sie einen Blick hier weitere Details bilden.


7
Welchen zufälligen Zustand ich also einstellen soll, sehe ich gewöhnlich diese Nummer 42.
Elizabeth Susan Joseph

1
@ElizabethSusanJoseph, es spielt keine Rolle, ich benutze immer 0, wenn ich Reproduzierbarkeit will oder keine andere. Kann Scikit Jungs wie 42 sein.
Elyase

53
Dies erklärt wahrscheinlich die Nummer 42, die so oft verwendet wird: en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy
denson

3
Gut, hier sind mehr Möglichkeiten .
Elyase

1
@Herbert Das ist eine schwierige Frage. Das Kern-PRNG-Zeug basiert auf numpy, was konsistent ist (sie haben nach einigen Problemen in der Vergangenheit viele Überprüfungen durchgeführt). Wenn es in sklearn keine Fehler bei der Verwendung gibt, verhält es sich auch konsistent. Ich würde dies annehmen (besonders für die weniger komplexen Funktionen wie Train-Test-Split und Co) Edit : Ups, ein bisschen spät :-)
Sascha

13

Wenn Sie das nicht random_statein Ihrem Code angeben , wird jedes Mal, wenn Sie Ihren Code ausführen (ausführen), ein neuer Zufallswert generiert, und die Zug- und Testdatensätze haben jedes Mal unterschiedliche Werte.

Wenn jedoch ein fester Wert wie folgt zugewiesen wird, ist random_state = 42das Ergebnis unabhängig davon, wie oft Sie Ihren Code ausführen, dasselbe .ie, dieselben Werte in Zug- und Testdatensätzen.


4

Wenn Sie den random_state im Code nicht erwähnen, wird bei jeder Ausführung Ihres Codes ein neuer Zufallswert generiert, und die Zug- und Testdatensätze haben jedes Mal unterschiedliche Werte.

Wenn Sie jedoch jedes Mal einen bestimmten Wert für random_state (random_state = 1 oder einen anderen Wert) verwenden, ist das Ergebnis dasselbe, dh dieselben Werte in Zug- und Testdatensätzen. Siehe folgenden 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,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))

Egal wie oft Sie den Code ausführen, die Ausgabe wird 70 sein.

70

Versuchen Sie, den random_state zu entfernen und den Code auszuführen.

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))

Jetzt ist die Ausgabe hier jedes Mal anders, wenn Sie den Code ausführen.


3

random_state number teilt die Test- und Trainingsdatensätze auf zufällige Weise auf. Zusätzlich zu dem, was hier erklärt wird, ist es wichtig zu bedenken, dass der random_state-Wert einen signifikanten Einfluss auf die Qualität Ihres Modells haben kann (mit Qualität meine ich im Wesentlichen die Genauigkeit der Vorhersage). Wenn Sie beispielsweise einen bestimmten Datensatz nehmen und ein Regressionsmodell damit trainieren, ohne den random_state-Wert anzugeben, besteht das Potenzial, dass Sie jedes Mal ein anderes Genauigkeitsergebnis für Ihr trainiertes Modell für die Testdaten erhalten. Daher ist es wichtig, den besten random_state-Wert zu finden, um das genaueste Modell zu erhalten. Und dann wird diese Nummer verwendet, um Ihr Modell bei einer anderen Gelegenheit zu reproduzieren, beispielsweise bei einem anderen Forschungsexperiment. Um dies zu tun,

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)`

1

Wenn kein Zufallsstatus vorhanden ist, verwendet das System einen Zufallsstatus, der intern generiert wird. Wenn Sie das Programm also mehrmals ausführen, werden möglicherweise unterschiedliche Zug- / Testdatenpunkte angezeigt, und das Verhalten ist unvorhersehbar. Falls Sie ein Problem mit Ihrem Modell haben, können Sie es nicht neu erstellen, da Sie die Zufallszahl nicht kennen, die beim Ausführen des Programms generiert wurde.

Wenn Sie die Baumklassifizierer sehen - entweder DT oder RF - versuchen sie, einen Versuch unter Verwendung eines optimalen Plans zu erstellen. Obwohl dieser Plan meistens derselbe ist, kann es Fälle geben, in denen der Baum und damit die Vorhersagen unterschiedlich sein können. Wenn Sie versuchen, Ihr Modell zu debuggen, können Sie möglicherweise nicht dieselbe Instanz neu erstellen, für die ein Baum erstellt wurde. Um all diesen Ärger zu vermeiden, verwenden wir beim Erstellen eines DecisionTreeClassifier oder RandomForestClassifier einen random_state.

PS: Sie können etwas genauer untersuchen, wie der Baum in DecisionTree erstellt wird, um dies besser zu verstehen.

randomstate wird grundsätzlich verwendet, um Ihr Problem bei jeder Ausführung gleich zu reproduzieren. Wenn Sie in traintestsplit keinen Zufallsstatus verwenden, erhalten Sie bei jeder Aufteilung möglicherweise einen anderen Satz von Zug- und Testdatenpunkten und helfen Ihnen beim Debuggen nicht, falls Sie ein Problem erhalten.

Aus Doc:

Wenn int, ist randomstate der Startwert, der vom Zufallszahlengenerator verwendet wird. Bei einer RandomState-Instanz ist randomstate der Zufallszahlengenerator. Wenn Keine, ist der Zufallszahlengenerator die von np.random verwendete RandomState-Instanz.


Gute Erklärung. Ich möchte nur hinzufügen, dass ein Grund, warum wir den Zufallsstatus übergeben würden, darin besteht, dass wir, wenn wir beispielsweise versuchen, Hyperparameter zu optimieren, aufgrund unterschiedlicher Initialisierungen basierend auf Zufallszahlen, die abdecken könnten, keine Schwankungen in der Bewertung haben möchten oder den Effekt der tatsächlichen Optimierung verbergen und somit nicht identifizieren konnten, welcher Teil der Score-Änderung auf die Parameteränderung und was auf den unterschiedlichen Startzustand des RNG zurückzuführen war.
Jottbe

-1
sklearn.model_selection.train_test_split(*arrays, **options)[source]

Teilen Sie Arrays oder Matrizen in zufällige Zug- und Testteilmengen auf

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

Wenn int, ist random_state der Startwert, der vom Zufallszahlengenerator verwendet wird. Bei einer RandomState-Instanz ist random_state der Zufallszahlengenerator. Wenn Keine, ist der Zufallszahlengenerator die von np.random verwendete RandomState-Instanz. Quelle: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

'' 'In Bezug auf den Zufallszustand wird er in vielen randomisierten Algorithmen in sklearn verwendet, um den zufälligen Startwert zu bestimmen, der an den Pseudozufallszahlengenerator übergeben wird. Daher regelt es keinen Aspekt des Verhaltens des Algorithmus. Infolgedessen entsprechen zufällige Zustandswerte, die im Validierungssatz gut abschneiden, nicht denen, die in einem neuen, unsichtbaren Testsatz gut abschneiden würden. Abhängig vom Algorithmus können Sie tatsächlich völlig unterschiedliche Ergebnisse sehen, wenn Sie nur die Reihenfolge der Trainingsmuster ändern. '' 'Quelle: /stats/263999/is-random-state-a-parameter -Stimmen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.