Czym są niezbalansowane dane
klasyfikacyjne i związane z nimi problemy?
– Tato, pomożesz nam posprzątać klocki lego? Zostały nam tylko trzy kolory do sprzątnięcia! – zapytała Jagódka
– Jasne! Jak tylko dostanę buziaka i przytulasa. Za taką zapłatę mogę pomóc. Ja posprzątam czerwone!
I wziąłem się za zbieranie. Po chwili usłyszałem niezadowolenie.
– Ej, to nie fair! Czerwonych było znacznie mniej niż pozostałych.
– Niestety Skarbie, rzadko zdarzy się tak, że będzie wszystkiego po równo. Po prostu trzeba umieć sobie z tym poradzić. Tak jak w tym przypadku szybko oszacowałem, przy których klockach będzie najmniej pracy – uśmiechnąłem się.
Ostatnio pracowałem nad modelem do wykrywania fraudów inwestycyjnych. W moim zbiorze danych liczba obserwacji z fraudami stanowiła zaledwie 0.05% obserwacji. Dlatego podczas projektu postanowiłem zrozumieć, co jest problemem dla niezbalansowanych danych i jak można sobie z tym poradzić. I tą nowo zdobytą wiedzą postanowiłem się z Wami podzielić ?.
Czym są niezbalansowane dane?
Niezbalansowane (czy inaczej niezrównoważone) dane zazwyczaj odnoszą się do problemu z klasyfikacją, gdzie klasy nie są jednakowo reprezentowane.
Niemniej jednak pojęcie niezbalansowanego zbioru danych jest dość niejasne. Przecież jak w naszym modelu klasyfikacji binarnej będziemy przewidywać dwa stany (np. kupi / nie kupi), to zbiór danych, w którym mamy podział pomiędzy dwoma klasami np. 48:52 (czyli 48 osób kupi i 52 nie kupi) raczej większość osób nazwie zbalansowanym. Natomiast jak byśmy przewidywali ryzyko kredytowe i mieli zbiór 5:95, czyli ze 100 osób 5 osób nie spłaci kredytu, a 95 spłaci, to każdy z nas nazwie ten zbiór niezbalansowanym.
To gdzie leży granica pomiędzy tymi przykładami? Mnie osobiście spodobało się nazewnictwo, które gdzieś przeczytałem:
- ekstremalnie niezbalansowany zbiór – jedna klasa poniżej 0.1% (czyli mniej niż 1 na 1000),
- silnie niezbalansowany zbiór – jedna klasa między 0.1% a 5%,
- umiarkowanie niezbalansowany zbiór – gdy jedna klasa jest pomiędzy 5% a 20%,
- delikatnie niezbalansowany zbiór – gdy jedna klasa jest pomiędzy 20% a 40%.
Warto mieć na uwadze, że problem ten dotyczy również wielu klas, np. jak 3 przewidywane klasy mają po 33% wszystkich danych a ostatnia czwarta klasa jedynie 1%.
Niezbalansowane dane – przykłady
Większość zestawów danych klasyfikacyjnych nie ma dokładnie równej liczby wystąpień w każdej klasie, ale niewielka różnica często nie ma znaczenia. Natomiast istnieją problemy, w których nierównowaga klasowa jest wręcz oczekiwana.
Na przykład w zestawach danych, takich jak nieuczciwe transakcje (fraudy). Zdecydowana większość transakcji będzie zaliczana do kategorii „Nie-oszustwa”, a bardzo niewielka część będzie zaliczana do kategorii „Oszustwa”. Aż ciężko mi sobie przewidzieć jakby musiał funkcjonować świat, gdyby były to klasy równoliczne – co drugi przelew byłby wyłudzeniem!
Inne przykłady:
- bank przewidujący czy klient spłaci kredyt, czy nie,
- gmail przewidujący czy wiadomość jest spamem, czy nie,
- firma e-commerce przewidująca, który użytkownik kupi produkt na ich platformie,
- brand24 przewidujący, czy klient odnowi subskrypcje,
- przewidywanie awarii maszyny w fabryce,
- wykrywanie wycieku ropy,
- modelowania ryzyka zachorowania osoby ubezpieczanej na ciężką chorobę,
- itp.
Dlaczego stanowi to problem?
Zastanówmy się, dlaczego mocno niezbalansowane dane mogą stanowić problem!
a) Zakrzywiony rozkład klas
Niezrównoważone klasyfikacje stanowią wyzwanie dla modelowania predykcyjnego, ponieważ większość algorytmów uczenia maszynowego używanych do klasyfikacji została zaprojektowana przy założeniu równej liczby przykładów dla każdej klasy. Ponieważ rozkład klas nie jest zrównoważony, większość algorytmów uczenia maszynowego może mieć problemy i będzie trzeba je odpowiednio podkręcić, aby uniknąć prostego przewidywania klasy większości we wszystkich przypadkach.
b) Nieintuicyjne podstawowe metryki
Załóżmy, że mamy do przewidzenia problem, czy dany klient spłaci kredyt. Niech w naszym zbiorze będzie 90 przypadków, że klient spłaci kredyt, a 10, że niestety podwinie mu się noga i nie da rady płacić rat na czas. Mówimy wówczas o niezbalansowanym zbiorze w proporcji 10:90.
A jak będzie wyglądać metryka accuracy w przypadku, gdyby model zawsze zakładał, że kredyt zostanie spłacony? Wyniesie 90%! Co rozumiemy, że aż w 9 na 10 przypadków model się nie pomyli.
Oczywiście wraz z doświadczeniem będziemy dobrze wyciągać wnioski patrząc na większy zakres metryk. Jednak warto mieć ten punkt na uwadze ?.
c) Nierówna wrażliwość kosztowa błędnej klasyfikacji
Najczęściej klasa mniejszości w danym problemie reprezentuje przypadek nienormalny taki jak oszustwo, niespłacony kredyt, kupno produktu, usterka, anomalia, choroba itp. Natomiast klasa większościowa reprezentuje najczęściej normalne przypadki.
W przypadku danych niezbalansowanych błędna klasyfikacja przykładu z klasy większościowej jako przykładu z klasy mniejszości (nazywamy to False Positive, czyli fałszywie dodatnim) jest często niepożądana, ale mniej krytyczna niż zaklasyfikowanie przykładu z klasy mniejszości jako należącego do klasy większości (zwany False Negative).
Jak można sobie z nim poradzić?
Można podzielić to na dwa główne sposoby walki:
- działanie na danych – czyli wpływanie w jakiś sposób na dane, które wybieramy do zbioru danych
- działanie na koszcie funkcji – czyli modyfikowanie wag klas jak wpływają na model.
Omówmy sobie kilka najbardziej znanych sposobów!
1. Zgromadź więcej danych
Może to zabrzmi banalnie, ale w pierwszym kroku należy się po prostu zastanowić czy nie możemy zebrać większej liczby danych ?.
2. Undersampling
Tłumacząc undersampling najprościej jak się da, to jest to metoda polegająca na usuwaniu danych z klasy większościowej. Czyli usuwamy losowe rekordy z próbki większościowej, aż obie klasy będą miały tę samą liczność.
Wyobraź sobie, że analizujesz zbiór danych pod kątem nieuczciwych transakcji. Większość transakcji w zbiorze jest normalna. W scenariuszu undersamplingu po prostu bierzemy mniej danych z klasy większościowej, aby pomóc zmniejszyć zakres nierównowagi w zbiorze danych.
Czy undersampling to dobry pomysł? Jest zalecany przez wielu statystyków, ale moim zdaniem jest dobry tylko wtedy, gdy dostępna jest wystarczająca liczba danych w klasie mniejszościowej (nie pytajcie o prosty przepis ile, bo jak mawiają konsultanci „to zależy”; w tym przypadku głównie od tego co chcemy przewidzieć, jaki model chcemy użyć i ile mieć danych opisujących dane zagadnienie do przewidzenia ?).
3. Oversampling
Jak wygląda oversampling? Po prostu jest to przeciwieństwo do untersamplingu. Sztucznie dodajemy dane do naszego mniej licznego zbioru danych, aby zrównoważyć liczbę wystąpień w każdej klasie.
No dobra, ale jak dodać obserwacje, których nie mamy? Można dodać te same robiąc losowanie ze zwracaniem. Można także użyć zbioru, który mamy i dodać do niego szum losowy. Warto mieć jednak na uwadze, że może przyczynić się to do dodatkowego szumu w naszym modelu!
4. SMOTE (Synthetic minority oversampling technique)
W przypadku oversamplingu można byłoby też napisać algorytm losowego generowania podobnych danych z naszej próbki mniejszościowej. Na szczęście nie musimy tego robić, bo można po prostu do tego zadania wykorzystać algorytm SMOTE! Metoda SMOTE generuje nowe próbki pomiędzy istniejącymi punktami danych na podstawie ich lokalnej gęstości.
Powyżej omówiliśmy techniki próbkowania. Teraz możemy przejść do omówienia uczenia się modelu uwzględniającego koszty.
Niby coś innego, ale tak naprawdę pod wieloma względami te dwa podejścia są podobne. Różnica jest taka, że w uczeniu wrażliwym na koszty stosujemy undersampling / oversampling poprzez zmianę parametru dotyczącego wag poszczególnych próbek.
5. Down-weighting
Obniżanie wagi jest analogiczne do undersampling i działa poprzez zmniejszenie wagi jednej z klas, utrzymując wagę drugiej klasy na jednym poziomie.
W przypadku zbioru 10:90 wystarczy zmodyfikować kolumnę z dopasowaniem modelu do danych z linii:
model.fit(X_train, y_train)
na tę:
class_weight = {0: 0.1, 1: 1.}
model.fit(X_train, y_train, class_weight=class_weights)
6. Upweighting
Zwiększanie wagi jest analogiczne do oversampling’u i działa poprzez zwiększenie wagi jednej z klas, utrzymując wagę drugiej klasy na jednym poziomie.
Uważam, że jest to ciekawsze rozwiązanie, ponieważ jest znacznie prostsze do wdrożenia. Łatwiej też wytłumaczyć osobie biznesowej wpływ zmiany kosztu, niż opisanie metody SMOTE?.
… Thing out of the box
Jest jeszcze jeden sposób. Możesz w przypadku niektórych problemów po prostu zmienić perspektywę. Dla przykładu weźmy wykrywanie fraudów kartowych. Oszustwo na karcie nie jest standardowym zachowaniem. Dlatego możesz zastanawiać się, czy warto zrobić zbiór zbalansowany albo potraktować ten problem w całkiem inny sposób – jako wykrywanie anomalii!
I wówczas możesz wykorzystać algorytm, który świetnie sobie radzi z tym zadaniem, gdzie z założenia anomalii jest niewiele. TUTAJ pokazałem jak można wykorzystać autoencodery do wykrywania anomalii (w tym przypadku wykrywania fraudów).
Podsumowanie
Mam nadzieję, że teraz już nie będziesz się obawiać niezbalansowanch danych!
Jeśli znasz techniki, które również można wykorzystać do zbalansowania zbiorów danych, a ich nie opisałem, daj mi proszę znać w komentarzu!
A w kolejnym wpisie pokażę Wam troszkę bardziej szczegółowo SMOTE i jak je wykorzystałem w projekcie.
Pozdrawiam z całego serducha,
Obraz Mads Liebst z Pixabay
Fajny wpis, bardzo klarownie i zrozumiale, dzięki 🙂
Pingback: Newsletter Dane i Analizy, 2021-06-28 | Łukasz Prokulski
Cześć, trochę nie rozumiem dlaczego dla zbioru 10:90, wyznaczamy wagę 0.1 i 1?
Masz rację Dawid! Powinno być 0.1 i 0.9! Zakładam, że zmiana 1.0 na 0.9 nie powinna dać dużych różnic, więc nie będę przeliczał na nowo wyników i wklejał 🙂
Pingback: Niezbalansowane dane klasyfikacyjne? Na ratunek SMOTE! - Mirosław Mamczur
accurency? accuracy!
Dziękuję Błażej! Pisząc po nocach zdarzają się takie błedy ? Super, że to zauważyłeś!
pozdrawiam serdecznie,
Mirek