Jak zwiększyć dokładność klasyfikatorów?


17

Korzystam z przykładu OpenCV letter_recog.cpp do eksperymentowania na losowych drzewach i innych klasyfikatorach. Ten przykład zawiera implementacje sześciu klasyfikatorów - losowe drzewa, boosting, MLP, kNN, naiwne Bayesa i SVM. Używany jest zestaw danych do rozpoznawania liter UCI z 20000 wystąpieniami i 16 funkcjami, które podzieliłem na pół na szkolenia i testy. Mam doświadczenie z SVM, więc szybko ustawiłem błąd rozpoznawania na 3,3%. Po eksperymentach otrzymałem:

Rozpoznawanie liter UCI:

  • RTree - 5,3%
  • Zwiększenie - 13%
  • MLP - 7,9%
  • kNN (k = 3) - 6,5%
  • Bayes - 11,5%
  • SVM - 3,3%

Zastosowane parametry:

  • RTrees - max_num_of_trees_in_the_forrest = 200, max_depth = 20, min_sample_count = 1

  • Boost - boost_type = REAL, poor_count = 200, weight_trim_rate = 0,95, max_depth = 7

  • MLP - metoda = BACKPROP, parametr = 0,001, max_iter = 300 (wartości domyślne - zbyt wolno, aby eksperymentować)

  • kNN (k = 3) - k = 3

  • Bayes - brak

  • Jądro SVM - RBF, C = 10, gamma = 0,01

Następnie użyłem tych samych parametrów i przetestowałem zestawy danych Digits i MNIST, najpierw wyodrębniając cechy gradientu (elementy wektorowe o rozmiarze 200):

Cyfry:

  • RTree - 5,1%
  • Zwiększenie - 23,4%
  • MLP - 4,3%
  • kNN (k = 3) - 7,3%
  • Bayes - 17,7%
  • SVM - 4,2%

MNIST:

  • RTree - 1,4%
  • Boost - brak pamięci
  • MLP - 1,0%
  • kNN (k = 3) - 1,2%
  • Bayes - 34,33%
  • SVM - 0,6%

Jestem nowy we wszystkich klasyfikatorach oprócz SVM i kNN, dla tych dwóch mogę powiedzieć, że wyniki wydają się dobre. Co z innymi? Spodziewałem się więcej po losowych drzewach, na MNIST kNN daje lepszą dokładność, jakieś pomysły, jak ją zwiększyć? Zwiększenie i Bayesa dają bardzo niską celność. Na koniec chciałbym użyć tych klasyfikatorów do stworzenia systemu wielu klasyfikatorów. Jakakolwiek rada?

Odpowiedzi:


9

Redukcja wymiarów

Inną ważną procedurą jest porównanie poziomów błędów w szkoleniu i zestawie danych testowych, aby sprawdzić, czy nie jesteś zbyt dobry (z powodu „przekleństwa wymiarowości”). Na przykład, jeśli poziom błędu w zestawie danych testowych jest znacznie większy niż błąd w zestawie danych treningowych, byłby to jeden wskaźnik.
W takim przypadku możesz wypróbować techniki redukcji wymiarów, takie jak PCA lub LDA.

Jeśli jesteś zainteresowany, pisałem o PCA, LDA i kilku innych technikach tutaj: http://sebastianraschka.com/index.html#machine_learning oraz w moim repozytorium GitHub tutaj: https://github.com/rasbt/pattern_classification

Krzyżowa walidacja

Możesz także przyjrzeć się technikom weryfikacji krzyżowej, aby ocenić wydajność swoich klasyfikatorów w bardziej obiektywny sposób


Tak, rzeczywiście poziom błędów w zbiorze danych treningowych wynosi około 0. Zmiana parametrów w celu zmniejszenia przeregulowania nie spowodowała w moim przypadku większej dokładności zestawu danych testowych. Zaraz przyjrzę się technikom, o których wspomniałeś, i skomentuję, dziękuję.
Mika,

Jakie są względne proporcje treningu i zestawu danych testowych btw? Coś w linii 70:30, 60:40 lub 50:50?

Pierwszy zestaw danych - rozpoznawanie liter UCI jest ustawione na 50:50 (10000: 10000), cyfry to około 51:49 (1893: 1796), a MNIST to około 86:14 (60000: 10000).
Mika

Eksperymentowałem z PCA, nadal nie osiągałem dobrych wyników z losowym forrestem, ale boost i Bayes dają teraz wyniki podobne do innych klasyfikatorów. Znalazłem dyskusję na temat losowego forrestu tutaj: stats.stackexchange.com/questions/66543/... Możliwe, że tak naprawdę nie jestem przeregulowany, ale nie mogłem znaleźć wspomnianego tam błędu przewidywania braku worka (OOB). Uruchom teraz eksperyment z dużą liczbą drzew, aby sprawdzić, czy poprawi się dokładność.
Mika,

Okej, dźwięki robisz mały postęp :) Trywialne pytanie, ale czy ujednoliciłeś swoje funkcje (Z-score), aby były wyśrodkowane wokół średniej z odchyleniem standardowym = 1?

5

Oczekiwałem więcej po losowych drzewach :

  • W przypadku losowych lasów, zwykle dla funkcji N, funkcje sqrt (N) są używane dla każdej konstrukcji drzewa decyzyjnego. Ponieważ w twoim przypadku N = 20, możesz spróbować ustawić max_depth (liczbę podfunkcji do budowy każdego drzewa decyzyjnego) na 5.

  • Zamiast drzew decyzyjnych zaproponowano i oceniono modele liniowe jako podstawowe estymatory w losowych lasach, w szczególności wielomianową regresję logistyczną i naiwne Bayesa. Może to poprawić twoją dokładność.

Na MNIST kNN daje lepszą dokładność, jakieś pomysły, jak go zwiększyć?

  • Spróbuj z wyższą wartością K (powiedzmy 5 lub 7). Wyższa wartość K dałaby bardziej wspierające dowody na temat etykiety klasy punktu.
  • Możesz uruchomić PCA lub Fisher's Linear Discriminant Analysis przed uruchomieniem k-najbliższego sąsiada. Dzięki temu możesz potencjalnie pozbyć się skorelowanych cech podczas obliczania odległości między punktami, a zatem twoi k sąsiedzi byliby bardziej odporni.
  • Wypróbuj różne wartości K dla różnych punktów w zależności od wariancji odległości między sąsiadami K.

Wierzę, że masz na myśli parametr OpenCV nactive_vars (nie max_depth), który ustawiłem na domyślną wartość sqrt (N), czyli nactive_vars = sqrt (16) dla pierwszego zestawu danych i sqrt (200) dla dwóch pozostałych. max_depth określa, czy drzewa rosną do pełnej głębokości (25 to ich maksymalna wartość) i balansuje między niedopasowaniem a przeregulowaniem, więcej na ten temat tutaj: stats.stackexchange.com/questions/66209/... Nie jestem pewien co do min_sample_count, ale wypróbowałem różne wartości i ustawiłem to do 1 działało najlepiej.
Mika,

Dokumentacja OpenCV zawiera krótkie wyjaśnienie parametrów: docs.opencv.org/modules/ml/doc/… Na razie chciałbym, aby losowe drzewa działały w miarę dobrze i upraszczały, ponieważ chcę skupić się na pracy z systemem wielu klasyfikatorów.
Mika,

O kNN - są to naprawdę dobre sugestie, ale chciałem powiedzieć, że kNN działał lepiej niż klasyfikator losowych drzew i myślę, że jest dużo miejsca na ulepszenie losowych drzew.
Mika,

tak, nie jestem pewien, dlaczego losowy las nie działa tak dobrze (lub lepiej) niż uproszczone podejście k-NN ... może być tak, że podejście oparte na jądrze, w którym bezpośrednio próbujesz oszacować P (y | D) (dane wyjściowe podane), takie jak w k-NN bez szacowania P (theta | D) (dane ukryte podane dane), takie jak w modelach parametrycznych.
Debasis
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.