Mam bardzo niezrównoważony zestaw danych. Staram się postępować zgodnie ze wskazówkami dotyczącymi tuningu i używać go, scale_pos_weight
ale nie jestem pewien, jak go dostroić.
Widzę, że RegLossObj.GetGradient
:
if (info.labels[i] == 1.0f) w *= param_.scale_pos_weight
więc gradient próbki dodatniej byłby bardziej wpływowy. Jednak zgodnie z artykułem xgboost statystyka gradientów jest zawsze używana lokalnie = w wystąpieniach określonego węzła w określonym drzewie:
- w kontekście węzła, aby ocenić redukcję strat podziału kandydata
- w kontekście węzła liścia, aby zoptymalizować wagę nadaną temu węzłowi
Nie ma więc możliwości wcześniejszego poznania, co byłoby dobre scale_pos_weight
- jest to zupełnie inna liczba dla węzła, który kończy się proporcją 1: 100 między instancjami dodatnimi i ujemnymi, oraz dla węzła o stosunku 1: 2.
Jakieś wskazówki?
unbalanced-classes
xgboost
ihadanny
źródło
źródło
Odpowiedzi:
Ogólnie, Scale_pos_weight jest stosunkiem liczby klas ujemnych do klas dodatnich. Załóżmy, że zestaw danych zawiera 90 obserwacji klasy ujemnej i 10 obserwacji klasy dodatniej, a następnie idealna wartość scale_pos_Weight powinna wynosić 9. Możesz sprawdzić następujący link. http://xgboost.readthedocs.io/en/latest/parameter.html
źródło
Cała dokumentacja mówi, że powinno to być:
W praktyce działa to całkiem dobrze, ale jeśli twój zestaw danych jest wyjątkowo niezrównoważony, zalecam użycie czegoś bardziej konserwatywnego, takiego jak:
Jest to przydatne, aby ograniczyć efekt zwielokrotnienia pozytywnych przykładów przez bardzo wysoką wagę.
źródło
Rozumiem twoje pytanie i frustrację, ale nie jestem pewien, czy jest to coś, co można by obliczyć analitycznie, raczej musisz określić dobre ustawienie empirycznie dla swoich danych, tak jak w przypadku większości hiper parametrów, używając weryfikacji krzyżowej jako @ user2149631 zasugerował. Odniosłem pewien sukces używając SelectFPR z Xgboost i API sklearn do obniżenia FPR dla XGBoost poprzez wybór funkcji, a następnie dalsze dostrojenie scale_pos_weight między 0 a 1.0. Wygląda na to, że O.9 działa dobrze, ale podobnie jak w przypadku innych elementów, YMMV w zależności od danych. Możesz również przypisać wagę każdemu punktowi danych indywidualnie podczas wysyłania go do XGboost, jeśli przejrzysz ich dokumenty. Musisz użyć ich interfejsu API, a nie opakowania sklearn. W ten sposób można zważyć jeden zestaw punktów danych znacznie wyżej niż drugi, co wpłynie na stosowany przez niego algorytm zwiększania.
źródło
Natknąłem się również na ten dylemat i wciąż szukam najlepszego rozwiązania. Sugeruję jednak użycie metod takich jak Grid Search (GridSearchCV w sklearn) w celu najlepszego dostrojenia parametrów dla twojego klasyfikatora. Jeśli jednak twój zestaw danych jest wysoce niezrównoważony, warto rozważyć metody próbkowania (zwłaszcza metody losowego nadpróbkowania i metody nadpróbkowania SMOTE) i modelować zestaw na próbkach danych z różnymi stosunkami przykładów klas dodatnich i ujemnych. Oto jeden miły i przydatny (prawie kompleksowy) samouczek dotyczący obsługi niezrównoważonych zestawów danych.
https://www.analyticsvidhya.com/blog/2017/03/imbalanced-classification-problem/
źródło