Najlepszy sposób obsługi niezbilansowanego zestawu danych wieloklasowych za pomocą SVM

9

Próbuję zbudować model predykcyjny za pomocą maszyn SVM na dość niezrównoważonych danych. Moje etykiety / wyniki mają trzy klasy: pozytywną, neutralną i negatywną. Powiedziałbym, że pozytywny przykład stanowi około 10-20% moich danych, neutralny około 50-60%, a negatywny około 30-40%. Próbuję zrównoważyć klasy, ponieważ koszty związane z niepoprawnymi prognozami między klasami nie są takie same. Jedną z metod było ponowne próbkowanie danych szkoleniowych i stworzenie równie zrównoważonego zestawu danych, który był większy niż oryginał. Co ciekawe, kiedy to robię, mam tendencję do uzyskiwania lepszych przewidywań dla drugiej klasy (np. Kiedy zbalansowałem dane, zwiększyłem liczbę przykładów dla klasy dodatniej, ale w przypadku przewidywań próbek klasa ujemna działała lepiej). Czy ktoś może ogólnie wyjaśnić, dlaczego tak się dzieje? Jeśli zwiększę liczbę przykładów dla klasy ujemnej, czy dostanę coś podobnego dla klasy dodatniej w przewidywaniach poza próbą (np. Lepsze prognozy)?

Jestem również bardzo otwarty na inne przemyślenia na temat tego, jak mogę rozwiązać problem niezrównoważonych danych albo poprzez nałożenie różnych kosztów na błędną klasyfikację, albo przez zastosowanie wag klas w LibSVM (choć nie jestem pewien, jak odpowiednio wybrać / dostroić te dane).

Tomas
źródło

Odpowiedzi:

6

Stosowanie różnych kar za zmienne marginesu dla wzorców każdej klasy jest lepszym podejściem niż ponowne próbkowanie danych. W każdym razie jest asymptotycznie równoważny ponownemu próbkowaniu, ale jest bardziej wymagający do implementacji i ciągły niż dyskretny, więc masz większą kontrolę.

Jednak wybór wag nie jest prosty. Zasadniczo możesz wypracować teoretyczną wagę, która bierze pod uwagę koszty błędnej klasyfikacji i różnice między szkoleniami ustalają prawdopodobieństwo operacyjne poprzedniej klasy, ale nie da optymalnej wydajności. Najlepszym rozwiązaniem jest wybór kar / wag dla każdej klasy poprzez zminimalizowanie straty (uwzględniając koszty błędnej klasyfikacji) poprzez walidację krzyżową.

Dikran Torbacz
źródło
Czy istnieje zautomatyzowany sposób, jak to zrobić, czy też istnieją osoby uczące się, które posiadają tę funkcjonalność?
Vam,
Zwykle po prostu piszę funkcję matlab, aby ocenić stratę dla określonego zestawu kar, a następnie zminimalizować ją za pomocą algorytmu simpleks Neldera-Meada. Nie znam żadnych bibliotek, które mają to wbudowane.
Dikran Marsupial
@DikranMarsupial Czy przeszukiwanie siatki dwóch zmiennych luzu marginesu w problemie dwuklasowym byłoby równoważne z tym, co robisz z algorytmem simpleks?
Spacey,
@Tarantula tak, precyzyjna metoda optymalizacji jest względnie nieistotna, kluczowym punktem jest upewnienie się, że optymalizujesz statystykę walidacji krzyżowej, którą naprawdę jesteś zainteresowany dla celów twojej aplikacji (tj. Te same częstotliwości klas spotykane podczas użytkowania operacyjnego oraz uwzględniając koszty błędnej klasyfikacji, jeśli są znane).
Dikran Torbacz