webentwicklung-frage-antwort-db.com.de

Schnellste SVM-Implementierung, die in Python verwendet werden kann

Ich baue einige Vorhersagemodelle in Python und habe die SVM-Implementierung von Scikits Learn verwendet. Es war wirklich großartig, einfach zu bedienen und relativ schnell.

Leider fange ich an, durch meine Laufzeit eingeschränkt zu werden. Ich führe ein rbf-SVM auf einem vollständigen Datensatz von ca. 4 - 5000 mit 650 Funktionen aus. Jeder Lauf dauert ungefähr eine Minute. Aber mit einer 5-fachen Kreuzvalidierung + Gittersuche (mit einer Grob-zu-Fein-Suche) wird dies für meine Aufgabe etwas unmöglich. Haben die Leute im Allgemeinen Empfehlungen für die schnellste SVM-Implementierung, die in Python verwendet werden kann? Das oder irgendwelche Möglichkeiten, meine Modellierung zu beschleunigen?

Ich habe von der GPU-Implementierung von LIBSVM gehört, die scheinbar funktionieren könnte. Ich kenne keine anderen GPU-SVM-Implementierungen, die in Python verwendet werden können, aber es wäre definitiv anderen offen. Erhöht auch die Verwendung der GPU die Laufzeit erheblich?

Ich habe auch gehört, dass es Möglichkeiten gibt, die SVM von rbf durch Verwendung einer linearen SVM + -Feature-Map in Scikits zu approximieren. Nicht sicher, was die Leute über diesen Ansatz denken. Jeder, der diesen Ansatz verwendet, ist die Laufzeit deutlich erhöht?

Alle Ideen zur Steigerung der Programmgeschwindigkeit sind sehr willkommen.

33
tomas

Die skalierbarste Kernel-SVM-Implementierung, die ich kenne, ist LaSVM . Es ist in C geschrieben und daher in Python umhüllbar, wenn Sie Cython , ctypes oder cffi kennen. Alternativ können Sie es von der Befehlszeile aus verwenden. Sie können die Dienstprogramme in sklearn.datasets verwenden, um Konvertierungsdaten aus einem NumPy - oder CSR-Format in svmlight-formatierte Dateien zu laden, die LaSVM als Trainings-/Test-Set verwenden kann.

28
ogrisel

Alternativ können Sie die Rastersuche mit 1000 Stichproben anstelle des vollständigen Datensatzes ausführen:

>>> from sklearn.cross_validation import ShuffleSplit
>>> cv = ShuffleSplit(3, test_fraction=0.2, train_fraction=0.2, random_state=0)
>>> gs = GridSeachCV(clf, params_grid, cv=cv, n_jobs=-1, verbose=2)
>>> gs.fit(X, y)

Es ist sehr wahrscheinlich, dass die optimalen Parameter für 5000 Proben sehr nahe an den optimalen Parametern für 1000 Proben liegen. Das ist also ein guter Weg, um Ihre Grobsuche zu starten.

Mit n_jobs=-1 können Sie alle Ihre CPUs verwenden, um die einzelnen CV-Anpassungen parallel auszuführen. Es verwendet Mulitprocessing, sodass die Python-GIL kein Problem darstellt.

22
ogrisel

Erstens ist scikit-learn laut dem Benchmark von scikit-learn ( here ) bereits eines der schnellsten, wenn nicht das schnellste SVM-Paket. Daher sollten Sie andere Möglichkeiten in Betracht ziehen, um das Training zu beschleunigen. 

Wie von bavaza vorgeschlagen, können Sie versuchen, den Trainingsprozess mit mehreren Threads auszuführen. Wenn Sie die GridSearchCV-Klasse von Scikit-learn verwenden, können Sie das n_jobs-Argument einfach so einstellen, dass es größer als der Standardwert 1 ist, um das Training auf Kosten der Verwendung von mehr Arbeitsspeicher parallel auszuführen. __ Sie finden die Dokumentation here Ein Beispiel für die Verwendung der Klasse ist here .

Alternativ können Sie einen Blick auf die Shogun Machine Learning Library werfen hier

Shogun wurde für das maschinelle Lernen in großem Umfang mit Wrapper für viele gängige svm-Pakete entwickelt und ist in C/C++ mit Bindungen für Python implementiert. Laut dem oben genannten Benchmark von Scikit-Learn ist die Geschwindigkeit vergleichbar mit Scikit-Learn. Bei anderen Aufgaben (außer denen, die sie demonstriert haben) ist es möglicherweise schneller, daher ist es einen Versuch wert.

Schließlich können Sie versuchen, die Dimensionsreduzierung durchzuführen, z. Verwenden Sie PCA oder randomisierte PCA, um die Dimension Ihrer Merkmalsvektoren zu reduzieren. Das würde den Trainingsprozess beschleunigen. Die Dokumentation zu den jeweiligen Klassen finden Sie in diesen 2 Links: PCA , Randomized PCA . Beispiele zur Verwendung finden Sie im Abschnitt mit Beispielen für Scikit-Learn.

8
lightalchemist

Wenn Sie nur den RBF-Kernel (oder einen anderen quadratischen Kernel für diese Angelegenheit) verwenden möchten, empfehle ich die Verwendung von LIBSVM unter MATLAB oder Octave . Ich trainiere ein Modell mit 7000 Beobachtungen und 500 Merkmalen in etwa 6 Sekunden.

Der Trick besteht darin, vorberechnete Kernel zu verwenden, die LIBSVM bereitstellt, und die Matrixalgebra zu verwenden, um den Kernel in einem Schritt zu berechnen, anstatt die Daten zweimal zu überschneiden. Der Kernel benötigt etwa zwei Sekunden, um zu bauen, im Gegensatz zu LIBSVM-eigenen RBF-Kernel. Ich nehme an, Sie könnten dies in Python mit NumPy tun, aber ich bin mir nicht sicher, da ich es nicht ausprobiert habe.

4
charlieBrown

Ohne zu viel mit dem Vergleich von SVM-Bibliotheken zu tun, denke ich, dass die von Ihnen beschriebene Aufgabe (Kreuzvalidierung) von echtem Multi-Threading (d. H. Dem parallelen Betrieb mehrerer CPUs) profitieren kann. Wenn Sie CPython verwenden, wird Ihre (wahrscheinlich) Multi-Core-Maschine aufgrund von GIL nicht genutzt.

Sie können andere Implementierungen von Python ausprobieren, für die diese Einschränkung nicht gilt. Siehe PyPy oder IronPython , wenn Sie bereit sind, zu .NET zu gehen.

2
bavaza

Wenn Ihr Problem in zwei Klassen besteht, ist das Umschließen von CUDA-basiertem SVM mit Scikit-Learn hilfreich:

https://github.com/niitsuma/gpusvm/tree/master/python

1
niitsuma

Versuchen Sie svm_light !

Es ist eine böse-schnelle C-Implementierung von den infamen Thorsten Joachims in Cornell mit guten Python-Bindungen, und Sie können sie mit pip install pysvmlight installieren.

Ich empfehle einen Blick auf Scikit-Learns Stochastic Gradient Descent Implementierung. Der Standardscharnierverlust ist eine lineare SVM. Ich fand es unglaublich schnell.

0
szxk

Ich würde in Betracht ziehen, eine zufällige Gesamtstruktur zu verwenden, um die Anzahl der eingegebenen Features zu verringern.

Es gibt eine Option mit dem ExtraTreesRegressor und dem ExtraTreesClassifier, um Feature-Wichtigkeiten zu generieren. Sie können diese Informationen dann verwenden, um eine Teilmenge von Funktionen in Ihre SVM einzugeben.

0
denson