Schnellste SVM-Implementierung


16

Eher eine allgemeine Frage. Ich verwende eine rbf-SVM für die vorhersagende Modellierung. Ich denke, mein aktuelles Programm muss definitiv etwas beschleunigt werden. Ich benutze Scikit Learn mit einer Grob- bis Feinrastersuche + Kreuzvalidierung.

Jeder SVM-Lauf dauert ungefähr eine Minute, aber bei all den Iterationen finde ich es immer noch zu langsam. Angenommen, ich verteile den Teil der Kreuzvalidierung eventuell über mehrere Kerne. Gibt es Empfehlungen zur Beschleunigung meines Programms? Gibt es schnellere Implementierungen von SVMs? Ich habe von einigen GPU-SVMs gehört, mich aber nicht viel damit beschäftigt. Irgendwelche Benutzer und ist es schneller?


1
SGDClassifier in scikit-learn ist sehr schnell, aber für lineare SVMs. Sie könnten die Scikit-Learn-Leute fragen, auch den Tag Scikit-Learn hinzufügen.
Denis

Nichtlineare Kernel-SVMs sind dazu verdammt, langsam zu sein. Vielleicht sollten Sie anfangen, mit linearen Modellen zu spielen (siehe Vowpal Wabbit) und dann zu nichtlinear wechseln. Sie können sogar eine gewisse Nichtlinearität erzielen, indem Sie mit linearen Modellen komplexere Features erstellen. Nichtlineare Modelle führen häufig zu einer inkrementellen Leistungssteigerung bei hohem Rechenaufwand. Nichts gegen nichtlineare Kernel-SVM, aber aus praktischer Sicht nur zu beachten.
Vladislavs Dovgalecs

1
Sie können die Suche beschleunigen, indem Sie spezielle Optimierungsbibliotheken für die Hyperparametersuche verwenden, die weitaus effizienter sind als die Rastersuche (dh Sie müssen weitaus weniger Sätze von Hyperparametern testen). Beispiele für Optimierungsbibliotheken sind Optunity und Hyperopt.
Marc Claesen

Antworten:


16

Der Sofia-Algorithmus von Google enthält eine extrem schnelle Implementierung einer linearen SVM. Es ist eine der schnellsten SVMs, aber ich denke, sie unterstützt nur Klassifizierung und nur lineare SVMs.

Es gibt sogar ein R-Paket !


Ihr Link lautet nun "Paket 'RSofia' wurde aus dem CRAN-Repository entfernt." Irgendeine Idee warum?
James Hirschorn

@JamesHirschorn Der Entwickler hat die Wartung wahrscheinlich eingestellt. Sie können es aus dem CRAN-Archiv installieren.
Zach

10

Die einfachste Geschwindigkeit, die Sie erzielen können, ist die parallele Kreuzvalidierung. Persönlich mag ich das Caret- Paket in R , das foreach als Backend verwendet. Es macht es sehr einfach, die Kreuzvalidierung und die Rastersuche auf mehrere Kerne oder mehrere Computer zu verteilen.

Caret kann mit vielen verschiedenen Modellen umgehen, einschließlich rbf-SVMs:

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

Beachten Sie, dass die doMC () -Bibliothek nur unter Mac und Linux verfügbar ist. Sie sollte über die Befehlszeile und nicht über eine grafische Benutzeroberfläche ausgeführt werden und alle Modelle von RWeka beschädigen. Es ist auch einfach, MPI- oder SNOW- Cluster als paralleles Backend zu verwenden, bei denen diese Probleme nicht auftreten.


Danke Zach. Ich glaube, dass es bei Scikits auch eine Möglichkeit gibt, eine Kreuzvalidierung parallel durchzuführen, was ich beabsichtige. Ausgenommen davon, irgendwelche anderen Vorschläge zur Beschleunigung? Vielen Dank.
Tomas

@danjeharry: Parallele Kreuzvalidierung ist wirklich die niedrig hängende Frucht hier, und ich empfehle dringend, dass Sie das zuerst untersuchen. Darüber hinaus weiß ich nicht viel darüber, wie man SVMs gezielt beschleunigt. Wenn Sie einen parallelen SVM-Algorithmus finden, ist dies möglicherweise auch eine gute Idee. Wie viele Zeilen / Spalten enthält der Datensatz, mit dem Sie trainieren?
Zach

Danke Zach, ich werde mich um Parallel-Lebenslauf kümmern. Ich mache ungefähr 650 Attribute und 5000 Beispiele.
Tomas


2

Schauen Sie sich das Multiprocessing- Modul von Python an . Es macht das Parallelisieren von Dingen wirklich einfach und ist perfekt für die Kreuzvalidierung.


2

R hat ein großartiges GPU-beschleunigtes svm-Paket rpusvm , es dauert ~ 20 Sekunden, um mit 20.000 Samples * 100 Dimensionen zu trainieren, und ich stellte fest, dass die CPU nie überlastet ist, sodass die GPU effizient genutzt wird. Es ist jedoch eine NVIDIA-GPU erforderlich.


1

Warnung: Dies ist ein schamloser Stecker.

Betrachten Sie DynaML als eine Scala-basierte ML-Bibliothek, an der ich arbeite. Ich habe Kernel-basiertes LS-SVM (Least Squares Support Vector Machines) zusammen mit automatisiertem Kernel-Tuning implementiert, unter Verwendung von Grid Search oder Coupled Simulated Annealing.

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.