scale_pos_weight
wird für die Binärklassifizierung verwendet, wie Sie angegeben haben. Es ist eine allgemeinere Lösung für den Umgang mit unausgeglichenen Klassen. Ein guter Ansatz, wenn Sie einen Wert zuweisen, scale_pos_weight
ist:
sum(negative instances) / sum(positive instances)
Für Ihren speziellen Fall gibt es eine andere Option, um einzelne Datenpunkte zu gewichten und ihre Gewichte zu berücksichtigen, während Sie mit dem Booster arbeiten, und die Optimierung in Bezug auf ihre Gewichte zuzulassen, sodass jeder Punkt gleich dargestellt wird. Sie müssen nur einfach verwenden:
xgboost.DMatrix(..., weight = *weight array for individual weights*)
Sie können die Gewichte so definieren, wie Sie möchten, und auf diese Weise können Sie sogar Ungleichgewichte innerhalb von Klassen sowie Ungleichgewichte über verschiedene Klassen hinweg behandeln.
Diese Antwort von @KeremT ist richtig. Ich gebe ein Beispiel für diejenigen, die noch Probleme mit der genauen Implementierung haben.
weight
Parameter in XGBoost ist pro Instanz nicht pro Klasse. Daher müssen wir das Gewicht jeder Klasse ihren Instanzen zuweisen, was dasselbe ist.Zum Beispiel, wenn wir drei unausgeglichene Klassen mit Verhältnissen haben
Ihre Gewichte wären (Teilen der kleinsten Klasse durch andere)
Dann, wenn Trainingsdaten sind
Wir bauen den
weight
Vektor wie folgt auf:quelle
Jeder stolpert über diese Frage, wenn er sich mit einem Problem der unausgewogenen Klassifizierung mehrerer Klassen mit XGBoost in R befasst. Das habe ich auch getan!
Ich suchte nach einem Beispiel, um besser zu verstehen, wie man es anwendet. Investiert fast eine Stunde, um den unten genannten Link zu finden. Für alle, die ein Beispiel suchen, hier geht's -
/datascience//a/9493/37156
Danke wacax
quelle
Ordnen Sie einfach jeder Instanz Ihrer Zugdaten das Klassengewicht zu.
class_weight.compute_class_weight
Holen Sie sich zuerst die Klassengewichte mit von sklearn und weisen Sie dann jeder Zeile der Zugdaten das entsprechende Gewicht zu.Ich gehe hier davon aus, dass die Zugdaten die Spalte 'Klasse' haben, die die Klassennummer enthält. Ich habe auch angenommen, dass es nb_classes von 1 bis nb_classes gibt.
quelle