web-dev-qa-db-fra.com

scikit-learn SVM.SVC () est extrêmement lent

J'ai essayé d'utiliser le classificateur SVM pour former des données avec environ 100 000 échantillons, mais je l'ai trouvé extrêmement lent et même après deux heures, il n'y a pas eu de réponse. Lorsque l'ensemble de données contient environ 1 000 échantillons, je peux obtenir le résultat immédiatement. J'ai également essayé SGDClassifier et naïve bayes, ce qui est assez rapide et j'ai obtenu des résultats en quelques minutes. Pourriez-vous expliquer ce phénomène?

20
C. Gary

Remarques générales sur l'apprentissage SVM

La formation SVM avec des noyaux non linéaires, qui est par défaut dans le SVC de sklearn, est approximativement complexe: O(n_samples^2 * n_features)lien vers une question avec cette approximation donnée par l'un des développeurs de sklearn . Cela s'applique à l'algorithme SMO utilisé dans libsvm , qui est le core-solver dans sklearn pour ce type de problème.

Cela change beaucoup quand aucun noyau n'est utilisé et que l'on utilise sklearn.svm.LinearSVC (basé sur liblinear ) ou sklearn.linear_model.SGDClassifier .

Nous pouvons donc faire quelques calculs pour approximer la différence de temps entre les échantillons 1k et 100k:

1k = 1000^2 = 1.000.000 steps = Time X
100k = 100.000^2 = 10.000.000.000 steps = Time X * 10000 !!!

Ce n'est qu'une approximation et peut être encore pire ou moins pire (par exemple, définir la taille du cache; échanger la mémoire pour des gains de vitesse)!

Remarques spécifiques à Scikit-learn

La situation pourrait également être beaucoup plus complexe à cause de tout ce que Nice scikit-learn fait pour nous derrière les barreaux. Ce qui précède est valable pour le SVM classique à 2 classes. Si vous essayez par hasard d'apprendre des données multi-classes; scikit-learn utilisera automatiquement les approches OneVsRest ou OneVsAll pour ce faire (car l'algorithme SVM de base ne le prend pas en charge). Lisez les documents scikit-learns pour comprendre cette partie.

Le même avertissement s'applique à la génération de probabilités: les SVM ne produisent pas naturellement de probabilités pour les prédictions finales. Donc, pour utiliser ces (activés par paramètre) scikit-learn utilise une procédure de validation croisée lourde appelée Mise à l'échelle Platt qui prendra aussi beaucoup de temps!

Documentation Scikit-learn

Parce que sklearn possède l'un des meilleurs documents, il y a souvent une bonne partie de ces documents pour expliquer quelque chose comme ça ( lien ):

enter image description here

34
sascha