2012-06-13 7 views
5

Sono nuovo di R e SVM e sto provando a profilare la funzione svm dal pacchetto e1071. Tuttavia, non riesco a trovare alcun set di dati di grandi dimensioni che mi permetta di ottenere una buona gamma di risultati di profilazione che varia la dimensione dei dati di input. Qualcuno sa come lavorare svm fuori? Quale set di dati dovrei usare? Qualche parametro particolare a svm che lo rende più difficile?Profilo SVM (e1071) in R

Copia alcuni comandi che sto utilizzando per testare le prestazioni. Forse è più utile e più facile da ottenere quello che sto cercando qui:

#loading libraries 
library(class) 
library(e1071) 
#I've been using golubEsets (more examples availables) 
library(golubEsets) 

#get the data: matrix 7129x38 
data(Golub_Train) 
n <- exprs(Golub_Train) 

#duplicate rows(to make the dataset larger) 
n<-rbind(n,n) 

#take training samples as a vector 
samplelabels <- as.vector([email protected]@data$ALL.AML) 

#calculate svm and profile it 
Rprof('svm.out') 
svmmodel1 <- svm(x=t(n), y=samplelabels, type='C', kernel="radial", cross=10) 
Rprof(NULL) 

continuo aumento il set di dati duplicazione righe e colonne, ma ho raggiunto il limite della memoria, invece di fare svm lavora di più ...

+1

La duplicazione dei punti di allenamento non rende il problema più difficile. Poiché la maggior parte SVM richiede che l'intero set di dati si adatti alla memoria principale, ha senso che alla fine si verifichino errori di memoria. – karenu

+0

quindi, come posso provare con un set di dati adeguato? Conoscete qualche esempio che potrei usare? – Manolete

+0

Sì, se vedi la mia risposta, ho elencato un numero di set di dati disponibili. Inoltre, dovresti eseguire la sintonizzazione dei parametri per trovare i parametri migliori, troverai che mentre cerchi i parametri che ti danno la massima precisione alcuni impiegheranno più tempo ad allenarsi di altri. Dai un'occhiata alla Guida pratica dell'autore di libsvm: http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFYQFjAA&url=http%3A%2F%2Fwww.csie.ntu .edu.tw% 2F ~ cjlin% 2Fpapers% 2Fguide% 2Fguide.pdf & ei = WtLhT46NO-jw0gG30pHVAw & usg = AFQjCNFol0McRktHC6gsBxKXqQMvmQUFeg – karenu

risposta

8

In termini di "lavoro SVM fuori" - ciò che renderà SVM più "impegnativo" è un modello più complesso che non è facilmente separabile, una dimensionalità più elevata e un set di dati più ampio e più denso.

prestazioni SVM degrada con:

  • dimensioni Dataset aumenta (numero di punti di dati)
  • sparsity diminuisce (meno zeri)
  • aumenti dimensionalità (numero di attributi)
  • Sofferenze vengono utilizzati kernel lineari (ei parametri del kernel possono rendere più complessa la valutazione del kernel )

variando i parametri di

Ci sono parametri che è possibile modificare per rendere SVM richiedere più tempo. Ovviamente i parametri influenzano la qualità della soluzione che si otterrà e potrebbero non avere senso usare.

Utilizzando C-SVM, la variazione di C provocherà diversi runtime. (Il parametro simile in nu-SVM è nu) Se il set di dati è ragionevolmente separabile, rendendo C più piccolo avrà un tempo di esecuzione più lungo perché SVM consentirà a più punti di allenamento di diventare vettori di supporto. Se il set di dati non è molto separabile, rendendo C più grande causerà tempi di esecuzione più lunghi perché in pratica si sta dicendo a SVM che si desidera una soluzione a margine stretto che si adatti strettamente ai dati e che richiederà molto più tempo per calcolare quando i dati non sono facilmente separato.

Spesso si scopre quando si esegue una ricerca di parametri che ci sono parametri che aumenteranno il tempo di calcolo senza aumenti apprezzabili dell'accuratezza.

Gli altri parametri sono i parametri del kernel e se li si varia per aumentare la complessità del calcolo del kernel, naturalmente il runtime SVM aumenterà. Il kernel lineare è semplice e sarà il più veloce; i kernel non lineari richiederanno ovviamente più tempo. Alcuni parametri potrebbero non aumentare la complessità di calcolo del kernel, ma imporrà un modello molto più complesso, che potrebbe richiedere molto tempo per SVM per trovare la soluzione ottimale.

dataset per l'utilizzo:

Il UCI Machine Learning Repository è una grande fonte di set di dati.

Il MNIST handwriting recognition dataset è una buona soluzione da utilizzare: è possibile selezionare in modo casuale sottoinsiemi di dati per creare set di dati di dimensioni sempre maggiori. Tieni presente che i dati al link contengono tutte le cifre, SVM è ovviamente binario, quindi dovrai ridurre i dati a due sole cifre o fare una sorta di SVM multi-classe.

Si può facilmente generare set di dati pure. Per generare un set di dati lineare, selezionare casualmente un vettore normale su un iperpiano, quindi generare un datapoint e determinare su quale lato dell'iperplano ricade per etichettarlo. Aggiungete un po 'di casualità per consentire ai punti entro una certa distanza dall'iperpiano di essere etichettati a volte in modo diverso. Aumentare la complessità aumentando la sovrapposizione tra le classi. Oppure generare un numero di cluster di punti normalmente distribuiti, etichettati come 1 o -1, in modo che le distribuzioni si sovrappongano ai bordi. L'esempio classico non lineare è una scacchiera. Genera punti ed etichettali in uno schema a scacchiera. Per rendere più difficile ingrandire il numero di quadrati, aumentare le dimensioni e aumentare il numero di punti dati. Dovrai ovviamente utilizzare un kernel non lineare per questo.

+0

Grazie mille per la tua grande spiegazione. Lo apprezzo. Ho aggiornato la mia domanda per vedere se questo aiuta – Manolete

+0

karenu E la matrice di input? Sto davvero cercando di capire quando e perché ho bisogno di applicare la trasposizione ad esso. Ho visto diversi esempi là fuori, e ognuno sta facendo una cosa diversa. Come posso sapere quando ho bisogno di applicare la t() alla matrice di input? – Manolete