[PYTHON] Benötigen Sie random_state für train_test_split in sklearn

Was ist train_test_split?

Train_test_split ist eine häufig verwendete Funktion beim maschinellen Lernen. Dies ist eine Funktion, die das Array von Numpy oder den Datenrahmen von Pandas teilt und die Zugdaten und Testdaten leicht teilt.

Was ist random_state

random_state ist ein Wert, mit dem train_test_split die Reihenfolge, in der Daten aufgeteilt werden, randomisiert und so korrigiert, dass dieselbe zufällige Aufteilung zurückgegeben wird, unabhängig davon, wie oft sie ausgeführt wird. Wenn Sie mit dieser Funktion nicht random_state in das Argument einfügen, ändern sich die Zugdaten bei jeder Ausführung, wodurch die Abstimmung von Hyperparametern bedeutungslos wird, oder die Zugdaten, wenn Sie mehrere Modelle erstellen und eine Mehrheitsentscheidung treffen (Ensemble-Methode). Es ist eine Geschichte, dass verschiedene Dinge zu Überlernen führen.

Erstellen Sie zunächst einen Datenrahmen für das Experiment.

import pandas as pd
from sklearn.model_selection import train_test_split
df=pd.DataFrame({"a":[1,2,3,4,5],"b":[1,2,3,4,5]})
print(df)
   a  b
0  1  1
1  2  2
2  3  3
3  4  4
4  5  5

Dann train_test_split. Sie können das Verhältnis angeben, indem Sie float entweder in train_size oder test_size eingeben, und die Zahl, indem Sie int eingeben. Dies ist jedoch verwirrend. Daher ist es besser, train_size = 4 und test_size = 1 explizit anzugeben. Überlegen.

train_x, test_x = train_test_split(df, train_size=4, test_size=1)
print(train_x)
print(test_x)
   a  b
1  2  2
2  3  3
0  1  1
3  4  4

Code ohne random_state

Dieser Code gibt jedes Mal andere Zug- und Testdaten zurück.

for i in range(3):
    train_x, test_x = train_test_split(df, train_size=4, test_size=1)
    print()
    print(i,"Zeit")
    print(train_x)
    print(test_x)
0. Mal
   a  b
2  3  3
3  4  4
4  5  5
0  1  1
   a  b
1  2  2

Erstes Mal
   a  b
2  3  3
4  5  5
1  2  2
0  1  1
   a  b
3  4  4

Zweites Mal
   a  b
4  5  5
0  1  1
1  2  2
3  4  4
   a  b
2  3  3

Wenn Sie beispielsweise versuchen, aus diesen drei Daten drei verschiedene Modelle zu erstellen und eine Mehrheitsentscheidung zu treffen (Ensemblemethode) asdfasdf.png Auf diese Weise sind die für jedes Modell gelernten Zugdaten unterschiedlich, und da das Modell keine unbekannten Teile aufweist, wird erwartet, dass zum Zeitpunkt der Mehrheitsentscheidung des Tests eine hohe Genauigkeit erzielt wird. Random_state ist erforderlich, um dieses Übertraining zu vermeiden.

Code mit random_state

for i in range(3):
    train_x, test_x= train_test_split(df, train_size=4, test_size=1, random_state=42)
    print()
    print(i,"Zeit")
    print(train_x)
    print(test_x)
0. Mal
   a  b
4  5  5
2  3  3
0  1  1
3  4  4
   a  b
1  2  2

Erstes Mal
   a  b
4  5  5
2  3  3
0  1  1
3  4  4
   a  b
1  2  2

Zweites Mal
   a  b
4  5  5
2  3  3
0  1  1
3  4  4
   a  b
1  2  2

Da test_x auf [2 2] festgelegt ist, wird dieselbe zufällige Division zurückgegeben, unabhängig davon, wie oft sie ausgeführt wird, sodass unbekannte Daten während des Trainings gesichert und Übertraining vermieden werden kann.

Recommended Posts

Benötigen Sie random_state für train_test_split in sklearn
Notwendigkeit für __name__ == "__main__", wie in zirkulären Importproblemen zu sehen
Suchen Sie nach Zeichenfolgen in Dateien
Techniken zum Sortieren in Python
Über "für _ in range ():" von Python
Über die Notwendigkeit eines ersten Schrägstrichs im Abonnenten- und Herausgebernamen