Czy w przypadku niezrównoważonej klasy muszę korzystać z próbkowania w moich zestawach danych do sprawdzania poprawności / testowania?

14

Jestem początkującym w uczeniu maszynowym i mam do czynienia z sytuacją. Pracuję nad problemem określania stawek w czasie rzeczywistym z zestawem danych IPinYou i próbuję przewidzieć kliknięcie.

Chodzi o to, że, jak być może wiesz, zestaw danych jest bardzo niezrównoważony: około 1300 negatywnych przykładów (bez kliknięcia) na 1 pozytywny przykład (kliknięcie).

Tym się właśnie zajmuję:

  1. Załaduj dane
  2. Podziel zestaw danych na 3 zestawy danych: A = szkolenie (60%) B = sprawdzanie poprawności (20%) C = testowanie (20%)
  3. Dla każdego zestawu danych (A, B, C) wykonaj niepełne próbkowanie dla każdej ujemnej klasy, aby uzyskać stosunek 5 (5 negatywnych przykładów dla 1 pozytywnego przykładu). To daje mi 3 nowe zestawy danych, które są bardziej zrównoważone: A „B” C ”

Następnie trenuję mój model z zestawem danych A 'i regresją logistyczną.

Moje pytanie brzmi:

  1. Którego zestawu danych muszę użyć do weryfikacji? B czy B '?

  2. Którego zestawu danych muszę używać do testowania? C lub C ”

  3. Które dane są najbardziej odpowiednie do oceny mojego modelu? F1Score wydaje się być dobrze wykorzystywanym wskaźnikiem. Ale tutaj z powodu niezrównoważonej klasy (jeśli używam zestawów danych B i C), precyzja jest niska (poniżej 0,20), a na F1Score duży wpływ ma niskie przywołanie / precyzja. Czy bardziej dokładne byłoby użycie aucPR lub aucROC?

  4. Jeśli chcę wykreślić krzywą uczenia się, jakich wskaźników powinienem użyć? (wiedząc, że błąd% nie jest istotny, jeśli używam zestawu danych B do sprawdzania poprawności)

Z góry dziękuję za poświęcony czas!

Pozdrowienia.

jmvllt
źródło

Odpowiedzi:

10

Świetne pytanie ... Oto kilka konkretnych odpowiedzi na ponumerowane pytania:

1)Powinieneś sprawdzić poprawność na B, a nie B`. W przeciwnym razie nie będziesz wiedzieć, jak dobrze działa równoważenie klas. Sprawdzanie poprawności zarówno B, jak i B` nie może zaszkodzić i będzie przydatne na podstawie odpowiedzi na 4 poniżej.

2) Powinieneś przetestować zarówno C, jak i C` na podstawie 4 poniżej.

3)Trzymałbym się F1 i przydałoby się użyć ROC-AUC, co zapewnia dobrą kontrolę poczytalności. Oba są zwykle przydatne w przypadku niezrównoważonych klas.

4)To staje się naprawdę trudne. Problem polega na tym, że najlepsza metoda wymaga ponownej interpretacji wyglądu krzywych uczenia się lub użycia zarówno ponownie próbkowanych, jak i oryginalnych zestawów danych.

Klasyczna interpretacja krzywych uczenia się to:

  • Overfit - linie nie do końca się łączą;
  • Underfit - linie łączą się, ale mają zbyt niski wynik F1;
  • Dokładnie - linie łączą się z rozsądnym wynikiem F1.

Teraz, jeśli trenujesz na A` i testujesz na C, linie nigdy się całkowicie nie połączą. Jeśli trenujesz na A` i testujesz na C`, wyniki nie będą miały znaczenia w kontekście pierwotnego problemu. Więc co robisz?

Odpowiedzią jest trenowanie na A` i testowanie na B`, ale także testowanie na B. Zdobądź wynik F1 dla B` tam, gdzie chcesz, aby to był, a następnie sprawdź wynik F1 dla B. Następnie wykonaj testy i wygeneruj krzywe uczenia się dla C. Krzywe nigdy się nie łączą, ale będziesz miał poczucie akceptowalnego odchylenia ... to różnica między F1 (B) i F1 (B`).

Nowa interpretacja krzywych uczenia się jest następująca:

  • Overfit - Linie nie łączą się i są dalej od siebie niż F1 (B`) -F1 (B);
  • Underfit - linie nie łączą się, ale różnica jest mniejsza niż F1 (B`) -F1 (B), a wynik F1 (C) jest poniżej F1 (B);
  • W sam raz - linie nie łączą się, ale różnica jest mniejsza niż F1 (B`) -F1 (B) z wynikiem F1 (C) podobnym do F1 (B).

Ogólne : Usilnie sugeruję, aby w przypadku niezrównoważonych klas najpierw spróbować dostosować wagi klas w algorytmie uczenia się zamiast nadmiernego / niedostatecznego próbkowania, ponieważ pozwala to uniknąć rygorystycznej moralności opisanej powyżej. Jest bardzo łatwy w bibliotekach takich jak scikit-learn i całkiem łatwy w obsłudze kod we wszystkim, co korzysta z funkcji sigmoid lub większościowego głosowania.

Mam nadzieję że to pomoże!

AN6U5
źródło
Wielkie dzięki @ AN605. Miło z twojej strony ! Mam kilka pytań: Dla 4) - Kiedy mówisz „trenować na A 'i testować na B”, czy masz na myśli walidację? - „generuj krzywe uczenia się dla C” i „Wynik F1 (C) jest poniżej / podobny do F1 (B)”. Pomyślałem, że dla krzywej uczenia się musieliśmy wykreślić metrykę błędu dla zestawu treningowego (tutaj A lub A ') i metrykę błędu tylko dla zestawu walidacyjnego (B lub B'). Nie „zatwierdzasz” tutaj C?
jmvllt,
Jeśli chodzi o korzystanie z „wag klasy”, popraw mnie, jeśli się mylę (po prostu rzuciłem okiem na to), ale ta sztuczka polega na „zmodyfikowaniu” funkcji kosztu poprzez dodanie współczynnika / wagi „k” przed niezrównoważona klasa, prawda? : 􏲏 Koszt (h (x), y) = -y * k * log (h (x)) - (1-y) * log ((h (x)) W ten sposób algorytm powinien rozważyć błędną klasyfikację klasy pozytywnej jako ważniejszej. Chodzi o to, że „muszę” użyć Apache Spark i MLlib do zbudowania całego mojego modelu. Nie jestem pewien, czy mogę łatwo zmodyfikować moją funkcję kosztów za pomocą iskry. W każdym razie dzięki czas!
jmvllt,
5

Dla 1)i 2)chcesz

1) choose a model that performs well on data distributed as you 
   expect the real data will be 
2) evaluate the model on data distributed the same way

W przypadku tych zestawów danych nie powinno być potrzeby równoważenia klas.

Możesz także spróbować użyć wag klas zamiast niedociążenia / oversamplingu, ponieważ to zajmie się tą decyzją.

Dla 3)prawdopodobnie chcesz zoptymalizować za pomocą cokolwiek metryka będzie zakończył (jeśli jest to konkurencja). Ale jeśli to nie jest rozważane, wszystkie te modele są dobrym wyborem. Niska precyzja może mieć wpływ na F1, ale chcesz, aby została przechwycona. Właśnie wtedy, gdy naiwne modele (jak zgadywanie klasy większościowej) mogą dobrze ocenić według niektórych wskaźników, wyniki takie jak F1 są istotne.

Jeśli chodzi o 4)to, że nie ma nic złego w pokazaniu dowolnej metryki, na której się optymalizujesz.

jamesmf
źródło
Cześć @jamesmf, dzięki za tę fajną odpowiedź. W przypadku F1Score miałem problem polegający na tym, że mógłbym bardziej skoncentrować się na wyeliminowaniu fałszywego pozytywu niż fałszywego negatywu. Czy słusznie byłoby dodać inną „wagę” dla FP i FN przy obliczaniu precyzji i przywołania?
jmvllt,
Ma to sens dla mnie. Również twój opis ważenia klas jest poprawny i nie widzę go zaimplementowanego w MLib, ale może być warty prośby o funkcję
jamesmf
OK dzięki James! Obecnie próbuję to zrobić samodzielnie, rozszerzając klasę LogisticGradient i zastępując metodę obliczeniową. Dam ci znać, jeśli to da mi dobre wyniki. Miłego dnia.
jmvllt,