Sugestie dotyczące uczenia się z uwzględnieniem kosztów w warunkach wysoce niezrównoważonych

15

Mam zestaw danych z kilkoma milionami wierszy i ~ 100 kolumnami. Chciałbym wykryć około 1% przykładów w zestawie danych, które należą do wspólnej klasy. Mam ograniczenie minimalnej precyzji, ale z powodu bardzo asymetrycznego kosztu nie jestem zbytnio zainteresowany żadnym konkretnym wycofaniem (o ile nie mam 10 pozytywnych wyników!)

Jakie są podejścia, które poleciłbyś w tym ustawieniu? (mile widziane linki do dokumentów, mile widziane linki do wdrożeń)

em70
źródło

Odpowiedzi:

15

Odkryłem, że He i Garcia (2009) są pomocnym przeglądem nauki w niezrównoważonych problemach klasowych. Oto kilka zdecydowanie niewyczerpujących kwestii do rozważenia:

Podejścia oparte na danych:

Można powtórzyć próbkę klasy większościowej lub przesłuchać klasę mniejszości. (Breiman zwrócił uwagę, że formalnie jest to równoważne z przypisaniem nierównomiernych kosztów błędnej klasyfikacji). Może to powodować problemy: niepełne próbkowanie może spowodować, że uczeń nie dostrzeże aspektów klasy większościowej; nadpróbkowanie zwiększa ryzyko nadmiernego dopasowania.

Istnieją metody „świadomego niepełnego próbkowania”, które zmniejszają te problemy. Jednym z nich jest EasyEnsemble , który niezależnie próbkuje kilka podzbiorów z klasy większości i tworzy wiele klasyfikatorów, łącząc każdy podzbiór ze wszystkimi danymi klasy mniejszości.

SMOTE (Synthetic Minority Oversampling Technique) lub SMOTEBoost, (łącząc SMOTE z boostingiem) tworzą syntetyczne wystąpienia klasy mniejszości, tworząc najbliższych sąsiadów w przestrzeni obiektów. SMOTE jest zaimplementowany w R w pakiecie DMwR (który towarzyszy książce Luisa Torgo „Data Mining with R, learning with case studies” CRC Press 2016 ).

Podejścia do modelowania

Zastosuj wagi specyficzne dla klasy w swojej funkcji straty (większe wagi w przypadkach mniejszości).

W przypadku podejść opartych na drzewach można użyć odległości Hellingera jako funkcji zanieczyszczenia węzłów, jak zalecono w Cieslak i in. „Drzewa decyzyjne odległości Hellingera są solidne i niewrażliwe na pochylenie” ( tutaj kod Weka ).

Użyj klasyfikatora jednej klasy , ucząc się (w zależności od modelu) gęstości prawdopodobieństwa lub granicy dla jednej klasy i traktując drugą klasę jako wartości odstające.

Oczywiście nie używaj dokładności jako miernika do budowy modelu. Kappa Cohena jest rozsądną alternatywą.

Podejścia do oceny modelu

Jeśli Twój model zwraca przewidywane prawdopodobieństwa lub inne wyniki, wybierz wartość odcięcia decyzji, która powoduje odpowiedni kompromis w zakresie błędów (przy użyciu zestawu danych niezależnego od szkolenia i testowania). W pakiecie R pakiet OptimalCutpoints implementuje szereg algorytmów, w tym wrażliwych na koszty, do decydowania o wartości granicznej.

MattBagg
źródło
Dziękuję za szczegółową odpowiedź. Próbowałem powtórzyć próbę i poniosłem porażkę. Modele wykazują doskonałą wydajność w próbie, ale nierównowaga jest nadal obecna w zestawie testowym (i rzeczywistych danych, które w końcu będę używać), więc precyzja OOS modeli jest straszna. Próbowałem również odważników specyficznych dla klasy, ale moja aplikacja wiąże się z łatwo mierzalnym wyższym kosztem dla wyników fałszywie dodatnich niż dla wyników fałszywie ujemnych. Jeśli chodzi o klasyfikatory jednej klasy, próbowałem dopasować liniowy svm (nieliniowe są zbyt wolne) i który ma 0 dokładności nawet w próbce ...
em70
1
Współczuję Ci. Wysoka precyzja jest trudna, jeśli zdecydowana większość twoich przypadków jest negatywna. Do nauki używałbym wag właściwych dla klasy (takich jak odwrotnie proporcjonalna do odsetka przypadków w klasie) i zapisywałby wagi właściwe dla rodzaju błędu w celu ustalenia progu decyzyjnego. Mam nadzieję, że używasz weryfikacji krzyżowej z kappą Cohena, a nie dokładnością przy wyborze modelu. Wizualizuję gęstość prawdopodobieństwa dla klas w danych kalibracyjnych wraz z dokładnością i wzbogacaniem (precyzja / proporcja przypadków dodatnich) przy wszystkich odcięciach, aby naprawdę zrozumieć dostępne kompromisy.
MattBagg
Świetna odpowiedź, dziękuję. Od dłuższego czasu stosuję technikę podobną do wspomnianego EasyEnsemble, ale miałem co do tego wątpliwości (pomimo rozsądnej wydajności na symulowanych danych). Teraz wiem, że to ma sens.
ayorgo
5

Rozumiem, że jest to aktywny obszar badań w społeczności uczącej się maszynowo i nie ma świetnych odpowiedzi, a raczej duża i rosnąca liczba potencjalnych rozwiązań. Prawdopodobnie uzyskasz lepsze odpowiedzi, jeśli określisz określone algorytmy, które rozważasz.

Jeśli używasz modelu parametrycznego (regresja logistyczna), powinno to być mniejszy problem i możesz po prostu zmienić próg w zależności od funkcji straty (koszt fałszywych negatywów do fałszywie dodatnich)

Jeśli używasz algorytmów uczenia maszynowego, może to być trudniejsze. Max Kuhn podejmuje uczciwą próbę podsumowania problemu w rozdziale 16 „Stosowanego modelowania predykcyjnego”. Ale trudny temat do podsumowania. Jeśli nie chcesz kupować książki, kod R jest dostępny w pakiecie AppliedPredictiveModeling dla tego rozdziału i może być wystarczający w zależności od Twojej znajomości języka R i zastosowanych algorytmów.

Dyskusje dotyczą zwykle algorytmów niepełnego próbkowania / nadpróbkowania +/- wrażliwych na koszty. Możliwe są również warianty takie jak Jous-Boost.
Przykład tego rodzaju dyskusji: Chen i wsp. „Wykorzystanie losowego lasu do nauki niezrównoważonych danych” http://statistics.berkeley.edu/sites/default/files/tech-reports/666.pdf

Charles
źródło
Problem ze zmianą progu polega na tym, że przypomina zmianę przechwytywania modelu regresji. W rzeczywistości mogę chcieć zmienić wektor ciężaru, aby uwzględnić koszty. Ale jeśli to zrobię, biorąc pod uwagę już poważny brak równowagi, otrzymam 0 precyzji! Nie zdecydowałem się na żaden algorytm i mam zasoby do wdrażania najnowocześniejszych pomysłów badawczych, jeśli są obiecujące. Spojrzę na zasugerowaną książkę.
em70
Rozdział jest taki sobie. Wysoki wysiłek, ale trudny do podsumowania temat. Wiele nieobsługiwanych oświadczeń opublikowanych na różne sposoby. Uważam, że warstwowe niepełne pobieranie próbek w losowych lasach to dobry początek z perspektywy uczenia maszynowego. Kod znajduje się w pakiecie książki.
Charles
0

Możesz zapoznać się z implementacją scikit-learn. zwróć uwagę na argument class_ weight, który może mieć wartości słownika wag klas lub „auto”:

klasa sklearn.svm.SVC (C = 1.0, jądro = 'rbf', stopień = 3, gamma = 0,0, coef0 = 0,0, kurczenie się = prawda, prawdopodobieństwo = fałsz, tol = 0,001, rozmiar pamięci podręcznej = 200, waga_klasy = brak, szczegółowe = False, max_iter = -1, random_state = Brak)

Możesz grać z wartością argumentu class_weight, którym może być słownik wag klasy lub „auto”. W trybie „automatycznym” algorytm uczenia automatycznie przypisuje wagi do każdej klasy na podstawie liczby próbek w każdej z nich.

scikit-learn ma kilka innych algorytmów klasyfikacji, z których niektóre akceptują wagi klas.

Popiół
źródło
Czy możesz powiedzieć więcej o tym, w jaki sposób można wykorzystać wagi klasowe do osiągnięcia celów PO? Myślę, że jest to ukryte w twoim poście, ale nie jest to jeszcze odpowiedź.
gung - Przywróć Monikę
Tak, argument class_weight może mieć wartość „auto”, jeśli ktoś zajrzy do dokumentacji lub może mieć wartość słownikową, która ma wagi klas. W przypadku „auto” sam algorytm uczenia się znajduje wagę każdej klasy zgodnie z liczbą próbek w każdej.
Ash