Comment augmenter la précision des classificateurs?

16

J'utilise l'exemple OpenCV letter_recog.cpp pour expérimenter sur des arbres aléatoires et d'autres classificateurs. Cet exemple a des implémentations de six classificateurs - arbres aléatoires, boosting, MLP, kNN, Bayes naïfs et SVM. Un ensemble de données de reconnaissance de lettres UCI avec 20000 instances et 16 fonctionnalités est utilisé, que j'ai divisé en deux pour la formation et les tests. J'ai de l'expérience avec SVM, j'ai donc rapidement réglé son erreur de reconnaissance à 3,3%. Après quelques expérimentations, j'ai obtenu:

Reconnaissance des lettres UCI:

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

Paramètres utilisés:

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

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

  • MLP - méthode = BACKPROP, param = 0,001, max_iter = 300 (valeurs par défaut - trop lent à expérimenter)

  • kNN (k = 3) - k = 3

  • Bayes - aucun

  • SVM - noyau RBF, C = 10, gamma = 0,01

Après cela, j'ai utilisé les mêmes paramètres et testé sur les jeux de données Digits et MNIST en extrayant d'abord les entités de gradient (éléments vectoriels de taille 200):

Chiffres:

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

MNIST:

  • RTrees - 1,4%
  • Boost - manque de mémoire
  • MLP - 1,0%
  • kNN (k = 3) - 1,2%
  • Bayes - 34,33%
  • SVM - 0,6%

Je suis nouveau dans tous les classificateurs sauf SVM et kNN, pour ces deux, je peux dire que les résultats semblent bons. Et les autres? Je m'attendais à plus d'arbres aléatoires, sur MNIST kNN donne une meilleure précision, des idées pour l'améliorer? Boost et Bayes donnent une très faible précision. En fin de compte, j'aimerais utiliser ces classificateurs pour créer un système de classificateurs multiples. Aucun conseil?

Mika
la source

Réponses:

9

Réduction de la dimensionnalité

Une autre procédure importante consiste à comparer les taux d'erreur sur la formation et l'ensemble de données de test pour voir si vous êtes en sur-ajustement (en raison de la «malédiction de la dimensionnalité»). Par exemple, si votre taux d'erreur sur l'ensemble de données de test est beaucoup plus élevé que l'erreur sur l'ensemble de données d'entraînement, ce serait un indicateur.
Dans ce cas, vous pouvez essayer des techniques de réduction de dimensionnalité, telles que PCA ou LDA.

Si vous êtes intéressé, j'ai écrit sur PCA, LDA et certaines autres techniques ici: http://sebastianraschka.com/index.html#machine_learning et dans mon référentiel GitHub ici: https://github.com/rasbt/pattern_classification

Validation croisée

Aussi, vous voudrez peut-être jeter un œil aux techniques de validation croisée afin d'évaluer les performances de vos classificateurs de manière plus objective


la source
Oui, en effet, les taux d'erreur sur l'ensemble de données d'entraînement sont d'environ 0. La modification des paramètres pour réduire le surapprentissage n'a pas entraîné une plus grande précision sur l'ensemble de données de test dans mon cas. Je vais examiner les techniques que vous mentionnez dès que possible et commenter, merci.
Mika
Quelles sont les proportions relatives de formation et de jeu de données de test btw? Quelque chose de ligne 70:30, 60:40 ou 50:50?
Premier ensemble de données - La reconnaissance de lettres UCI est définie sur 50:50 (10000: 10000), les chiffres sont d'environ 51:49 (1893: 1796) et MNIST est d'environ 86:14 (60000: 10000).
Mika
J'ai expérimenté avec PCA, je n'ai toujours pas obtenu de bons résultats avec forrest aléatoire, mais boost et Bayes donnent maintenant des résultats similaires à d'autres classificateurs. J'ai trouvé une discussion sur Forrest aléatoire ici: stats.stackexchange.com/questions/66543/… Il est possible que je ne sois pas trop en forme, mais je n'ai pas trouvé l'erreur de prédiction out-of-bag (OOB) mentionnée ici. Exécuter maintenant l'expérience avec un grand nombre d'arbres pour voir si la précision s'améliorera.
Mika
D'accord, les sons que vous faites un peu de progrès :) Une question triviale, mais avez-vous standardisé vos caractéristiques (score z) afin qu'elles soient centrées autour de la moyenne avec un écart-type = 1?
5

Je m'attendais à plus d'arbres aléatoires :

  • Avec des forêts aléatoires, généralement pour N entités, les fonctionnalités sqrt (N) sont utilisées pour chaque construction d'arbre de décision. Puisque dans votre cas N = 20, vous pouvez essayer de définir max_depth (le nombre de sous-entités pour construire chaque arbre de décision) à 5.

  • Au lieu d'arbres de décision, des modèles linéaires ont été proposés et évalués comme estimateurs de base dans les forêts aléatoires, en particulier la régression logistique multinomiale et les Bayes naïfs. Cela pourrait améliorer votre précision.

Sur MNIST kNN donne une meilleure précision, des idées pour l'améliorer?

  • Essayez avec une valeur plus élevée de K (disons 5 ou 7). Une valeur plus élevée de K vous donnerait plus de preuves à l'appui de l'étiquette de classe d'un point.
  • Vous pouvez exécuter PCA ou l'analyse discriminante linéaire de Fisher avant d'exécuter k-voisin le plus proche. Par cela, vous pourriez potentiellement vous débarrasser des fonctionnalités corrélées lors du calcul des distances entre les points, et donc vos k voisins seraient plus robustes.
  • Essayez différentes valeurs de K pour différents points en fonction de la variance des distances entre les K voisins.
Debasis
la source
Je crois que vous faites référence au paramètre OpenCV nactive_vars (pas max_depth), que j'ai défini sur la valeur sqrt (N) par défaut, c'est-à-dire nactive_vars = sqrt (16) pour le premier jeu de données et sqrt (200) pour les deux autres. max_depth détermine si les arbres atteignent leur pleine profondeur (25 est sa valeur maximale) et équilibre entre le sous-ajustement et le sur-ajustement, plus d'informations ici: stats.stackexchange.com/questions/66209/… Je ne suis pas sûr de min_sample_count mais j'ai essayé différentes valeurs et le paramétrer à 1 a fonctionné le mieux.
Mika
La documentation OpenCV donne une brève explication des paramètres: docs.opencv.org/modules/ml/doc/… Pour l'instant, je voudrais que les arbres aléatoires fonctionnent assez bien et que les choses restent simples parce que je veux me concentrer sur le travail avec un système de classificateurs multiples.
Mika
À propos de kNN - ce sont toutes de très bonnes suggestions, mais ce que je voulais dire, c'est que kNN fonctionnait mieux que le classificateur d'arbres aléatoires et je pense qu'il y a beaucoup de place pour l'amélioration avec les arbres aléatoires.
Mika
oui, je ne sais pas pourquoi la forêt aléatoire ne fonctionne pas aussi bien (ou mieux) que l'approche simpliste k-NN ... il se pourrait que ce soit une approche basée sur le noyau où vous essayez directement d'estimer P (y | D) (données de sortie données) comme dans k-NN sans estimer P (thêta | D) (données données de modèle latent) comme dans les modèles paramétriques.
Debasis