Jak sklasyfikować niezrównoważony zestaw danych według Convolutional Neural Networks (CNN)?

10

Mam niezrównoważony zestaw danych w zadaniu klasyfikacji binarnej, w którym liczba dodatnia vs. liczba ujemna wynosi 0,3% w porównaniu z 99,7%. Różnica między pozytywami a negatywami jest ogromna. Kiedy trenuję CNN ze strukturą stosowaną w problemie MNIST, wynik testu pokazuje wysoką fałszywą ujemną częstość. Ponadto krzywa błędu treningu szybko spada w kilku epokach na początku, ale pozostaje taka sama w kolejnych epokach.

Czy możesz mi doradzić, jak rozwiązać ten problem? Dzięki!

Zhi Lu
źródło

Odpowiedzi:

10

Dzieje się tak, ponieważ gdy weźmiesz mini-partię, jest bardzo mało prawdopodobne (biorąc pod uwagę stosunek proporcji tutaj), że mini-partia będzie w ogóle zawierać próbki pozytywów. W rezultacie nauczy się schematu dla klasy negatywnej i po kilku epokach wszystko po prostu zostanie zaklasyfikowane jako klasa negatywna.

Istnieją dwa sposoby zaradzenia takiej sytuacji.

  1. Biorąc pod uwagę proporcje wynoszące od 0,3% do 99,7%, jest to bardzo mocno wypaczony zestaw danych. Prawie nie masz 3 próbek klas pozytywnych na każde 1000 próbek. Powiedziałbym, że powinieneś przyjrzeć się zrównoważeniu zestawu danych, zdobywając więcej pozytywnych klas. Idź i zdobądź jak najwięcej pozytywnych próbek, jak możesz. Następnie możesz użyć bardziej zrównoważonego zestawu danych. Na przykład możesz pobrać 1000 próbek pozytywnych, a następnie wybrać losowy zestaw 1000 próbek negatywnych i zbudować klasyfikator. Teraz powinno być w stanie nauczyć się obu klas.

  2. Użyj ważonej miary błędu podczas aktualizowania wag po mini-partii. Wagi są aktualizowane proporcjonalnie do liczby próbek klas dodatnich i ujemnych podczas dowolnej mini-partii. Teraz, w obecnej sytuacji, biorąc pod uwagę proporcje 3: 1000, nawet ta sztuczka może nie działać. Możesz więc spróbować uzyskać proporcje do czegoś w rodzaju 300: 1000, pobierając 297 dodatkowych próbek pozytywnych i łącząc je z 1000 próbkami negatywnymi. Następnie przy współczynniku 300: 1000 należy zważyć błąd podczas mini-partii na podstawie liczby próbek w każdej z klas. To powinno działać.

Facet z Londynu
źródło
Czy wiesz, jaka jest tutaj optymalna proporcja? czy to 3:10, czy coś jeszcze?
Christopher
4

Dlaczego chcesz tutaj używać CNN? Czy rozważałeś inne modele, które faktycznie obsługują niezrównoważone dane?

Na przykład odkryłem, że następujące dwie techniki działały dla mnie naprawdę dobrze:

  • Random Forests w / SMOTE Boosting : Użyj hybrydy, SMOTEktóra podkreśla klasę większości i przesadza próbę klasy mniejszości o regulowane wartości procentowe. Wybierz te wartości procentowe w zależności od rozkładu zmiennej odpowiedzi w zestawie treningowym. Wprowadź te dane do swojego modelu RF. Zawsze sprawdzaj krzyżowo / wykonuj wyszukiwanie siatki, aby znaleźć najlepsze ustawienia parametrów dla swoich RF.

  • XGBoost z optymalizacją hiperparametrową : Ponownie sprawdź poprawność lub przeprowadź wyszukiwanie pasmowe, aby znaleźć najlepsze ustawienia parametrów dla modelu. Dodatkowo xgboostumożliwia równoważenie dodatnich i ujemnych wag klas za pomocą scale_pos_weight. Zobacz dokumentację parametru dla pełnej listy.

Powinienem również dodać, że zestaw danych, nad którym pracowałem, miał ten sam procent pochylenia i byłem w stanie uzyskać wynik czułości 0,941 i swoistość 0,71 z xgboost, co oznacza, że ​​model dość dokładnie przewiduje prawdziwe pozytywy i to wróży dobrze dla mnie.

(Przepraszam, nie mogę zostawić komentarza, za mało reputacji i naprawdę chciałem wiedzieć, dlaczego wybrałeś CNN)

119631
źródło
1

Niezrównoważony zestaw danych jest powszechnym problemem we wszystkich obszarach i nie dotyczy w szczególności wizji komputerowej i problemów rozwiązywanych przez sieci neuronowe o konwergencji (CNN).

Aby rozwiązać ten problem, powinieneś spróbować zrównoważyć swój zestaw danych, albo przez nadmierne próbkowanie klas mniejszości lub przez niepełne próbkowanie klas większości (lub obu). Prawdopodobnie dobrym wyborem byłby algorytm SMOTE (Synthetic Minority Over-sampling Technique), jak wspomniano powyżej. Tutaj możesz znaleźć porównanie różnych algorytmów nadmiernego próbkowania. Jeśli jesteś użytkownikiem Pythona, niezbalansowane uczenie się to przyjemna biblioteka, która implementuje wiele przydatnych technik równoważenia zestawów danych.

Z drugiej strony, jeśli próbujesz sklasyfikować obrazy, dobrym sposobem na zwiększenie rozmiaru zestawu danych jest jego powiększenie (tj. Poprzez stworzenie rozsądnych syntetycznych przykładów, np. Podobnych obrazów, ale obróconych / przesuniętych nieco w stosunku do oryginalnych). Czasami może okazać się przydatne zwiększenie klas mniejszościowych w celu osiągnięcia lepszej równowagi. Klasa Keras ImageDataGenerator jest dobrym narzędziem do tego celu.

Tomasz Bartkowiak
źródło