web-dev-qa-db-fra.com

Mise en oeuvre 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. C'était vraiment génial, facile à utiliser et relativement rapide.

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

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

J'ai également entendu dire qu'il est possible de se rapprocher de la SVM de rbf en utilisant une carte de fonctionnalités SVM + linéaire dans les scikits. Je ne sais pas ce que les gens pensent de cette approche. Encore une fois, si vous utilisez cette approche, s'agit-il d'une augmentation significative de la durée d'exécution?

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

33
tomas

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

28
ogrisel

Sinon, vous pouvez exécuter la recherche par grille sur 1 000 é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 5 000 échantillons seront très proches des paramètres optimaux pour 1 000 é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 adaptations de CV individuelles en parallèle. Il utilise le traitement multiple afin que le python GIL ne soit pas un problème.

22
ogrisel

Premièrement, selon le test de référence de scikit-learn ( here ), scikit-learn est déjà l’un des packages SVM les plus rapides, sinon les plus rapides. Par conséquent, vous voudrez peut-être envisager d’autres moyens d’accélérer la formation. 

Comme suggéré par bavaza, vous pouvez essayer de multi-threader le processus de formation. Si vous utilisez la classe GridSearchCV de Scikit-learn, vous pouvez facilement définir l'argument n_jobs sur une valeur supérieure à la valeur par défaut de 1 pour effectuer la formation en parallèle, au détriment de l'utilisation de plus de mémoire . Vous pouvez trouver sa documentation here Un exemple d'utilisation de la classe peut être trouvé here

Vous pouvez également consulter la bibliothèque d’apprentissage automatique Shogun ici

Shogun est conçu pour l'apprentissage automatique à grande échelle avec des wrappers de nombreux packages svm courants et est implémenté en C/C++ avec des liaisons pour python. Selon la référence ci-dessus de Scikit-learn, sa vitesse est comparable à celle de scikit-learn. Pour les autres tâches (autres que celles qu’ils ont démontrées), il se peut que cela soit plus rapide et que cela vaille la peine d’essayer.

Enfin, vous pouvez essayer de réduire les dimensions, par exemple. en utilisant PCA ou PCA randomisée pour réduire la dimension de vos vecteurs d'entités. Cela accélérerait le processus de formation. La documentation pour les classes respectives se trouve dans ces 2 liens: PCA , PCA randomisé . Vous trouverez des exemples d'utilisation à la section Exemples de Scikit-learn.

8
lightalchemist

Si vous ne souhaitez utiliser que le noyau RBF (ou tout autre noyau quadratique), je vous suggère d'utiliser LIBSVM sur MATLAB ou Octave . J'entraîne un modèle de 7 000 observations et 500 entités en environ 6 secondes.

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

4
charlieBrown

Sans vouloir trop comparer les bibliothèques SVM, je pense que la tâche que vous décrivez (validation croisée) peut tirer parti d’un véritable multithreading (c’est-à-dire exécuter plusieurs CPU en parallèle). Si vous utilisez CPython , il ne tire pas parti 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 souhaitez accéder à .NET.

2
bavaza

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

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

1
niitsuma

Essayez svm_light !

Il s’agit d’une implémentation C très rapide du très célèbre Thorsten Joachims at Cornell , avec de bonnes liaisons Python, que vous pouvez installer avec pip install pysvmlight.

1

Je suggère de regarder Scikit-Learn - Descente de gradient stochastique implementation La perte de charnière par défaut est un SVM linéaire. Je l'ai trouvé extrêmement rapide.

0
szxk