2010-02-12 7 views
16

Come dovrei avvicinarmi ad una situtation quando provo ad applicare un algoritmo ML (classificazione, per essere più specifico, SVM in particolare) su qualche input di alta dimensione, ed i risultati che ottengo non sono abbastanza soddisfacenti?Come affrontare i problemi di apprendimento automatico con spazio di input di dimensioni elevate?

È possibile visualizzare dati a 1, 2 o 3 dimensioni, insieme ai risultati dell'algoritmo, in modo da poter capire cosa sta succedendo e avere un'idea di come violare il problema. Una volta che i dati sono più di 3 dimensioni, oltre a giocare intuitivamente con i parametri non sono sicuro di come attaccarlo?

risposta

24

Che cosa fai ai dati ? La mia risposta: nulla. Gli SVM sono progettati per il per gestire dati ad alta dimensione. Sto lavorando a un problema di ricerca in questo momento che coinvolge la supervisione della classificazione usando SVM. Insieme alla ricerca di fonti su Internet, ho fatto i miei esperimenti sull'impatto della riduzione della dimensionalità prima della classificazione. La pre-elaborazione delle funzionalità mediante PCA/LDA non ha aumentato in modo significativo la precisione di classificazione dell'SVM.

Per me, questo ha assolutamente senso dal modo in cui funzionano gli SVM. Sia x un vettore di caratteristiche m-dimensionale. Sia y = Axe dove y è in R^n e x è in R^m per n < m, cioè y è x proiettato su uno spazio di dimensione inferiore. Se le classi Y1 e Y2 sono separabili linearmente in R^n, allora le corrispondenti classi X1 e X2 sono separabili linearmente in R^m. Pertanto, i sottospazi originali dovrebbero essere "almeno" separabili come le loro proiezioni su dimensioni inferiori, cioè, in teoria, il PCA non dovrebbe essere d'aiuto.

Qui è una discussione che dibatte l'uso di PCA prima SVM: link

Che cosa si può fare è modificare le opzioni di SVM. Ad esempio, con libsvm link, i parametri C e gamma sono di importanza cruciale per la classificazione del successo. Libsvm faq, in particolare questa voce link, contiene ulteriori suggerimenti utili. Tra questi:

  1. Ridimensiona le tue caratteristiche prima della classificazione.
  2. Cerca di ottenere lezioni bilanciate. Se impossibile, penalizza una classe più dell'altra. Vedi più riferimenti sullo squilibrio SVM.
  3. Controllare i parametri SVM. Prova molte combinazioni per arrivare al migliore.
  4. Utilizzare innanzitutto il kernel RBF. Funziona quasi sempre meglio (a livello computazionale).
  5. Quasi dimenticato ... prima del test, cross validate!

MODIFICA: Vorrei solo aggiungere questo "punto dati". Recentemente ho fatto un altro esperimento su larga scala utilizzando il SVM con preelaborazione PCA su quattro set di dati esclusivi. PCA non ha migliorato i risultati della classificazione per nessuna scelta di dimensionalità ridotta. I dati originali con semplice ridimensionamento diagonale (per ogni caratteristica, sottrazione media e divisione per deviazione standard) hanno ottenuto risultati migliori. Non sto facendo nessuna conclusione generale - condivido solo questo esperimento. Forse su dati diversi, PCA può aiutare.

+3

La questione non era riguardo alla riduzione della dimensionalità, l'autore si è lamentato solo di non essere riuscito a prendere confidenza con i dati multidimensionali. Ma comunque. Il fatto che PCA non abbia aiutato nel tuo caso non significa che sia inutile. Prova a recuperare i dati artificiali: i punti separabili in una dimensione. Aggiungi un po 'di rumore per ottenere dati a 50 dimensioni. L'iperpiano del margine massimo è probabile che si allontani. –

+3

Penso che la mia risposta, nella sua interezza, faccia la domanda. Ma riguardo alla dichiarazione, "aggiungi un po 'di rumore per ottenere dati a 50 dimensioni", aggiungendo * rumore * non è lo stesso che aggiungere * funzioni *. Se si concatenano 49 funzioni contenenti il ​​rumore non correlato all'unica caratteristica significativa da cui due classi sono separabili, SVM continuerà a separare le classi nello spazio 50-dimensionale con successo come nello spazio monodimensionale. Non c'è alcun dubbio a riguardo. –

+1

Steve, ho chiesto a un professore di questo problema. Hai certamente ragione che la riduzione della dimensionalità non aiuta a separare le classi, ma può comunque aiutare a migliorare il potere discriminante di un classificatore. Inoltre, PCA non è il metodo migliore qui poiché non tiene conto della struttura delle classi. La macchina vettoriale di rilevanza potrebbe essere più idonea: http://en.wikipedia.org/wiki/Relevance_Vector_Machine –

6

Alcuni suggerimenti:

  • dati di progetto (solo per la visualizzazione) in uno spazio inferiore dimensioni (utilizzando PCA o MDS o qualsiasi altra cosa ha un senso per i dati)

  • cercare di capire il motivo per cui l'apprendimento non riesce. Pensi che vada per il meglio? Pensi di avere abbastanza dati? È possibile che non ci siano abbastanza informazioni nelle funzionalità per risolvere l'attività che stai tentando di risolvere? Ci sono modi per rispondere a ciascuna di queste domande senza visualizzare i dati.

Inoltre, se ci dite che cosa il compito è e ciò che la vostra uscita SVM è, ci possono essere suggerimenti più specifici la gente potesse fare.

1

Se non sbaglio, stai cercando di vedere quali parametri di SVM ti offrono il risultato migliore. Il tuo problema è l'adattamento di modello/curva. Ho lavorato su un problema simile un paio di anni fa. Ci sono tonnellate di biblioteche e algos per fare lo stesso. Ho usato l'algoritmo Newton-Raphson e una variazione dell'algoritmo genetico per adattarla alla curva.

Genera/indovina/ottieni il risultato che speri, attraverso l'esperimento del mondo reale (o se stai facendo una classificazione semplice, fallo da solo). Confronta questo con l'output del tuo SVM. Gli algos che ho menzionato in precedenza ripetono questo processo fino a quando il risultato del tuo modello (SVM in questo caso) corrisponde in qualche modo ai valori attesi (nota che questo processo richiederebbe un po 'di tempo in base al tuo problema/dimensione dei dati .. ci sono voluti circa 2 mesi per me un cluster beowulf a 140 nodi).

Se si sceglie di andare con Newton-Raphson, this potrebbe essere un buon punto di partenza.

3

vorrei affrontare il problema nel modo seguente:

Cosa si intende per "i risultati che ottengo non sono del tutto soddisfacenti"?

Se il tasso di classificazione sulla formazione dati non è soddisfacente, essa implica che o

  • Si hanno valori anomali nei tuoi dati di allenamento (dati che sono erroneamente classificati). In questo caso puoi provare algoritmi come RANSAC per affrontarlo.
  • Il tuo modello (SVM in questo caso) non è adatto per questo problema. Questo può essere diagnosticato provando altri modelli (adaboost ecc.) O aggiungendo più parametri al modello corrente.
  • La rappresentazione dei dati non è particolarmente adatta per l'attività di classificazione.In questo caso pre-elaborazione dei dati con la selezione delle funzioni o tecniche di riduzione dimensionalità aiuterebbero

Se il tasso di classificazione sul test dati non è soddisfacente, essa implica che il modello overfits i dati:

  • O il tuo modello è troppo complesso (troppi parametri) e deve essere ulteriormente limitato,
  • Oppure lo hai addestrato su un set di allenamento che è troppo piccolo e hai bisogno di più dati

Ovviamente può essere una miscela degli elementi di cui sopra. Questi sono tutti metodi "ciechi" per attaccare il problema. Per ottenere maggiori informazioni sul problema, è possibile utilizzare i metodi di visualizzazione proiettando i dati in dimensioni inferiori o cercare modelli che si adattino meglio al dominio del problema man mano che lo si capisce (ad esempio, se si sa che i dati sono distribuiti normalmente, è possibile utilizzare GMM per modellare i dati ...)

3

Si può provare a ridurre la dimensionalità del problema tramite PCA o la tecnica simile. Attenzione, il PCA ha due punti importanti. (1) Si presuppone che i dati a cui è applicata siano normalmente distribuiti e (2) i dati risultanti perdano il loro significato naturale (risultante in una blackbox). Se puoi vivere con quello, provalo.

Un'altra opzione è provare diversi algoritmi di selezione dei parametri. Dato che gli SVM sono già stati menzionati qui, potresti provare l'approccio di Chang e Li (Feature Ranking Using Linear SVM) in cui hanno utilizzato SVM lineare per preselezionare "caratteristiche interessanti" e poi utilizzato SVM basato su RBF sulle funzionalità selezionate. Se hai familiarità con Orange, a python data mining library, sarai in grado di codificare questo metodo in meno di un'ora. Si noti che questo è un approccio avido che, a causa della sua "avidità" potrebbe fallire nei casi in cui le variabili di input sono altamente correlate. In tal caso, e se non è possibile risolvere questo problema con PCA (vedi sopra), si potrebbe voler andare a metodi euristici, che cercano di selezionare le migliori combinazioni possibili di predittori. La trappola principale di questo tipo di approcci è l'alto potenziale di sovralimentazione. Assicurati di avere un gruppo di dati "vergini" che non sono stati visualizzati durante l'intero processo di costruzione del modello. Metti alla prova il tuo modello su quei dati solo una volta, dopo che sei sicuro che il modello è pronto. Se non si riesce, non utilizzare questi dati ancora una volta per convalidare un altro modello, sarà necessario trovare un nuovo set di dati. Altrimenti non sarai sicuro di non avere più il sopravvento.

Elenco dei lavori selezionati sulla selezione dei parametri: Feature selection for high-dimensional genomic microarray data

Oh, e un'altra cosa su SVM. SVM è una scatola nera. È meglio capire qual è il meccanismo che genera i dati e modella il meccanismo e non i dati. D'altra parte, se fosse possibile, molto probabilmente non saresti qui a fare questa domanda (e non sarei così amareggiato nel sovraffollamento).

Elenco dei lavori selezionati sulla selezione dei parametri

  1. Feature selection for high-dimensional genomic microarray data
  2. Wrappers for feature subset selection
  3. Parameter selection in particle swarm optimization
  4. ho lavorato nel laboratorio che ha sviluppato questo Stochastic method to determine, in silico, the drug like character of molecules