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?
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)!
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!
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 ):