Najszybsza implementacja SVM

16

Bardziej ogólne pytanie. Korzystam z SVM rbf do modelowania predykcyjnego. Myślę, że mój obecny program zdecydowanie potrzebuje przyspieszenia. Używam scikit learning z prostym do dokładnego wyszukiwania siatki + sprawdzania poprawności.

Każdy przebieg SVM zajmuje około minuty, ale mimo wszystkich iteracji wciąż uważam, że jest zbyt wolny. Zakładając, że w końcu mam wielowątkową część weryfikacji krzyżowej na wielu rdzeniach, jakieś zalecenia dotyczące przyspieszenia mojego programu? Jakieś szybsze implementacje SVM? Słyszałem o niektórych SVM GPU, ale nie zagłębiłem się w to zbyt wiele. Są użytkownicy i czy jest to szybsze?

Tomas
źródło
1
SGDClassifier w scikit-learn jest bardzo szybki, ale dla liniowych maszyn SVM. Możesz poprosić facetów scikit-learn, a także dodać tag scikit-learn.
den
Nieliniowe SVM jądra jest skazane na powolność. Być może powinieneś zacząć grać z modelami liniowymi (sprawdź Vowpal Wabbit), a następnie przejść do trybu nieliniowego. Możesz nawet uzyskać nieliniowość, tworząc bardziej skomplikowane operacje za pomocą modeli liniowych. Dość często modele nieliniowe powodują pewien przyrostowy wzrost wydajności przy dużych kosztach obliczeniowych. Nie ma nic przeciwko nieliniowemu SVM jądra, ale należy pamiętać, z praktycznego punktu widzenia.
Vladislavs Dovgalecs
1
Możesz przyspieszyć, używając wyspecjalizowanych bibliotek strojenia do wyszukiwania hiperparametrów, które są znacznie wydajniejsze niż wyszukiwanie siatki (tj. Wymagają testowania znacznie mniejszej liczby zestawów hiperparametrów). Przykłady bibliotek tuningowych obejmują Optunity i Hyperopt.
Marc Claesen

Odpowiedzi:

16

Algorytm Sofii Google zawiera niezwykle szybką implementację liniowej maszyny SVM. Jest to jedna z najszybszych dostępnych maszyn SVM, ale myślę, że obsługuje tylko klasyfikację i obsługuje tylko liniowe maszyny SVM.

Jest nawet pakiet R !

Zach
źródło
Twój link mówi teraz, że „pakiet„ RSofia ”został usunięty z repozytorium CRAN.” Masz pomysł, dlaczego?
James Hirschorn,
@JamesHirschorn Deweloper prawdopodobnie przestał go utrzymywać. Możesz zainstalować go z archiwum CRAN.
Zach.
10

Najłatwiejszym przyspieszeniem jest równoległe przeprowadzenie weryfikacji krzyżowej. Osobiście podoba mi się pakiet Caret w R , który używa foreach jako backendu. Ułatwia to przeprowadzanie weryfikacji krzyżowej i wyszukiwanie siatki na wielu rdzeniach lub wielu maszynach.

Caret może obsługiwać wiele różnych modeli, w tym 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

Zauważ, że biblioteka doMC () jest dostępna tylko na Mac i Linux, powinna być uruchamiana z wiersza poleceń, a nie z GUI, i psuje wszelkie modele z RWeka. Łatwo jest również używać klastrów MPI lub SNOW jako równoległego zaplecza, które nie mają tych problemów.

Zach
źródło
Dzięki Zach. Wierzę, że scikity mają również możliwość równoległego prowadzenia walidacji krzyżowej, co planuję zrobić. Pomijając to, jakieś inne sugestie dotyczące przyspieszenia? Dzięki.
tomas
@danjeharry: równoległa walidacja krzyżowa jest naprawdę nisko wiszącym owocem i zdecydowanie sugeruję, abyś najpierw ją zbadał. Poza tym niewiele wiem o przyspieszaniu SVM. Jeśli możesz znaleźć równoległy algorytm SVM, może to być również dobry pomysł. Ile wierszy / kolumn używa zestaw danych do trenowania?
Zach
Dzięki Zach zajrzę do równoległego CV. Robię około 650 atrybutów i 5000 przykładów.
tomas
4

Zdaję sobie sprawę, że jest to dość stare pytanie, ale możliwe jest również (w zależności od rozmiaru zestawu danych może być mniej lub bardziej skuteczne) użycie przybliżeń niskiego wymiaru mapy funkcji jądra, a następnie użycie jej w liniowej SVM. Zobacz http://scikit-learn.org/stable/modules/kernel_approximation.html

Matthew Saltz
źródło
2

Zobacz moduł wieloprocesowy Pythona . Sprawia, że ​​tworzenie równoległych elementów jest naprawdę łatwe i jest idealny do weryfikacji krzyżowej.

bayerj
źródło
2

R ma świetny pakiet svm z akceleracją GPU , trenowanie na próbkach 20K * 100 wymiarów zajmuje ~ 20 sekund, a ja odkryłem, że procesor nigdy nie jest przez niego przeciążony, więc efektywnie wykorzystuje GPU. Wymaga to jednak karty graficznej NVIDIA.

Lew
źródło
1

Ostrzeżenie: jest to bezwstydna wtyczka.

Rozważ DynaML bibliotekę ML opartą na Scali, nad którą pracuję. Zaimplementowałem LS-SVM oparty na jądrze (maszyny wektorowe z obsługą najmniejszych kwadratów) wraz z automatycznym dostrajaniem jądra, za pomocą wyszukiwania siatki lub sprzężonego symulowanego wyżarzania.

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

mandar2812
źródło