Jakie jest właściwe użycie scale_pos_weight w xgboost dla niezrównoważonych zestawów danych?

26

Mam bardzo niezrównoważony zestaw danych. Staram się postępować zgodnie ze wskazówkami dotyczącymi tuningu i używać go, scale_pos_weightale 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:

  1. w kontekście węzła, aby ocenić redukcję strat podziału kandydata
  2. 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?

ihadanny
źródło
Prawdopodobnie możesz dostroić parametr w CV za pomocą 5-krotnych 5 powtórzeń. Ale może być konieczne napisanie kodu, aby to zrobić.
user2149631,

Odpowiedzi:

22

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

Harshit Mehta
źródło
1
W jaki sposób miałoby to zastosowanie do zestawu danych wieloklasowego? Co powiesz na 28 klas? Nie jest to dla mnie jasne
Gabriel Ziegler
1
@Gabriel Uważam, że lepiej byłoby wybrać odważniki klasowe. Możesz użyć scale_pos_weight, stosując podejście jeden vs odpoczynek. Na przykład utwórz manekiny dla 28 klas. Następnie możesz użyć każdego z nich jako problemu z klasyfikacją binarną. W ten sposób będziesz mieć do czynienia z 28 różnymi modelami.
Harshit Mehta
Rozumiem, ale kiedy używam onevsrest, to czy klasyfikator daje mi również wyjście wielowarstwowe, prawda? Nie tylko jedna klasa z 28
Gabriel Ziegler
W jaki sposób ?. Na przykład: Klasy to A, B, C. Możesz więc mieć binarny klasyfikator do klasyfikacji (A / Not A), innym będzie (B / Not B). Możesz to zrobić dla liczby klas „n”. Następnie wśród wszystkich prawdopodobieństw odpowiadających każdemu klasyfikatorowi musisz znaleźć sposób na przypisanie klas.
Harshit Mehta
Przyzwyczaiłem się do używania onevsrest do multilabeli, ale spróbuję! Dzięki!
Gabriel Ziegler
3

Cała dokumentacja mówi, że powinno to być:

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

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:

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

Jest to przydatne, aby ograniczyć efekt zwielokrotnienia pozytywnych przykładów przez bardzo wysoką wagę.

deltascience
źródło
1

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.

Szymon
źródło
0

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/

Bikash Joshi
źródło