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:
- im Kontext eines Knotens, um die Verlustreduzierung eines Kandidatensplits zu bewerten
- 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?
unbalanced-classes
xgboost
ihadanny
quelle
quelle
Antworten:
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
quelle
Die gesamte Dokumentation besagt, dass dies sein sollte:
In der Praxis funktioniert das ziemlich gut, aber wenn Ihr Datensatz extrem unausgewogen ist, würde ich empfehlen, etwas konservativeres zu verwenden, wie:
Dies ist nützlich, um den Effekt einer Multiplikation von positiven Beispielen durch ein sehr hohes Gewicht zu begrenzen.
quelle
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.
quelle
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/
quelle