Come aumentare la precisione dei classificatori?


16

Sto usando l'esempio di OpenCV letter_recog.cpp per sperimentare su alberi casuali e altri classificatori. Questo esempio ha implementazioni di sei classificatori: alberi casuali, boosting, MLP, kNN, ingenui Bayes e SVM. Viene utilizzato il set di dati di riconoscimento lettere UCI con 20000 istanze e 16 funzionalità, che ho diviso a metà per addestramento e test. Ho esperienza con SVM, quindi ho impostato rapidamente il suo errore di riconoscimento al 3,3%. Dopo qualche sperimentazione quello che ho ottenuto è stato:

Riconoscimento lettera UCI:

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

Parametri utilizzati:

  • 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_depth = 7

  • MLP - method = BACKPROP, param = 0.001, max_iter = 300 (valori predefiniti - troppo lento per sperimentare)

  • kNN (k = 3) - k = 3

  • Bayes - nessuno

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

Dopo di che ho usato gli stessi parametri e testato su cifre e set di dati MNIST estraendo prima le caratteristiche del gradiente (dimensione del vettore 200 elementi):

cifre:

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

MNIST:

  • RTree - 1,4%
  • Boost - memoria esaurita
  • MLP - 1,0%
  • kNN (k = 3) - 1,2%
  • Bayes - 34,33%
  • SVM - 0,6%

Sono nuovo di tutti i classificatori tranne SVM e kNN, per questi due posso dire che i risultati sembrano soddisfacenti. E gli altri? Mi aspettavo di più dagli alberi casuali, su MNIST kNN offre una maggiore precisione, qualche idea su come aumentarlo? Boost e Bayes offrono una precisione molto bassa. Alla fine mi piacerebbe usare questi classificatori per creare un sistema di classificatori multipli. Qualche consiglio?

Risposte:


9

Riduzione dimensionale

Un'altra procedura importante è quella di confrontare i tassi di errore nell'allenamento e nel set di dati di test per vedere se si sta adattando troppo (a causa della "maledizione della dimensionalità"). Ad esempio, se il tasso di errore nel set di dati di test è molto più grande dell'errore nel set di dati di allenamento, questo sarebbe un indicatore.
In questo caso, potresti provare tecniche di riduzione della dimensionalità, come PCA o LDA.

Se sei interessato, ho scritto su PCA, LDA e alcune altre tecniche qui: http://sebastianraschka.com/index.html#machine_learning e nel mio repository GitHub qui: https://github.com/rasbt/pattern_classification

Convalida incrociata

Inoltre, potresti voler dare un'occhiata alle tecniche di validazione incrociata per valutare le prestazioni dei tuoi classificatori in modo più obiettivo


Sì, in effetti i tassi di errore sul set di dati di allenamento sono intorno a 0. La modifica dei parametri per ridurre il sovradattamento non ha comportato una maggiore accuratezza nel set di dati di test nel mio caso. Esaminerò le tecniche che menzionerai al più presto e commenterò, grazie.
Mika,

Quali sono le proporzioni relative di set di dati di training e test tra l'altro? Qualcosa di simile 70:30, 60:40 o 50:50?

Primo set di dati: il riconoscimento della lettera UCI è impostato su 50:50 (10000: 10000), le cifre sono circa 51:49 (1893: 1796) e MNIST è circa 86:14 (60000: 10000).
Mika,

Ho sperimentato la PCA, ma non ho ancora ottenuto buoni risultati con forrest casuale, ma boost e Bayes ora danno risultati simili ad altri classificatori. Ho trovato una discussione su forrest casuale qui: stats.stackexchange.com/questions/66543/… È possibile che in realtà non stia esagerando, ma non sono riuscito a trovare l'errore di previsione out-of-bag (OOB) menzionato lì. Esegui ora un esperimento con un gran numero di alberi per vedere se la precisione migliorerà.
Mika,

Ok, suoni che stai facendo un po 'di progresso :) Una domanda banale, ma hai standardizzato le tue caratteristiche (punteggio z) in modo che siano centrate attorno alla media con deviazione standard = 1?

5

Mi aspettavo di più dagli alberi casuali :

  • Con foreste casuali, in genere per N funzioni, le funzioni sqrt (N) vengono utilizzate per ogni costruzione dell'albero decisionale. Poiché nel tuo caso N = 20, potresti provare a impostare max_depth (il numero di funzioni secondarie per costruire ciascun albero decisionale) su 5.

  • Invece di alberi decisionali, sono stati proposti e valutati modelli lineari come stimatori di base in foreste casuali, in particolare regressione logistica multinomiale e Bayes ingenui. Questo potrebbe migliorare la tua precisione.

Su MNIST kNN offre una maggiore precisione, qualche idea su come aumentarla?

  • Prova con un valore più alto di K (diciamo 5 o 7). Un valore più alto di K ti darebbe prove più favorevoli sull'etichetta di classe di un punto.
  • È possibile eseguire PCA o l'analisi lineare discriminante di Fisher prima di eseguire il vicino k-più vicino. In questo modo potresti potenzialmente sbarazzarti delle funzionalità correlate mentre calcoli le distanze tra i punti, e quindi i tuoi vicini sarebbero più robusti.
  • Prova diversi valori K per punti diversi in base alla varianza nelle distanze tra i vicini K.

Credo che ti riferisci al parametro OpenCV nactive_vars (non max_depth), che ho impostato sul valore sqrt (N) predefinito, ovvero nactive_vars = sqrt (16) per il primo set di dati e sqrt (200) per gli altri due. max_depth determina se gli alberi crescono fino alla profondità massima (25 è il valore massimo) e equilibra tra insufficienza e iperattività, di più qui: stats.stackexchange.com/questions/66209/… Non sono sicuro di min_sample_count ma ho provato vari valori e impostandolo a 1 ha funzionato meglio.
Mika,

La documentazione di OpenCV fornisce una breve spiegazione dei parametri: docs.opencv.org/modules/ml/doc/… Per ora vorrei fare in modo che gli alberi casuali funzionino ragionevolmente bene e mantenere le cose semplici perché voglio concentrarmi sul lavoro con un sistema di classificatori multipli.
Mika,

Informazioni su kNN: questi sono tutti suggerimenti davvero validi, ma quello che volevo dire è che kNN ha funzionato meglio del classificatore di alberi casuali e penso che ci sia molto spazio per migliorare con gli alberi casuali.
Mika,

sì, non sono sicuro del perché la foresta casuale non stia funzionando altrettanto (o meglio) del semplice approccio k-NN ... potrebbe essere solo un approccio basato sul kernel in cui si tenta direttamente di stimare P (y | D) (output dato dati) come in k-NN senza stimare P (theta | D) (dati dati modello latente) come nei modelli parametrici.
Debasis
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.