Selbe Testdaten für verschiedene Probleme auswählen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Ich habe einen Decision Tree implementiert und möchte ihn mit verschiedenen Daten testen.
Der Datensatz enthält zB 200 items, die ich zufällig in 70% Training- und 30% Testdaten aufteile. Mein zweiter Datensatz enthält die "selben" 200 items, nur das Label/ die Klasse der items ist etwas verschieden zu dem ersten. Um die beiden Ergebnisse sinnvoll vergleichen zu können, bräuchte ich die gleichen items in den Trainings/ Testdaten.
Der "random_state" parameter hilft mir da ja nicht weiter, der sorgt nur dafür dass ich innerhalb eines Modells den gleichen Split behalte, nicht aber sobald ich einen neuen Datensatz einlese.
Hat hier jemand eine Idee?
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Ich nehme an du benutzt z.B. sklearn.model_selection.train_test_split(X,y, random_state=42)
Wenn in deinem zweiten Datensatz die "selben" 200 Items die gleiche Reihenfolge haben wie im ersten,
liefert dir obige Funktion den gleichen Split an Train Items und Test Items.
Wenn sie nicht die gleiche Reihenfolge haben, musst du schauen, ob du die gleiche Reihenfolge herstellen kannst.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Ja genau ich verwende die train_test_split Funktion. Die Daten haben die gleiche Reihenfolge, alle features sind gleich nur eben das Label ist verschieden. Trotzdem, liefert die Funktion nicht den gleichen Split
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

musste soeben feststellen, dass der Parameter "shuffle" standardmäßig True gesetzt ist.
Das sollte imho so nicht sein.
Du musst also schreiben:

Code: Alles auswählen

X_train, X_test, y_train, y_test = train_test_split(X, y1, test_size=0.3, random_state=42, shuffle=False)
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Also, habe mir die Funktion noch mal genauer angeschaut.
Wenn shuffle=False gesetzt wird, ist random_state= unnötig, da nicht gemischt wird.
Wenn shuffle=True ist, wird die Reihenfolge der Reihen der features und labels gleich gemischt.
Beispielcode:

Code: Alles auswählen

import numpy as np

samples = np.arange(10)

features = np.array([samples+i for i in range(1, 11)])
labels1 = samples + 80
labels2 = samples + 90

# 1. Datensatz
X_train, X_test, y_train, y_test = train_test_split(features, labels1, test_size=0.3, random_state=42, shuffle=True)
print("X_train")
print(X_train)
print("X_test")
print(X_test)
print("y_train")
print(y_train)
print("y_test")
print(y_test)
print()

# 2. Datensatz
X_train, X_test, y_train, y_test = train_test_split(features, labels2, test_size=0.3, random_state=42, shuffle=True)
print("X_train")
print(X_train)
print("X_test")
print(X_test)
print("y_train")
print(y_train)
print("y_test")
print(y_test)
print()
Wenn das bei dir nicht so ist, ist die Reihenfolge bei dir nicht gleich, benutzt du unterschiedliche random_state= Werte?
Oder eventuell gar kein random_state= ?
Wenn du keinen Seed angibst, ist der zufällig ! Das wäre die Erklärung.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Danke für die Antwort! Habe den Fehler gefunden: Ich hatte den parameter stratify auf true gesetzt...das funktioniert dann natürlich nicht mehr wenn man einen anderen Datensatz hat
Antworten