2013-08-10 13 views
9

Ho scritto seguente codice e testarlo su piccola dati:Quanto tempo prende il classificatore SVM in treno?

classif = OneVsRestClassifier(svm.SVC(kernel='rbf')) 
classif.fit(X, y) 

Dove X, Y è array numpy. Sull'algoritmo dei piccoli dati funziona bene e mi dà le risposte giuste. Ma ho eseguito il mio programma circa 10 ore fa ... ed è ancora in corso. Esattamente in questo pezzo di codice. X è una matrice 30000x784, y 30000x1. Voglio sapere quanto ci vorrà, o è bloccato in qualche modo? Il mio laptop ha 4 GB di memoria, Core i5-480m.

+0

Quindi ... 30000 dimensioni e 30000 X 784 punti .... Non ho lavorato troppo a lungo con la macchina imparando ma quello è un vettore di funzionalità piuttosto grande e di alta dimensione ... non penso che sia troppo sorprendente per averlo fatto così a lungo ... potresti provare a ridurre le dimensioni per accelerarlo ... – Roy

+1

@Roy Ridurre il numero di istanze di addestramento sarebbe * molto * più efficace della riduzione della dimensionalità per i metodi del kernel. –

+0

@MarcClaesen Dovresti crederci sulla parola, non sono molto più di un novizio. – Roy

risposta

21

formazione SVM può essere arbitrario lungo, questo dipende da decine di parametri:

  • C parametri - maggiore è la pena di missclassification, più lento il processo di
  • kernel - più complicato il kernel, più lento il processo (RBF è il più complesso da quelle predefinite)
  • dimensione dei dati/dimensionalità - ancora una volta, la stessa regola

in generale, SMO di base l'algoritmo è O(n^3), quindi in caso di datapoint 30 000 deve eseguire il numero di operazioni proporzionale allo 2 700 000 000 000 che è davvero un numero enorme. Quali sono le tue opzioni?

  • cambiamento un kernel a quella lineare, 784 caratteristiche è un bel po ', RBF può essere ridondante
  • ridurre dimensionalità caratteristiche (PCA?)
  • basso è il C parametro
  • modello di treno sulla sottoinsieme dei tuoi dati per trovare i buoni parametri e poi allenare l'intero su qualche cluster/supercomputer
+3

Il tempo di calcolo del kernel di solito è un non-problema quando si considerano problemi veramente grandi. La differenza tra RBF e, ad esempio, polinomio è irrilevante. L'unico aspetto della complessità del kernel è lineare rispetto ad altri. Inoltre, la complessità dell'allenamento varia da 'O (n^2)' (smalll 'C') a' O (n^3) '(grande' C'). In terzo luogo, la dimensionalità dell'input non ha molta importanza nella complessità complessiva (che è in funzione del numero di istanze di addestramento, non della dimensionalità). –

+0

Grazie. Quel parametro C rende l'algoritmo più lento a cui non stavo pensando. E non sapevo che rbf è il kernel più complicato - ma è vero, quando cambio il kernel su "poly" dà un risultato in 2 ore. –

+0

@Marc - Grazie per i commenti. C'è un'enorme differenza tra RBF e polinomiale - non perché la funzione del kernel stessa sia complessa, ma che sia il RHKS indotto, ed è qui che avviene l'ottimizzazione. Secondo, O (n^3) è il limite superiore, ovviamente per C piccoli è più veloce. La tridimensionalità conta come all'interno di un costo di ogni calcolo del kernel (meno importante) e in quanto partecipa alla complessità della complessità del RHKS indotto (più importante) – lejlot

Problemi correlati