2016-10-21 19 views
5

Obecnie staram się zrozumieć, w jaki sposób działają algorytmy uczenia maszynowego, a jedną rzeczą, której naprawdę nie rozumiem, jest oczywista różnica między dokładnością obliczoną przewidywanych etykiet a macierzą wizualnego pomyłki. Postaram się wyjaśnić tak jasno, jak to tylko możliwe.Python - uczenie maszynowe

Oto fragment zbioru danych (tutaj można zobaczyć 9 próbek (około 4k w rzeczywistym zbiorze), 6 funkcji i 9 etykiet (które stoją na nie liczb, ale niektóre znaczenia i nie można porównać jak 7> 4> 1)):

f1  f2  f3  f4  f5 f6 label 
89.18 0.412 9.1  24.17 2.4 1 1 
90.1 0.519 14.3 16.555 3.2 1 2 
83.42 0.537 13.3 14.93 3.4 1 3 
64.82 0.68 9.1  8.97 4.5 2 4 
34.53 0.703 4.9  8.22 3.5 2 5 
87.19 1.045 4.7  5.32 5.4 2 6 
43.23 0.699 14.9 12.375 4.0 2 7 
43.29 0.702 7.3  6.705 4.0 2 8 
20.498 1.505 1.321 6.4785 3.8 2 9 

na korzyść ciekawości próbuje liczbę algorytmów (liniowego, Gaussa SVM (SVC SVR) Bayesa itd.). O ile rozumiem instrukcję, w moim przypadku lepiej jest pracować z klasyfikatorami (dyskretnymi) niż regresyjnie (ciągłe). Korzystanie często:

model.fit(X_train, y_train) 
model.score(X_test, y_test) 

mam:

Lin_Reg: 0.855793988736 
Log_Reg: 0.463251670379 
DTC:  0.400890868597 
KNC:  0.41425389755 
LDA:  0.550111358575 
Gaus_NB: 0.391982182628 
Bay_Rid: 0.855698151574 
SVC:  0.483296213808 
SVR:  0.647914795849 

Ciągłe algorytmy zrobił lepsze wyniki. Kiedy użyłem macierzy dezorientacji Bayesa Ridge (musiał przekonwertować pływaka do liczb całkowitych), aby zweryfikować swój wynik, mam następujące:

Pred l1 l2 l3 l4 l5 l6 l7 l8 l9 
True 
l1 23, 66, 0, 0, 0, 0, 0, 0, 0 
l2 31, 57 1, 0, 0, 0, 0, 0, 0 
l3 13, 85, 19 0, 0, 0, 0, 0, 0 
l4 0, 0, 0, 0 1, 6, 0, 0, 0 
l5 0, 0, 0, 4, 8 7, 0, 0, 0 
l6 0, 0, 0, 1, 27, 36 7, 0, 0 
l7 0, 0, 0, 0, 2, 15, 0 0, 0 
l8 0, 0, 0, 1, 1, 30, 8, 0 0 
l9 0, 0, 0, 1, 0, 9, 1, 0, 0 

Co dał mi zrozumienie, że dokładność 85% jest źle. Jak to wyjaśnić? Czy to dlatego, że konwersja float/int?

Byłby wdzięczny za jakiekolwiek bezpośrednie odpowiedzi/link itp

+1

Jak dokładnie obliczyłeś dokładność? Coś jak 'sklearn.metrics.accuracy_score (y_test, model.predict (X_test))'? – sietschie

+1

Jeśli ręcznie porównasz wyniki 'model.predict()' z etykietami, licząc ile wpisów jest równych, powinieneś się zorientować, czy obliczona dokładność lub matryca nieporozumień jest błędna. (lub jeśli oba są wyłączone) – sietschie

+0

@sietschie Przepraszamy za spóźnioną odpowiedź! Użyłem "model.score (X_test, y_test)". Tak, widzę, że jeden z nich jest zły i przypuszczam, że dokładność obliczona jest tą jedyną. – Moveton

Odpowiedz

4

Łączymy tutaj dwie bardzo różne koncepcje uczenia maszynowego: regresję i klasyfikację. Regresja zazwyczaj zajmuje się wartościami ciągłymi, np. temperatura lub wartość giełdowa. Klasyfikacja z drugiej strony może powiedzieć, które gatunki ptaków znajdują się w zapisie - dokładnie w tym miejscu użyjesz macierzy zamieszania. Powie Ci, ile razy algorytm poprawnie przewidywał etykietę i gdzie popełnił błędy. SciPy, którego używasz, ma osobne sekcje dla obu.

Zarówno w przypadku problemów z klasyfikacją, jak i regresją można użyć różnych wskaźników do ich oceny, więc nie należy zakładać, że są one porównywalne. Jak podkreślił @javad, "współczynnik determinacji" różni się znacznie od dokładności. Polecam również przeczytać na precision and recall.

W twoim przypadku wyraźnie masz problem z klasyfikacją i jako taki należy go leczyć. Pamiętaj też, że f6 wygląda na dyskretny zestaw wartości.

Jeśli chcesz szybko przeprowadzić eksperyment z różnymi podejściami, mogę polecić np. H2O, który obok dobrego interfejsu API ma świetny interfejs użytkownika i umożliwia masowe przetwarzanie równoległe. XGBoost jest również doskonały.

+0

Dziękuję za tak jednoznaczną odpowiedź i rekomendacje! Dało mi to kilka dodatkowych punktów, które wykraczają poza to pytanie. – Moveton

3

Spójrz na dokumentacji here.

Jeśli wywołasz score() na metodach regresji, zwrócą "współczynnik determinacji R^2 prognozy", a nie dokładność.

+0

Dziękuję za wyraźną odpowiedź! Naprawdę brakowało mi tej kluczowej chwili. – Moveton

0

Spójrz na this.
Użyj "model.score (X_test, y_test)".