Implémentation SVM la plus rapide Utilisable en Python

Je construis des modèles prédictifs en Python et j'utilise l'implémentation SVM de scikits learn. Il a été vraiment génial, facile à utiliser, et relativement rapide.

Malheureusement, je commence à être contraint par mon runtime. J'exécute un SVM rbf sur un ensemble de données complet d'environ 4-5000 avec 650 fonctionnalités. Chaque course prend environ une minute. Mais avec une validation croisée de 5 fois + recherche de grille ( en utilisant une recherche grossière à fine), cela devient un peu irréalisable pour ma tâche. Donc, généralement, faire les gens ont des recommandations en termes d'implémentation SVM la plus rapide qui peut être utilisée en Python? Ça, ou des moyens d'accélérer ma modélisation?

J'ai entendu parler de L'implémentation GPU de LIBSVM, qui semble pouvoir fonctionner. Je ne connais aucune autre implémentation SVM GPU utilisable en Python, mais elle serait certainement ouverte aux autres. En outre, l'utilisation du GPU augmente-t-elle considérablement le temps d'exécution?

J'ai aussi entendu dire qu'il existe des moyens d'approximer le SVM rbf en utilisant un SVM linéaire + carte de fonction dans scikits. Pas sûr de ce que les gens pensent à propos de cette approche. Encore une fois, quiconque utilise cette approche, est-ce une augmentation significative du temps d'exécution?

Toutes les idées pour augmenter la vitesse du programme sont les bienvenues.

32
demandé sur Peter Mortensen 2012-02-15 22:46:13

9 réponses

L'implémentation SVM du noyau la plus évolutive que je connaisse est LaSVM . Il est écrit en C donc wrap-mesure en Python si vous connaissez Cython, ctypes ou cffi. Vous pouvez également l'utiliser à partir de la ligne de commande. Vous pouvez utiliser les utilitaires de sklearn.datasets pour charger les données de conversion d'un format NumPy ou CSR dans des fichiers au format svmlight que LaSVM peut utiliser comme jeu de formation / test.

27
répondu ogrisel 2016-04-19 10:04:59

Vous pouvez également exécuter la recherche de grille Sur 1000 échantillons aléatoires au lieu de l'ensemble de données complet:

>>> 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)

Il est très probable que les paramètres optimaux pour 5000 échantillons seront très proches les paramètres optimaux pour 1000 échantillons. C'est donc un bon moyen de commencer votre recherche de grille grossière.

n_jobs=-1 permet d'utiliser tous vos processeurs pour exécuter les ajustements CV individuels en parallèle. Il utilise mulitprocessing donc le Gil python N'est pas un problème.

22
répondu ogrisel 2012-02-15 20:29:17

Tout d'abord, selon le benchmark de scikit-learn (ici), scikit-learn est déjà l'un des paquets SVM les plus rapides sinon les plus rapides. Par conséquent, vous pourriez envisager d'autres moyens d'accélérer la formation.

Comme suggéré par bavaza, vous pouvez essayer de multi-thread le processus d'entraînement. Si vous utilisez la classe Gridsearchcv de Scikit-learn, vous pouvez facilement définir l'argument n_jobs pour être plus grand que la valeur par défaut de 1 pour effectuer l'entraînement en parallèle au détriment de l'utilisation plus de mémoire. Vous pouvez trouver son la documentation ici Un exemple d'utilisation de la classe peuvent être trouvés ici

Sinon, vous pouvez jeter un oeil à Shogun Machine Learning Library ici

Shogun est conçu pour l'apprentissage machine à grande échelle avec des wrappers à de nombreux paquets svm courants et il est implémenté en C / C++ avec des liaisons pour python. Selon le benchmark de Scikit-learn ci-dessus, sa vitesse est comparable à scikit-learn. Sur d'autres tâches (autres que celui qu'ils ont démontré), il pourrait être plus rapide alors, il vaut la peine de donner un essai.

Enfin, vous pouvez essayer d'effectuer une réduction de dimension, par exemple en utilisant PCA ou PCA randomisé pour réduire la dimension de vos vecteurs d'entités. Qui permettrait d'accélérer le processus de formation. La documentation pour les classes respectives peut être trouvée dans ces 2 liens: PCA, PCA randomisé . Vous pouvez trouver des exemples sur la façon de les utiliser dans la section Exemples de Scikit-learn.

8
répondu lightalchemist 2016-04-06 15:40:52

Si vous êtes intéressé à utiliser uniquement le noyau RBF (ou tout autre noyau quadratique d'ailleurs), alors je suggère d'utiliser LIBSVM sur MATLAB ou Octave. Je forme un modèle de 7000 observations et 500 fonctionnalités en environ 6 secondes.

L'astuce consiste à utiliser des noyaux précalculés fournis par LIBSVM, et à utiliser une algèbre matricielle pour calculer le noyau en une seule étape au lieu de parcourir les données deux fois. Le noyau prend environ deux secondes à construire par opposition à beaucoup plus en utilisant LIBSVM propre noyau RBF. Je suppose que vous seriez capable de le faire en Python en utilisant NumPy , mais je ne suis pas sûr que je ne l'ai pas essayé.

4
répondu charlieBrown 2016-04-03 07:57:31

Sans trop comparer les bibliothèques SVM, je pense que la tâche que vous décrivez (validation croisée) peut bénéficier d'un véritable multi-threading (c'est-à-dire exécuter plusieurs processeurs en parallèle). Si vous utilisez CPython , il ne profite pas de votre machine (probablement) - multi-core, en raison de GIL .

Vous pouvez essayer d'autres implémentations de Python qui n'ont pas cette limitation. Voir PyPy ou IronPython si vous êtes prêt à aller .NET.

2
répondu bavaza 2016-04-03 07:58:30

Essayez svm_light!

C'est une implémentation C rapide et méchante des infâmes Thorsten Joachims à Cornell, avec de bonnes liaisons Python, et vous pouvez l'installer avec pip install pysvmlight.

1
répondu Michael Matthew Toomim 2016-04-03 07:59:22

Si votre problème est dans deux classes, cet habillage de la SVM basée sur CUDA avec scikit-learn est utile:

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

1
répondu niitsuma 2016-04-03 07:59:55

Je suggère de regarder L'implémentation de la descente de Gradient stochastique de Scikit-Learn. La perte de charnière par défaut est un SVM linéaire. J'ai trouvé ça hyper rapide.

0
répondu szxk 2014-11-12 23:32:59

J'envisagerais d'utiliser une forêt aléatoire pour réduire le nombre de fonctionnalités que vous entrez.

Il existe une option avec ExtraTreesRegressor et ExtraTreesClassifier pour générer des importances d'entités. Vous pouvez ensuite utiliser ces informations pour entrer un sous-ensemble de fonctionnalités dans votre SVM.

-1
répondu denson 2016-04-03 08:01:22