Implementazione SVM più veloce


16

Più di una domanda generale. Sto eseguendo un SVM rbf per la modellazione predittiva. Penso che il mio programma attuale abbia sicuramente bisogno di un po 'di accelerazione. Uso Scikit Learn con una ricerca della griglia da grossolana a fine + convalida incrociata.

Ogni esecuzione SVM richiede circa un minuto, ma con tutte le iterazioni, la trovo ancora troppo lenta. Supponendo che alla fine multi-thread la parte di convalida incrociata su più core, qualche consiglio su come accelerare il mio programma? Qualche implementazione più veloce degli SVM? Ho sentito parlare di alcuni SVM per GPU, ma non ho approfondito molto. Qualche utente ed è più veloce?


1
SGDClassifier in scikit-learn è molto veloce, ma per SVM lineari. Potresti chiedere ai ragazzi di scikit-learn, anche aggiungere tag scikit-learn.
denis,

I kernel SVM non lineari sono destinati a essere lenti. Forse dovresti iniziare a giocare con modelli lineari (controlla Vowpal Wabbit) e poi passare a non lineari. Puoi persino ottenere un po 'di non linearità creando funzionalità più complicate con modelli lineari. Spesso modelli non lineari comportano un aumento incrementale delle prestazioni a spese di calcolo elevate. Nulla contro il kernel SVM non lineare ma solo da tenere a mente, dal punto di vista pratico.
Vladislavs Dovgalecs,

1
È possibile accelerare utilizzando librerie di ottimizzazione specializzate per la ricerca dell'iperparametro, che sono molto più efficienti della ricerca della griglia (cioè richiedono test molto meno serie di iperparametri). Esempi di ottimizzazione delle librerie includono Optunity e Hyperopt.
Marc Claesen,

Risposte:


16

L' algoritmo Sofia di Google contiene un'implementazione estremamente veloce di un SVM lineare. È uno degli SVM più veloci in circolazione, ma penso che supporti solo la classificazione e supporti solo gli SVM lineari.

C'è anche un pacchetto R !


Il tuo link ora dice "il pacchetto 'RSofia' è stato rimosso dal repository CRAN". Qualche idea sul perché?
James Hirschorn,

@JamesHirschorn Probabilmente lo sviluppatore ha smesso di mantenerlo. Puoi installarlo dall'archivio CRAN.
Zach,

10

L'accelerazione più semplice che otterrai è l'esecuzione della convalida incrociata in parallelo. Personalmente, mi piace il pacchetto del cursore in R , che usa foreach come backend. Rende molto semplice coltivare la convalida incrociata e la ricerca in griglia su più core o più macchine.

Caret può gestire molti modelli diversi, tra cui SVM rbf:

library(caret)
library(doMC)
registerDoMC()
model <-  train(Species ~ ., data = iris, method="svmRadial", 
    trControl=trainControl(method='cv', number=10))
> confusionMatrix(model)
Cross-Validated (10 fold) Confusion Matrix 

(entries are percentages of table totals)

            Reference
Prediction   setosa versicolor virginica
  setosa       32.4        0.0       0.0
  versicolor    0.0       30.9       2.0
  virginica     0.9        2.4      31.3

Nota che la libreria doMC () è disponibile solo su mac e linux, dovrebbe essere eseguita dalla riga di comando, non da una GUI, e rompe tutti i modelli da RWeka. È anche facile da usare MPI o SNOW cluster come backend parallelo, che non presenta questi problemi.


Grazie Zach. Credo che Scikits abbia anche un modo di eseguire la validazione incrociata in parallelo, che è quello che ho intenzione di fare. Escludendo questo, altri suggerimenti sullo speedup? Grazie.
tomas

@danjeharry: la validazione incrociata parallela è davvero il frutto basso e qui ti consiglio vivamente di esplorarlo. Oltre a ciò, non so molto sull'accelerazione specifica degli SVM. Se riesci a trovare un algoritmo SVM parallelo, anche questa potrebbe essere una buona idea. Quante righe / colonne è il set di dati che stai utilizzando per addestrare?
Zach,

Grazie Zach guarderò in parallelo cv. Sto facendo circa 650 attributi e 5000 esempi.
tomas,


2

Dai un'occhiata al modulo multiprocessing di Python . Rende molto semplice il parallelismo delle cose ed è perfetto per la validazione incrociata.


2

R ha un ottimo pacchetto svm con accelerazione GPU rpusvm , ci vogliono circa 20 secondi per allenarsi su campioni da 20K * 100 dimensioni, e ho scoperto che la CPU non è mai sovraccaricata da essa, quindi usa la GPU in modo efficiente. Tuttavia, richiede una GPU NVIDIA.


1

Avviso: questa è una spina spudorata.

Considera DynaML una libreria ML basata su Scala su cui sto lavorando. Ho implementato LS-SVM (Least Squares Support Vector Machines) basato sul kernel insieme alla messa a punto automatizzata del kernel, usando la ricerca della griglia o la ricottura simulata accoppiata.

http://mandar2812.github.io/DynaML/

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.