Muss ich bei einer unsymmetrischen Klasse eine Stichprobe für meine Validierungs- / Testdatensätze verwenden?


13

Ich bin ein Anfänger im maschinellen Lernen und stehe vor einer Situation. Ich arbeite an einem Real Time Bidding-Problem mit dem IPinYou-Dataset und versuche, eine Klickvorhersage zu erstellen.

Die Sache ist, wie Sie vielleicht wissen, dass der Datensatz sehr unausgeglichen ist: Rund 1300 negative Beispiele (ohne Klick) für 1 positives Beispiel (Klick).

Das ist was ich mache:

  1. Laden Sie die Daten
  2. Teilen Sie den Datensatz in 3 Datensätze auf: A = Schulung (60%) B = Validierung (20%) C = Testen (20%)
  3. Führen Sie für jeden Datensatz (A, B, C) eine Unterabtastung für jede negative Klasse durch, um ein Verhältnis von 5 zu erhalten (5 negatives Beispiel für 1 positives Beispiel). Dies gibt mir 3 neue Datensätze, die ausgewogener sind: A 'B' C '

Dann trainiere ich mein Modell mit dem Datensatz A 'und der logistischen Regression.

Meine Frage ist:

  1. Welchen Datensatz muss ich zur Validierung verwenden? B oder B '?

  2. Welchen Datensatz muss ich zum Testen verwenden? C oder C '

  3. Welche Metriken sind für die Bewertung meines Modells am relevantesten? F1Score scheint eine gut genutzte Metrik zu sein. Aufgrund der unausgeglichenen Klasse (wenn ich die Datensätze B und C verwende) ist die Genauigkeit hier jedoch niedrig (unter 0,20) und der F1Score wird stark durch niedrige Rückruf- / Genauigkeitsfaktoren beeinflusst. Wäre es genauer, aucPR oder aucROC zu verwenden?

  4. Welche Metriken sollte ich verwenden, wenn ich die Lernkurve zeichnen möchte? (in dem Wissen, dass der% -Fehler nicht relevant ist, wenn ich den B'-Datensatz zur Validierung verwende)

Vielen Dank im Voraus für Ihre Zeit!

Grüße.

Antworten:


9

Gute Frage ... Hier einige konkrete Antworten auf Ihre nummerierten Fragen:

1)Sie sollten auf B nicht B` überprüfen. Andernfalls werden Sie nicht wissen, wie gut Ihr Klassenausgleich funktioniert. Es kann nicht schaden, die Validierung sowohl für B als auch für B zu kreuzen .

2) Sie sollten sowohl auf C als auch auf C` testen, basierend auf 4 unten.

3)Ich würde bei F1 bleiben und es könnte nützlich sein, ROC-AUC zu verwenden, und dies bietet eine gute Überprüfung der geistigen Gesundheit. Beides ist in der Regel bei unausgeglichenen Klassen hilfreich.

4)Das wird wirklich knifflig. Das Problem dabei ist, dass Sie für die beste Methode neu interpretieren müssen, wie die Lernkurven aussehen sollen, oder sowohl den neu abgetasteten als auch den ursprünglichen Datensatz verwenden müssen.

Die klassische Interpretation von Lernkurven lautet:

  • Overfit - Linien laufen nicht ganz zusammen;
  • Underfit - Linien kommen zusammen, aber bei einer zu niedrigen F1-Punktzahl;
  • Gerade richtig - Linien werden mit einer angemessenen F1-Punktzahl zusammengeführt.

Wenn Sie nun auf A` trainieren und auf C testen, werden die Linien niemals vollständig zusammenkommen. Wenn Sie auf A` trainieren und auf C` testen, sind die Ergebnisse im Kontext des ursprünglichen Problems nicht aussagekräftig. Also, was machst du?

Die Antwort ist, auf A` zu trainieren und auf B` zu testen, aber auch auf B. Holen Sie sich die F1-Punktzahl für B`, wo Sie möchten, und überprüfen Sie dann die F1-Punktzahl für B. Führen Sie dann Ihre Tests durch und generieren Sie Lernkurven für C. Die Kurven werden nie zusammenkommen, aber Sie werden ein Gefühl für die akzeptable Verzerrung haben ... es ist der Unterschied zwischen F1 (B) und F1 (B`).

Die neue Interpretation Ihrer Lernkurven lautet nun:

  • Overfit - Linien laufen nicht zusammen und sind weiter auseinander als F1 (B`) -F1 (B);
  • Unteranpassung - Linien kommen nicht zusammen, aber der Unterschied ist geringer als F1 (B`) -F1 (B) und die Punktzahl F1 (C) liegt unter F1 (B).
  • Genau richtig - Linien kommen nicht zusammen, aber der Unterschied ist geringer als F1 (B`) -F1 (B) mit einer F1 (C) Bewertung ähnlich F1 (B).

Allgemein : Ich schlage nachdrücklich vor, dass Sie bei unausgeglichenen Klassen zunächst versuchen, die Klassengewichte in Ihrem Lernalgorithmus anzupassen, anstatt zu viel oder zu wenig abzutasten, da hierdurch die oben beschriebene rigorose Moral vermieden wird. Es ist in Bibliotheken wie Scikit-Learn sehr einfach und in allem, das eine Sigmoid-Funktion oder eine Mehrheitsabstimmung verwendet, ziemlich einfach zu codieren.

Hoffe das hilft!


Vielen Dank @ AN605. Das ist sehr nett von dir ! Ich habe ein paar Fragen: Für die 4) - Wenn Sie sagen "auf A 'trainieren und auf B' testen", meinen Sie validieren? - "Lernkurven für C erzeugen" & "F1 (C) Punktzahl ist unter / ähnlich F1 (B)". Ich dachte, dass wir für die Lernkurve nur die Fehlermetrik für den Trainingssatz (A oder A 'hier) und die Fehlermetrik für den Validierungssatz (B oder B') zeichnen mussten. Bist du nicht "validieren" auf C hier?
Jmvllt

Über die Verwendung der "Klassengewichte", korrigieren Sie mich, wenn ich falsch liege (ich hatte nur einen kurzen Blick darauf), aber dieser Trick beinhaltet das "Ändern" der Kostenfunktion durch Hinzufügen eines Koeffizienten / Gewichts "k" vor dem Unausgeglichene Klasse, oder? : 􏲏 Kosten (h (x), y) = -y * k * log (h (x)) - (1-y) * log ((h (x)) Auf diese Weise sollte der Algorithmus eine Fehlklassifizierung berücksichtigen von der positiven Klasse als wichtiger. Aber die Sache ist, dass ich Apache Spark & ​​MLlib verwenden muss, um mein gesamtes Modell zu erstellen. Und ich bin nicht sicher, ob ich meine Kostenfunktion einfach mit spark modifizieren kann. Trotzdem danke für deine Hilfe Zeit!
Jmvllt

5

Für 1)und 2)möchten Sie

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

Für diese Datasets sollte es also nicht erforderlich sein, die Klassen auszugleichen.

Sie können auch versuchen, Klassengewichte anstelle von Unter- / Überabtastung zu verwenden, da dies die Entscheidung für Sie übernimmt.

Für 3)Sie wollen wahrscheinlich zu optimieren verwenden , was auch immer Metrik , die Sie erzielen auf wird (wenn es ein Wettbewerb ist). Aber wenn das nicht in Betracht gezogen wird, sind all diese Modelle eine gute Wahl. F1 kann durch die geringe Genauigkeit beeinflusst werden, aber Sie möchten, dass dies erfasst wird. Genau dann, wenn naive Modelle (wie das Erraten der Mehrheitsklasse) bei einigen Metriken gut punkten können, sind Punkte wie F1 relevant.

An 4)der Anzeige der Metriken, auf denen Sie optimieren, ist nichts auszusetzen.


Hallo @jamesmf, danke für die coole Antwort. Beim F1Score hatte ich das Problem, dass ich mich mehr darauf konzentrieren möchte, das False Positive mehr als das False Negative zu eliminieren. Wäre es richtig, bei der Berechnung von Präzision und Rückruf unterschiedliche "Gewichte" für FP und FN hinzuzufügen?
Jmvllt

Das ergibt für mich einen Sinn. Auch Ihre Beschreibung der Klassengewichtung ist korrekt, und ich sehe es nicht in MLib implementiert, aber es könnte eine Feature-Anfrage wert sein
jamesmf

Okay, danke, James! Ich versuche es derzeit selbst, indem ich die LogisticGradient-Klasse erweitere und die Berechnungsmethode überschreibe. Ich werde Sie wissen lassen, ob dies zu guten Ergebnissen führt. Haben Sie einen guten Tag.
19.

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.