2012-02-06 7 views
4

Je travaille avec scikit-learn sur la construction de modèles prédictifs avec les SVM. J'ai un ensemble de données avec environ 5000 exemples et environ 700 fonctionnalités. Je suis 5 fois la validation croisée avec une recherche de grille 18 x 17 sur mon ensemble d'entraînement, puis en utilisant les paramètres optimaux pour mon ensemble de test. les passages prennent beaucoup plus de temps que prévu et j'ai remarqué ce qui suit:Implémentation SVM, les scikits apprennent à réduire le temps d'exécution, le plus rapide svm

1) Certaines itérations d'entraînement SVM semblent prendre seulement une minute, tandis que d'autres peuvent durer jusqu'à 15 minutes. Est-ce prévu avec des données et des paramètres différents (C et gamma, j'utilise le noyau rbf)?

2) J'essaie d'utiliser python 64 bits sur Windows pour profiter de la mémoire supplémentaire, mais tous mes processus python semblent atteindre 1 Go dans mon gestionnaire de tâches, je ne sais pas si cela a quelque chose à voir avec le temps d'exécution.

3) J'utilisais 32 bits avant et fonctionnant sur à peu près le même jeu de données, et je me souviens (même si je n'ai pas économisé les résultats), il était un peu plus rapide. J'ai utilisé une version tierce de scikit-learn pour les fenêtres 64 bits, donc je ne sais pas s'il vaut mieux essayer ça sur python 32 bits? (source http://www.lfd.uci.edu/~gohlke/pythonlibs/)

Toutes les suggestions sur la façon dont je peux réduire le temps d'exécution seraient grandement appréciées. Je pense que la réduction de l'espace de recherche de ma recherche de grille sera utile, mais comme je ne suis pas sûr de la gamme de paramètres optimaux, j'aimerais la garder aussi grande que possible. S'il y a aussi des implémentations SVM plus rapides, faites-le moi savoir, et je pourrais essayer.

Addendum: Je suis retourné et essayé à nouveau la version 32 bits. C'est beaucoup plus rapide pour une raison quelconque. Il a fallu environ 3 heures pour arriver à l'endroit où la version 64 bits est arrivé en 16 heures. Pourquoi y aurait-il une telle différence?

Répondre

6

1) Ceci est attendu: un petit gamma et une petite régularisation sélectionneront plus de vecteurs de support, d'où le modèle sera plus complexe et plus long à ajuster.

2) Il y a un argument cache_size qui sera transmis à la bibliothèque libsvm sous-jacente. Toutefois, en fonction de vos données, libsvm peut ou non utiliser tout le cache disponible.

3) Aucune idée. Si vous exécutez des expériences plus ponctuelles sur les deux plates-formes, veuillez rapporter vos résultats sur les listes de diffusion du projet. Cela pourrait mériter une enquête plus approfondie.

Vérifiez d'abord que vous avez normalisé vos fonctions (par exemple, supprimez la fonction de moyenne et d'échelle par des variances si vos données sont un tableau numérique dense). Pour les données éparses, il suffit de mettre à l'échelle les fonctions (ou d'utiliser une transformation TF-IDF pour les données textuelles par exemple). Voir le preprocessing section de la doc.

Ensuite, vous devriez commencer par une grille grossière (avec de grandes étapes logarithmiques), disons une grille 3x3, puis vous concentrer sur les zones intéressantes en réexécutant une grille 3x3 sur cette zone. En général, la grille des paramètres SVM Cx gamma est quite smooth.

+0

Merci pour les réponses ogrisel. Ils ont beaucoup de sens. Je ne suis pas sûr sur le problème 32 bits vs 64 bits non plus, mais si j'ai une chance, je vais essayer de faire quelques courses chronométrées. Mes données sont prétraitées (normalisées à 0-1) et j'ai augmenté le cache_size à 4000 pour les scikits (probablement overkill). Je vais certainement essayer de modifier mon code pour qu'il passe d'une grille grossière à une zone plus petite, ce qui contribuera certainement à accélérer mon code. Merci encore. – tomas

+0

@Grisel, que diriez-vous d'un chercheur de grille grossier-puis-fin général? – denis

+0

Je suppose une question supplémentaire, et si vous faites une validation croisée + recherche de grille, comment pouvez-vous utiliser une recherche de grille grossière puis fine? Lorsque vous essayez de faire la moyenne ou quoi que ce soit sur plusieurs passages de validation croisée, l'espace de recherche ne correspond pas lorsque vous utilisez grossier puis bien. Je suis sûr qu'il y a un bon moyen que je ne connais pas/manque. – tomas

3

SGD est très rapide, mais 1) linéaire, et non RBF, 2) paramètres alpha eta0 ... que je ne sais pas comment faire varier: plus à l'expert, O. Grisel.

32 vs 64 bits python (? Quel matériel, quelle version py), Je ne sais pas, mais cela pourrait être utile d'une question générale sur le SO - il doit y avoir des suites de référence. Pouvez-vous voir l'utilisation du processeur> 90%, compter les garbage collection?

+0

Il est possible d'approcher un noyau RBF non linéaire de façon scalable en utilisant [fonction explicite maps] (http://scikit-learn.org/dev/auto_examples/plot_kernel_approximation.html#example-plot-kernel-approximation-py) et un classificateur linéaire tel que SGDClassifier. – ogrisel

+0

Oh, c'est vrai. Des commentaires sur comment faire varier alpha et eta0? – denis

+0

Je n'essaie jamais de régler 'eta0' (peut-être devrais-je le faire). Pour 'alpha', j'utilise' GridSearchCV' comme je le ferais pour 'C' dans' LinearSVC'. – ogrisel

4

Si vous pouvez vous permettre cela, envisager d'utiliser LinearSVC: SVCs basée libsvm-ont la complexité de la formation entre O(n_features * n_samples^2) et O(n_features * n_samples^3), tandis que LinearSVC (basé sur liblinear) a O(n_features*n_samples) la complexité de la formation et O(n_features) complexité de test.

+0

En pratique 'SGDClassifier' est encore plus rapide pour l'ajustement de modèles SVM linéaires dans scikit-learn. Et nous n'avons pas encore implémenté la moyenne :) – ogrisel

+0

Bon à savoir, merci! –