k-fache geschichtete Kreuzvalidierung mit unausgeglichenen Klassen

11

Ich habe Daten mit 4 Klassen und ich versuche, einen Klassifikator zu bauen. Ich habe ~ 1000 Vektoren für eine Klasse, ~ 10 ^ 4 für eine andere, ~ 10 ^ 5 für die dritte und ~ 10 ^ 6 für die vierte. Ich hatte gehofft, Kreuzvalidierung zu verwenden, also schaute ich auf die scikit-learn Dokumente .

Mein erster Versuch war, StratifiedShuffleSplit zu verwenden aber das gibt den gleichen Prozentsatz für jede Klasse, so dass die Klassen immer noch drastisch unausgeglichen sind.

  

Gibt es eine Möglichkeit, Kreuzvalidierung durchzuführen, aber mit den Klassen ausgeglichen in   das Trainings- und Testset?

Als Nebenbemerkung konnte ich den Unterschied zwischen StratifiedShuffleSplit und StratifiedKFold . Die Beschreibungen sehen mir sehr ähnlich.

    
eleanora 16.09.2015, 17:52
quelle

2 Antworten

14
  

Mein erster Versuch war, StratifiedShuffleSplit zu verwenden, aber das gibt den gleichen Prozentsatz für jede Klasse, was die Klassen noch drastisch unausgeglichen lässt.

Ich habe das Gefühl, dass Sie verwirren, was eine stratifizierte Strategie tun wird, aber Sie müssen Ihren Code und Ihre Ergebnisse zeigen, um sicher zu sein, was vor sich geht (der gleiche Prozentsatz wie ihr Prozentsatz im ursprünglichen Satz, oder der gleiche Prozentsatz innerhalb des zurückgegebenen Zuges / Testsatzes? Der erste ist, wie es sein soll).

  

Als Randnotiz konnte ich den Unterschied zwischen StratifiedShuffleSplit und StratifiedKFold nicht herausfinden. Die Beschreibungen sehen mir sehr ähnlich.

Einer davon sollte definitiv funktionieren. Die Beschreibung des ersten ist definitiv ein wenig verwirrend, aber hier ist, was sie tun.

StratifiedShuffleSplit

  

Bietet Zug / Testindizes zum Aufteilen von Daten in Zugprüfsätzen.

Dies bedeutet, dass es Ihre Daten in einen Zug und ein Testset aufteilt. Der stratifizierte Teil bedeutet, dass Prozentsätze in diesem Split beibehalten werden . Wenn also 10% Ihrer Daten in Klasse 1 und 90% in Klasse 2 ist, wird dafür sorgen, dass 10% Ihres Zuges in Klasse 1 und 90% in Klasse 2 . Gleiches gilt für den Testsatz.

Ihr Beitrag klingt so, als würden Sie 50% jeder Klasse im Test-Set wünschen. Das ist nicht die Stratifizierung, die Stratifizierung behält die ursprünglichen Prozentsätze bei. Du solltest sie beibehalten, weil du dir sonst eine irrelevante Vorstellung über die Leistung deines Klassifikators machst: Wen interessiert es, wie gut es einen 50/50 split klassifiziert hat, wenn du in der Praxis 10/90 splits siehst?

geschichtetesFold

  

Dieses Kreuzvalidierungsobjekt ist eine Variante von KFold, die geschichtete Falten zurückgibt. Die Falten werden erstellt, indem der Prozentsatz der Proben für jede Klasse beibehalten wird.

Siehe k-fache Kreuzvalidierung . Ohne Stratifizierung werden Ihre Daten nur in k falten aufgeteilt. Dann wird jede Falte 1 <= i <= k einmal als Testmenge verwendet, während die anderen für das Training verwendet werden. Die Ergebnisse werden am Ende gemittelt. Es ist vergleichbar mit dem Ausführen von ShuffleSplit k mal.

Die Stratifizierung stellt sicher, dass die Prozentsätze jeder Klasse in Ihren gesamten Daten in jeder einzelnen Falte gleich (oder sehr nahe) sind.

Es gibt eine Menge Literatur, die sich mit unausgewogenen Klassen befasst. Einige einfach zu verwendende Methoden beinhalten die Verwendung von Klassengewichten und die Analyse der ROC-Kurve. Ich empfehle die folgenden Ressourcen für Startpunkte:

  1. Ein Beispiel von scikit-learn zur Verwendung von Klassengewichten .
  2. Eine Frage zur Implementierung neuronaler Netzwerke für unausgewogene Daten .
  3. Diese stats.stackexchange-Frage mit ausführlicheren Antworten .
IVlad 16.09.2015, 19:53
quelle
1

K-Falten CV

K-Fold CV funktioniert durch zufällige Partitionierung Ihrer Daten in k (ziemlich) gleiche Partitionen. Wenn Ihre Daten gleichmäßig über Klassen wie [0,1,0,1,0,1,0,1,0,1] verteilt sind, ergibt eine Stichprobenauswahl mit (oder ohne Ersatz) ungefähr gleich große Stichprobengrößen von 0 und 1 .

Allerdings, wenn Ihre Daten ähnlicher sind %Code% Wenn eine Klasse die Daten repräsentiert, würde k-fache cv ohne gewichtete Stichprobe zu fehlerhaften Ergebnissen führen.

Wenn Sie gewöhnliche k-fache CV verwenden, ohne die Stichprobengewichte von der gleichmäßigen Stichprobe anzupassen, erhalten Sie etwas wie

%Vor%

wo es deutliche Splits ohne sinnvolle Darstellung beider Klassen gibt.

Der Punkt des k-fachen Lebenslaufs besteht darin, ein Modell über alle Teilmengen von Daten hinweg zu trainieren / zu testen, während bei jedem Versuch eine Teilmenge ausgelassen wird und an k-1 Teilmengen trainiert wird.

In diesem Szenario möchten Sie Split für Schicht verwenden. Im obigen Datensatz gibt es 27 [0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0] und 5 0s . Wenn Sie k = 5 CV berechnen möchten, wäre es nicht sinnvoll, die Schichten von 1s in 5 Teilmengen aufzuteilen. Eine bessere Lösung ist es, es in k & lt; 5 Untergruppen, wie zB 2. Die Schichten von 1 können mit k = 5 teilen bleiben, da sie viel größer sind. Dann hätten Sie während des Trainings ein einfaches Produkt von 0s aus dem Datensatz. Hier ist ein Code zur Veranschaulichung

%Vor%

Mit dieser Methode können die Daten in Partitionen aufgeteilt werden, in denen schließlich alle Partitionen zum Testen fehlen. Es sollte beachtet werden, dass nicht alle statistischen Lernmethoden eine Gewichtung zulassen, daher ist die Anpassung von Methoden wie CV für die Berücksichtigung von Stichprobenanteilen unerlässlich.

  • Referenz: James, G., Witten, D., Hastie, T., & amp; Tibshirani, R. (2013). Eine Einführung in das statistische Lernen: Mit Anwendungen in R.
Jon 13.02.2018 00:59
quelle