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?

tomas
quelle
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 !

Zach
quelle
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.

Zach
quelle
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
4

Mir ist klar, dass dies eine ziemlich alte Frage ist, aber es ist auch möglich (abhängig von der Größe Ihres Datensatzes kann es mehr oder weniger effektiv sein), niedrig dimensionierte Approximationen der Kernel-Feature-Map zu verwenden und diese dann in einer linearen SVM zu verwenden. Siehe http://scikit-learn.org/stable/modules/kernel_approximation.html

Matthew Saltz
quelle
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.

bayerj
quelle
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.

Löwe
quelle
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/

mandar2812
quelle