Was ist die richtige Verwendung von scale_pos_weight in xgboost für unausgeglichene Datasets?

26

Ich habe einen sehr unausgeglichenen Datensatz. Ich versuche den Tuning-Ratschlägen zu folgen und zu verwenden scale_pos_weight, bin mir aber nicht sicher, wie ich es tunen soll.

Ich kann sehen, dass RegLossObj.GetGradient:

if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight

Ein Gradient einer positiven Probe wäre also einflussreicher. Dem xgboost-Artikel zufolge wird die Gradientenstatistik jedoch immer lokal verwendet = innerhalb der Instanzen eines bestimmten Knotens in einem bestimmten Baum:

  1. im Kontext eines Knotens, um die Verlustreduzierung eines Kandidatensplits zu bewerten
  2. im Kontext eines Blattknotens, um die Gewichtung dieses Knotens zu optimieren

Es gibt also keine Möglichkeit, im Voraus zu wissen, was gut wäre scale_pos_weight- es ist eine ganz andere Zahl für einen Knoten, der ein Verhältnis von 1: 100 zwischen positiven und negativen Instanzen aufweist, und für einen Knoten mit einem Verhältnis von 1: 2.

Irgendwelche Hinweise?

ihadanny
quelle
Wahrscheinlich können Sie den Parameter im CV mit 5-fach 5 Wiederholungen einstellen. Möglicherweise müssen Sie jedoch den Code schreiben, um dies zu tun.
user2149631

Antworten:

22

Im Allgemeinen ist Scale_pos_weight das Verhältnis der Anzahl der negativen Klassen zur positiven Klasse. Angenommen, der Datensatz enthält 90 Beobachtungen der negativen Klasse und 10 Beobachtungen der positiven Klasse. Der ideale Wert für scale_pos_Weight sollte 9 sein. Sie können den folgenden Link überprüfen. http://xgboost.readthedocs.io/en/latest/parameter.html

Harshit Mehta
quelle
1
Wie würde das für einen Datensatz mit mehreren Klassen gelten? Wie wäre es mit 28 Klassen? Das ist mir nicht klar
Gabriel Ziegler
1
@ Gabriel Ich glaube, dann wäre es besser, Klassengewichte zu nehmen. Sie können scale_pos_weight verwenden, indem Sie einen vs rest-Ansatz verwenden. Erstellen Sie beispielsweise Dummies für 28 Klassen. Dann können Sie jedes als ein binäres Klassifizierungsproblem verwenden. Auf diese Weise haben Sie es mit 28 verschiedenen Modellen zu tun.
Harshit Mehta
Ich verstehe, aber wenn ich onevsrest verwende, gibt mir der Klassifikator nicht auch eine Ausgabe mit mehreren Bezeichnungen, oder? Nicht nur eine Klasse von den 28
Gabriel Ziegler
Wie ?. Zum Beispiel: Klassen sind A, B, C. Sie können also einen binären Klassifikator für die Klassifizierung haben (A / Not A), ein anderer wäre (B / Not B). Sie können dies für 'n' Klassen tun. Dann müssen Sie unter allen Wahrscheinlichkeiten, die jedem Klassifikator entsprechen, einen Weg finden, Klassen zuzuweisen.
Harshit Mehta
Ich bin es gewohnt, onevsrest für Multilabel zu verwenden, aber ich werde es versuchen! Vielen Dank!
Gabriel Ziegler
3

Die gesamte Dokumentation besagt, dass dies sein sollte:

scale_pos_weight = count(negative examples)/count(Positive examples)

In der Praxis funktioniert das ziemlich gut, aber wenn Ihr Datensatz extrem unausgewogen ist, würde ich empfehlen, etwas konservativeres zu verwenden, wie:

scale_pos_weight = sqrt(count(negative examples)/count(Positive examples)) 

Dies ist nützlich, um den Effekt einer Multiplikation von positiven Beispielen durch ein sehr hohes Gewicht zu begrenzen.

Deltawissenschaft
quelle
1

Ich verstehe Ihre Frage und Ihren Frust, bin mir aber nicht sicher, ob dies analytisch berechnet werden kann. Stattdessen müssten Sie empirisch eine gute Einstellung für Ihre Daten festlegen, wie Sie es für die meisten Hyperparameter tun, indem Sie die Kreuzvalidierung als @ user2149631 verwenden empfohlen. Ich hatte einige Erfolge bei der Verwendung von SelectFPR mit Xgboost und der sklearn-API, um stattdessen die FPR für XGBoost über die Featureauswahl zu senken und anschließend das scale_pos_weight zwischen 0 und 1,0 weiter zu optimieren. O.9 scheint gut zu funktionieren, aber wie bei allem, hängt YMMV von Ihren Daten ab. Sie können jeden Datenpunkt auch einzeln gewichten, wenn Sie ihn an XGboost senden, wenn Sie die zugehörigen Dokumente durchsehen. Sie müssen ihre API verwenden, nicht den sklearn-Wrapper. Auf diese Weise können Sie eine Gruppe von Datenpunkten viel höher als die andere gewichten, was sich auf den verwendeten Boosting-Algorithmus auswirkt.

Simon
quelle
0

Ich bin auch auf dieses Dilemma gestoßen und immer noch auf der Suche nach der besten Lösung. Es wird jedoch empfohlen, Methoden wie die Rastersuche (GridSearchCV in sklearn) zu verwenden, um die besten Parameter für Ihren Klassifikator zu optimieren. Wenn Ihr Datensatz jedoch stark unausgewogen ist, sollten Sie Stichprobenmethoden (insbesondere zufällige Überabtastung und SMOTE-Überabtastungsmethoden) und ein Modellensemble für Datenstichproben mit unterschiedlichen Verhältnissen von Beispielen positiver und negativer Klassen in Betracht ziehen. Hier ist ein nützliches (fast umfassendes) Tutorial zum Umgang mit unausgeglichenen Datensätzen.

https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/

Bikash Joshi
quelle