Wie kann die Genauigkeit von Klassifikatoren erhöht werden?

16

Ich benutze das OpenCV-Beispiel letter_recog.cpp, um mit zufälligen Bäumen und anderen Klassifikatoren zu experimentieren. In diesem Beispiel sind sechs Klassifikatoren implementiert - Random Tree, Boosting, MLP, kNN, naive Bayes und SVM. Es wird ein UCI-Brieferkennungsdatensatz mit 20000 Instanzen und 16 Funktionen verwendet, den ich zum Trainieren und Testen in zwei Hälften geteilt habe. Ich habe Erfahrung mit SVM, daher habe ich den Erkennungsfehler schnell auf 3,3% gesetzt. Nach einigem Experimentieren bekam ich:

UCI Brieferkennung:

  • RTrees - 5,3%
  • Steigerung - 13%
  • MLP - 7,9%
  • kNN (k = 3) - 6,5%
  • Bayes - 11,5%
  • SVM - 3,3%

Verwendete Parameter:

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

  • Boost - boost_type = REAL, weak_count = 200, weight_trim_rate = 0,95, max_tiefe = 7

  • MLP - method = BACKPROP, param = 0.001, max_iter = 300 (Standardwerte - zu langsam zum Experimentieren)

  • kNN (k = 3) - k = 3

  • Bayes - keine

  • SVM - RBF-Kernel, C = 10, Gamma = 0,01

Danach habe ich dieselben Parameter verwendet und an Digits und MNIST-Datensätzen getestet, indem ich zuerst Gradienten-Features extrahiert habe (Vektorgröße 200 Elemente):

Ziffern:

  • RTrees - 5,1%
  • Steigerung - 23,4%
  • MLP - 4,3%
  • kNN (k = 3) - 7,3%
  • Bayes - 17,7%
  • SVM - 4,2%

MNIST:

  • RTrees - 1,4%
  • Boost - zu wenig Speicher
  • MLP - 1,0%
  • kNN (k = 3) - 1,2%
  • Bayes - 34,33%
  • SVM - 0,6%

Ich bin neu in allen Klassifikatoren außer SVM und kNN, für diese beiden kann ich sagen, dass die Ergebnisse in Ordnung zu sein scheinen. Was ist mit anderen Ich habe mehr von zufälligen Bäumen erwartet, auf MNIST gibt kNN eine bessere Genauigkeit, gibt es Ideen, wie man es höher bringt? Boost und Bayes ergeben eine sehr geringe Genauigkeit. Am Ende möchte ich diese Klassifikatoren verwenden, um ein System mit mehreren Klassifikatoren zu erstellen. Irgendein Rat?

Mika
quelle

Antworten:

9

Dimensionsreduktion

Ein weiteres wichtiges Verfahren besteht darin, die Fehlerraten in Trainings- und Testdatensätzen zu vergleichen, um festzustellen, ob Sie überanpassungsfähig sind (aufgrund des "Fluches der Dimensionalität"). Wenn Ihre Fehlerrate im Testdatensatz beispielsweise viel größer ist als der Fehler im Trainingsdatensatz, ist dies ein Indikator.
In diesem Fall können Sie Dimensionalitätsreduzierungstechniken wie PCA oder LDA ausprobieren.

Wenn Sie interessiert sind, habe ich hier über PCA, LDA und einige andere Techniken geschrieben: http://sebastianraschka.com/index.html#machine_learning und hier in meinem GitHub-Repo: https://github.com/rasbt/pattern_classification

Quervalidierung

Vielleicht möchten Sie sich auch mit Kreuzvalidierungstechniken befassen, um die Leistung Ihrer Klassifikatoren objektiver zu bewerten


quelle
Ja, in der Tat sind die Fehlerraten im Trainingsdatensatz ungefähr 0. Das Ändern der Parameter zur Reduzierung der Überanpassung führte in meinem Fall nicht zu einer höheren Genauigkeit im Testdatensatz. Ich werde mich so schnell wie möglich mit den Techniken befassen, die Sie erwähnen, und mich dazu äußern, danke.
Mika
Wie sind die relativen Anteile des Trainings- und Testdatensatzes übrigens? Etwas zwischen 70:30, 60:40 oder 50:50?
Erster Datensatz - Die UCI-Buchstabenerkennung ist auf 50:50 (10000: 10000), die Ziffern auf 51:49 (1893: 1796) und die MNIST auf 86:14 (60000: 10000) eingestellt.
Mika
Ich habe mit PCA experimentiert und immer noch keine guten Ergebnisse mit zufälligem forrest erzielt, aber Boost und Bayes liefern jetzt ähnliche Ergebnisse wie andere Klassifikatoren. Ich habe hier eine Diskussion über zufälliges Forrest gefunden: stats.stackexchange.com/questions/66543/… Es ist möglich, dass ich nicht überanpassend bin, aber den dort genannten OOB-Vorhersagefehler nicht gefunden habe. Experimentieren Sie jetzt mit einer großen Anzahl von Bäumen, um festzustellen, ob sich die Genauigkeit verbessert.
Mika
Okay, hört sich so an, als ob Sie ein bisschen Fortschritte machen :) Eine triviale Frage, aber haben Sie Ihre Features (Z-Score) so standardisiert, dass sie um den Mittelwert mit der Standardabweichung = 1 zentriert sind?
5

Ich habe mehr von zufälligen Bäumen erwartet :

  • Bei zufälligen Gesamtstrukturen, normalerweise für N Features, werden sqrt (N) Features für jede Entscheidungsbaumkonstruktion verwendet. Da in Ihrem Fall N = 20 ist, können Sie versuchen, max_depth (die Anzahl der Untermerkmale zum Erstellen jedes Entscheidungsbaums) auf 5 zu setzen.

  • Anstelle von Entscheidungsbäumen wurden lineare Modelle als Basisschätzer in zufälligen Wäldern vorgeschlagen und bewertet, insbesondere multinomiale logistische Regression und naive Bayes. Dies kann Ihre Genauigkeit verbessern.

Auf MNIST gibt kNN bessere Genauigkeit, irgendwelche Ideen, wie man es höher bekommt?

  • Versuchen Sie es mit einem höheren Wert von K (z. B. 5 oder 7). Ein höherer Wert von K würde die Klassenbezeichnung eines Punktes besser belegen.
  • Sie könnten PCA oder Fisher's Linear Discriminant Analysis ausführen, bevor Sie den nächsten Nachbarn ausführen. Auf diese Weise könnten Sie möglicherweise korrelierte Merkmale beseitigen, während Sie die Entfernungen zwischen den Punkten berechnen, und daher wären Ihre Nachbarn robuster.
  • Probieren Sie verschiedene K-Werte für verschiedene Punkte aus, basierend auf der Varianz der Abstände zwischen den K-Nachbarn.
Debasis
quelle
Ich glaube, Sie beziehen sich auf den OpenCV-Parameter nactive_vars (nicht max_depth), für den ich den Standardwert sqrt (N) festgelegt habe, dh nactive_vars = sqrt (16) für den ersten Datensatz und sqrt (200) für die beiden anderen. max_depth bestimmt, ob Bäume bis zur vollen Tiefe wachsen (25 ist der Maximalwert) und ob ein Gleichgewicht zwischen Unter- und Überanpassung besteht. Weitere Informationen hierzu finden Sie hier: stats.stackexchange.com/questions/66209/… Sie sind sich nicht sicher, ob min_sample_count vorhanden ist, aber ich habe verschiedene Werte ausprobiert und sie festgelegt zu 1 hat am besten geklappt.
Mika
Die OpenCV-Dokumentation enthält eine kurze Erklärung der Parameter: docs.opencv.org/modules/ml/doc/… Im Moment möchte ich dafür sorgen, dass zufällige Bäume einigermaßen gut funktionieren und die Dinge einfach bleiben, da ich mich auf die Arbeit mit einem System mit mehreren Klassifikatoren konzentrieren möchte.
Mika
Über kNN - das sind alles wirklich gute Vorschläge, aber ich wollte damit sagen, dass kNN besser abschneidet als der Klassifikator für zufällige Bäume, und ich denke, dass es bei zufälligen Bäumen viel Raum für Verbesserungen gibt.
Mika
Ja, ich bin mir nicht sicher, warum zufällige Gesamtstrukturen nicht so gut (oder besser) abschneiden wie der vereinfachte k-NN-Ansatz. Es kann aber auch sein, dass Sie bei einem kernelbasierten Ansatz direkt versuchen, P (y |) zu schätzen D) (Ausgabe gegebener Daten) wie in k-NN ohne Schätzung von P (Theta | D) (Latentes Modell gegebene Daten) wie in den parametrischen Modellen.
Debasis