Implémentation SVM la plus rapide

16

Plus une question générale. J'utilise un SVM rbf pour la modélisation prédictive. Je pense que mon programme actuel a vraiment besoin d'être accéléré. J'utilise scikit learn avec une recherche de grille grossière à fine + validation croisée.

Chaque exécution de SVM prend environ une minute, mais avec toutes les itérations, je la trouve toujours trop lente. En supposant que j'ai finalement multi-threadé la partie de validation croisée sur plusieurs cœurs, des recommandations pour accélérer mon programme? Des implémentations plus rapides des SVM? J'ai entendu parler de certains SVM GPU, mais je n'y ai pas beaucoup creusé. Des utilisateurs et est-ce plus rapide?

tomas
la source
1
SGDClassifier dans scikit-learn est très rapide, mais pour les SVM linéaires. Vous pourriez demander aux gars de scikit-learn, ajoutez également la balise scikit-learn.
denis
Les SVM à noyau non linéaire sont voués à être lents. Vous devriez peut-être commencer à jouer avec des modèles linéaires (consultez Vowpal Wabbit), puis passer à non linéaire. Vous pouvez même obtenir une certaine non-linéarité en créant des fonctions plus complexes avec des modèles linéaires. Très souvent, les modèles non linéaires entraînent une augmentation incrémentielle des performances à des frais de calcul importants. Rien contre le noyau non linéaire SVM mais juste pour garder à l'esprit, d'un point de vue pratique.
Vladislavs Dovgalecs
1
Vous pouvez accélérer en utilisant des bibliothèques de réglage spécialisées pour la recherche d'hyperparamètres, qui sont beaucoup plus efficaces que la recherche dans la grille (c'est-à-dire, nécessitent de tester beaucoup moins d'ensembles d'hyperparamètres). Des exemples de bibliothèques de réglage incluent Optunity et Hyperopt.
Marc Claesen

Réponses:

16

L' algorithme Sofia de Google contient une implémentation extrêmement rapide d'un SVM linéaire. C'est l'un des SVM les plus rapides du marché, mais je pense qu'il ne prend en charge que la classification et ne prend en charge que les SVM linéaires.

Il y a même un package R !

Zach
la source
Votre lien indique maintenant que "le package 'RSofia' a été supprimé du référentiel CRAN." Une idée pourquoi?
James Hirschorn
@JamesHirschorn Le développeur a probablement cessé de le maintenir. Vous pouvez l'installer à partir des archives CRAN.
Zach
10

L'accélération la plus simple que vous obtiendrez est d'exécuter la validation croisée en parallèle. Personnellement, j'aime le package caret en R , qui utilise foreach comme backend. Il est très facile d'exploiter la validation croisée et la recherche dans la grille sur plusieurs cœurs ou plusieurs machines.

Caret peut gérer de nombreux modèles différents, y compris les 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

Notez que la bibliothèque doMC () n'est disponible que sur mac et linux, elle doit être exécutée à partir de la ligne de commande, pas à partir d'une interface graphique, et elle casse tous les modèles de RWeka. Il est également facile d'utiliser des clusters MPI ou SNOW comme backend parallèle, qui ne présentent pas ces problèmes.

Zach
la source
Merci Zach. Je pense que scikits a également un moyen d'exécuter la validation croisée en parallèle, ce que je prévois de faire. À l'exception de cela, d'autres suggestions sur l'accélération? Merci.
tomas
@danjeharry: la validation croisée parallèle est vraiment le fruit bas ici, et je vous suggère fortement d'explorer cela en premier. Au-delà de cela, je ne sais pas grand-chose sur l'accélération des SVM en particulier. Si vous pouvez trouver un algorithme SVM parallèle, cela pourrait aussi être une bonne idée. Combien de lignes / colonnes l'ensemble de données que vous utilisez pour vous entraîner?
Zach
Merci Zach je vais me pencher sur le cv parallèle. Je fais environ 650 attributs et 5000 exemples.
tomas
4

Je me rends compte que c'est une question assez ancienne, mais il est également possible (selon la taille de votre ensemble de données, il peut être plus ou moins efficace) d'utiliser des approximations à faible dimension de la carte des caractéristiques du noyau, puis de l'utiliser dans un SVM linéaire. Voir http://scikit-learn.org/stable/modules/kernel_approximation.html

Matthew Saltz
la source
2

Jetez un œil au module multiprocessing de Python . Il facilite la parallélisation des choses et est parfait pour la validation croisée.

bayerj
la source
2

R a un excellent package svm accéléré par GPU rpusvm , il faut environ 20 secondes pour s'entraîner sur des échantillons de 20K * 100 dimensions, et j'ai trouvé que le CPU n'est jamais surchargé par lui, donc il utilise le GPU efficacement. Cependant, il nécessite un GPU NVIDIA.

Leo
la source
1

Alerte: il s'agit d'une prise sans vergogne.

Considérez DynaML comme une bibliothèque ML basée sur Scala sur laquelle je travaille. J'ai implémenté LS-SVM basé sur le noyau (Least Squares Support Vector Machines) ainsi que le réglage automatisé du noyau, en utilisant la recherche de grille ou le recuit simulé couplé.

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

mandar2812
la source