web-dev-qa-db-de.com

Zufälliger Zustand (Pseudo-Zufallszahl) beim Scikit-Lernen

Ich möchte einen maschinellen Lernalgorithmus in scikit learn implementieren, verstehe aber nicht, was dieser Parameter random_state tut. Warum sollte ich es verwenden? 

Ich konnte auch nicht verstehen, was eine Pseudo-Zufallszahl ist. 

train_test_split teilt Arrays oder Matrizen in zufällige Zug- und Testuntergruppen auf. Das heißt, jedes Mal, wenn Sie es ausführen, ohne random_state anzugeben, erhalten Sie ein anderes Ergebnis. Dies ist das erwartete Verhalten. Zum Beispiel:

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

Es ändert. Wenn Sie dagegen random_state=some_number verwenden, können Sie garantieren, dass die Ausgabe von Run 1 mit der Ausgabe von Run 2 übereinstimmt, d. H. Ihre Aufteilung ist immer gleich. Es spielt keine Rolle, was die tatsächliche random_state-Nummer 42, 0, 21, ... ist. Wichtig ist, dass Sie bei jeder Verwendung von 42 immer die gleiche Ausgabe erhalten, wenn Sie den Split zum ersten Mal ausführen. 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 den random_state während des Testens auf eine feste Zahl setzen, aber dann in der Produktion entfernen, wenn Sie wirklich einen zufälligen (und keinen festen) Split benötigen.

Bei Ihrer zweiten Frage handelt es sich bei einem Pseudo-Zufallszahlengenerator um einen Zahlengenerator, der fast echte Zufallszahlen generiert. Warum sie nicht wirklich zufällig sind, liegt außerhalb des Rahmens dieser Frage und wird in Ihrem Fall wahrscheinlich keine Rolle spielen. Sie können sich here hier mehr Details ansehen.

126
elyase

Wenn Sie in Ihrem Code keinen random_state 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 andere Werte.

Wenn jedoch ein fester Wert wie random_state = 42 zugewiesen wird, würde das Ergebnis, unabhängig davon, wie oft Sie Ihren Code ausführen, dieselben .i.e-Werte annehmen, dieselben Werte in Zug- und Test-Datasets.

7
umar salman

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 wissen, dass der Wert von random_state einen erheblichen Einfluss auf die Qualität Ihres Modells haben kann (mit Qualität meine ich im Wesentlichen Genauigkeit, die vorhergesagt werden kann). Wenn Sie beispielsweise ein bestimmtes Dataset nehmen und damit ein Regressionsmodell trainieren, ohne den Wert für random_state anzugeben, besteht die Möglichkeit, dass jedes Mal ein anderes Genauigkeitsergebnis für Ihr trainiertes Modell in den Testdaten angezeigt wird. Daher ist es wichtig, den besten Wert für random_state zu finden, um das genaueste Modell zu erhalten. Diese Nummer wird dann verwendet, um Ihr Modell bei einer anderen Gelegenheit zu reproduzieren, beispielsweise bei einem anderen Forschungsexperiment. Dazu ist es möglich, das Modell in einer for-Schleife aufzuteilen und zu trainieren, indem dem random_state-Parameter Zufallszahlen zugewiesen werden:

für j in Reichweite (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)`
0
Arad Haselirad

Wenn Sie im Code keinen random_state erwähnen, wird bei jeder Ausführung des Codes ein neuer Zufallswert generiert, und die Zug- und Testdatensätze hätten jedes Mal andere Werte.

Wenn Sie jedoch einen bestimmten Wert für random_state (random_state = 1 oder einen anderen Wert) verwenden, wird das Ergebnis jedes Mal das gleiche sein, d. H. Dieselben Werte in Zug- und Testdatensätzen.

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

Es spielt keine Rolle, wie oft Sie den Code ausführen, die Ausgabe wird 70 sein. 

70

Versuchen Sie, 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 bei jeder Ausführung des Codes anders.

0
Rishi Bansal