Jaki jest dobry zasób obejmujący porównanie zalet i wad różnych klasyfikatorów?

15

Jaki jest najlepszy gotowy do użycia klasyfikator 2 klas? Tak, myślę, że to pytanie za milion dolarów i tak, jestem świadomy twierdzenia o braku darmowego lunchu , a także przeczytałem poprzednie pytania:

Nadal jestem zainteresowany czytaniem więcej na ten temat.

Jakie jest dobre źródło informacji, które obejmuje ogólne porównanie cech, zalet i cech różnych klasyfikatorów?

Dow
źródło
+ proszę wybacz mi, że nie jestem rodzimym językiem angielskim :)
Dow

Odpowiedzi:

9

ESL , jak już wspomniano przez Petera Flom, to doskonała propozycja (uwaga, że mój link jest na stronie autora, gdzie książki można otrzymać jako pdf za darmo). Pozwól mi dodać kilka bardziej szczegółowych rzeczy, których należy szukać w książce:

  • Tabela 10.1 (strona 351) podaje autorom ocenę niektórych cech sieci neuronowych, SVM, drzew, MARS i jąder k-NN, które w jakiś sposób wydają się być metodami, które autorzy chcą uwzględnić na liście „nieoficjalnych” metody półkowe.
  • Rozdział 10 dotyczy wzmocnienia, którego nie znalazłem na liście metod w ankiecie cytowanej przez PO. Podnoszenie gradientów wydaje się być jedną z lepszych metod w wielu przykładach.
  • Rozdział 9 dotyczy uogólnionych modeli addytywnych (GAM), które dodają do modelu regresji logistycznej (najwyżej w rankingu w ankiecie ) elastyczność nieliniowych addytywnych efektów predyktorów. GAM nie byłby tak łatwy w użyciu, jak regresja logistyczna ze wszystkimi parametrami wygładzania, które należałoby wybrać, gdyby nie dobre implementacje takie jak w pakiecie R mgcv .

Dodaj do książki widok zadań uczenia maszynowego dla języka R, który daje pewne wyobrażenie o tym, co może faktycznie zrobić wiele pakietów uczenia maszynowego, chociaż nie ma prawdziwego porównania. Dla użytkowników Pythona wyobrażam sobie, że scikit.learn to dobre miejsce do patrzenia. To, jak bardzo „gotowa” lub „gotowa” jest metoda, jest w dużej mierze determinowane przez to, jak dobrze implementacja radzi sobie z automatycznym dostosowaniem do sytuacji w danych, a nie pozostawia szczegółowego strojenia użytkownikowi. Moim zdaniem mgcv dla R jest dobrym przykładem, który sprawia, że ​​dopasowanie dość dobrego uogólnionego modelu dodatku jest naprawdę łatwe i zasadniczo bez potrzeby „ręcznego dostrajania” czegokolwiek.

NRH
źródło
8

Zasoby wymienione przez innych są z pewnością przydatne, ale wkroczę i dodam następujące: „najlepszy” klasyfikator prawdopodobnie będzie zależał od kontekstu i danych. Podczas niedawnej próby oceny różnych klasyfikatorów binarnych odkryłem, że drzewo regresji wzmocnionej działa konsekwentnie lepiej niż inne metody, do których miałem dostęp. Najważniejsze było dla mnie nauczenie się korzystania z narzędzi do eksploracji danych Orange . Mają jakiś wielki dokumentację , aby zacząć na odkrywanie tych metod ze swoimi danymi. Na przykład, oto krótki skrypt w języku Python, który napisałem, aby ocenić jakość wielu klasyfikatorów w różnych miarach dokładności przy użyciu k-krotnej weryfikacji krzyżowej.

import orange, orngTest, orngStat, orngTree , orngEnsemble, orngSVM, orngLR
import numpy as np

data = orange.ExampleTable("performance_orange_2.tab")
bayes = orange.BayesLearner(name="Naive Bayes")
svm = orngSVM.SVMLearner(name="SVM")
tree = orngTree.TreeLearner(mForPruning=2, name="Regression Tree")
bs = orngEnsemble.BoostedLearner(tree, name="Boosted Tree")
bg = orngEnsemble.BaggedLearner(tree, name="Bagged Tree")
forest = orngEnsemble.RandomForestLearner(trees=100, name="Random Forest")
learners = [bayes, svm, tree, bs, bg, forest]
results = orngTest.crossValidation(learners, data, folds=10)
cm = orngStat.computeConfusionMatrices(results,
                             classIndex=data.domain.classVar.values.index('1'))

stat = (('ClsAcc', 'CA(results)'),
        ('Sens', 'sens(cm)'),
        ('Spec', 'spec(cm)'),
        ('AUC', 'AUC(results)'),
        ('Info', 'IS(results)'),
        ('Brier', 'BrierScore(results)'))
scores = [eval("orngStat." + s[1]) for s in stat]
print "Learner        " + "".join(["%-9s" % s[0] for s in stat])
print "-----------------------------------------------------------------"
for (i, L) in enumerate(learners):
    print "%-15s " % L.name + "".join(["%5.3f   " % s[i] for s in scores])

print "\n\n"
measure = orngEnsemble.MeasureAttribute_randomForests(trees=100)
print "Random Forest Variable Importance"
print "---------------------------------"
imps = measure.importances(data)
for i,imp in enumerate(imps):
    print "%-20s %6.2f" % (data.domain.attributes[i].name, imp)

print '\n\n'
print 'Predictions on new data...'
bs_classifier = bs(data)
new_data = orange.ExampleTable('performance_orange_new.tab')
for obs in new_data:
    print bs_classifier(obs, orange.GetBoth)

Kiedy uruchamiam ten kod na moich danych, otrzymuję dane wyjściowe jak

In [1]: %run binary_predict.py
Learner        ClsAcc   Sens     Spec     AUC      Info     Brier
-----------------------------------------------------------------
Naive Bayes     0.556   0.444   0.643   0.756   0.516   0.613
SVM             0.611   0.667   0.714   0.851   0.264   0.582
Regression Tree 0.736   0.778   0.786   0.836   0.945   0.527
Boosted Tree    0.778   0.778   0.857   0.911   1.074   0.444
Bagged Tree     0.653   0.667   0.786   0.816   0.564   0.547
Random Forest   0.736   0.667   0.929   0.940   0.455   0.512


Random Forest Variable Importance
---------------------------------
Mileage            2.34
Trade_Area_QI      2.82
Site_Score         8.76

Z obiektami Orange można zrobić o wiele więcej, aby introspekcjonować wydajność i dokonywać porównań. Uznałem, że ten pakiet jest niezwykle pomocny w pisaniu niewielkiej ilości kodu, aby faktycznie zastosować metody do moich danych przy użyciu spójnego interfejsu API i abstrakcji problemów (tj. Nie musiałem używać sześciu różnych pakietów od sześciu różnych autorów, każdy z własnym podejście do projektowania API i dokumentacji itp.).

Josh Hemann
źródło