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?


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


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ę.


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.


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/

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.