2016-02-26 1 views
2

J'optimise certains paramètres pour un SVC dans sklearn, et le plus gros problème ici est d'attendre 30 minutes avant d'essayer d'autres plages de paramètres. Pire encore, j'aimerais essayer plus de valeurs pour c et gamma dans la même gamme (donc je peux créer un tracé de surface plus lisse) mais je sais que ça prendra juste plus de temps ... Quand je l'ai couru aujourd'hui J'ai changé le cache_size de 200 à 600 (sans vraiment savoir ce qu'il fait) pour voir si cela a fait une différence. Le temps a diminué d'environ une minute.Existe-t-il un moyen plus rapide d'exécuter GridsearchCV

Est-ce que c'est quelque chose que je peux vous aider? Ou est-ce que je vais devoir faire face à très longtemps?

clf = svm.SVC(kernel="rbf" , probability = True, cache_size = 600) 

gamma_range = [1e-7,1e-6,1e-5,1e-4,1e-3,1e-2,1e-1,1e0,1e1] 
c_range = [1e-3,1e-2,1e-1,1e0,1e1,1e2,1e3,1e4,1e5] 
param_grid = dict(gamma = gamma_range, C = c_range) 

grid = GridSearchCV(clf, param_grid, cv= 10, scoring="accuracy") 
%time grid.fit(X_norm, y) 

retours:

Wall time: 32min 59s 

GridSearchCV(cv=10, error_score='raise', 
    estimator=SVC(C=1.0, cache_size=600, class_weight=None, coef0=0.0, degree=3, gamma=0.0, 
kernel='rbf', max_iter=-1, probability=True, random_state=None, 
shrinking=True, tol=0.001, verbose=False), 
    fit_params={}, iid=True, loss_func=None, n_jobs=1, 
    param_grid={'C': [0.001, 0.01, 0.1, 1.0, 10.0, 100.0, 1000.0, 10000.0, 100000.0], 'gamma': [1e-07, 1e-06, 1e-05, 0.0001, 0.001, 0.01, 0.1, 1.0, 10.0]}, 
    pre_dispatch='2*n_jobs', refit=True, score_func=None, 
    scoring='accuracy', verbose=0) 

Répondre

6

Quelques choses:

  1. 10-fois CV est surpuissant et vous fait tenir 10 modèles pour chaque groupe de paramètres. Vous pouvez obtenir une accélération instantanée 2-3x en passant à un CV de 5 ou 3 fois (c'est-à-dire, cv=3 dans l'appel GridSearchCV) sans aucune différence significative dans l'estimation des performances.
  2. Essayez moins d'options de paramètres à chaque tour. Avec les combinaisons 9x9, vous essayez 81 combinaisons différentes sur chaque course. Généralement, vous trouverez de meilleures performances à une extrémité de l'échelle ou l'autre, alors commencez par une grille grossière de 3 ou 4 options, puis affinez-vous lorsque vous commencez à identifier la zone la plus intéressante pour vos données. 3x3 options signifie une accélération de 9x par rapport à ce que vous faites maintenant.
  3. Vous pouvez obtenir une accélération triviale en réglant njobs à 2+ dans votre appel GridSearchCV afin que vous exécutiez plusieurs modèles à la fois. En fonction de la taille de vos données, vous ne pourrez peut-être pas l'augmenter trop, et vous ne verrez pas d'amélioration l'augmenter au-delà du nombre de cœurs que vous utilisez, mais vous pouvez probablement réduire un peu le temps .
+0

Réglage njobs -1 va créer 1 emploi par cœur automatiquement. Selon votre modèle, la mémoire peut alors devenir un problème, mais généralement pas! –

0

Vous pouvez également définir la probabilité = Faux à l'intérieur de l'estimateur SVC pour éviter d'appliquer l'étalonnage coûteux de Platt en interne. (Si la possibilité d'exécuter predict_proba est cruciale, exécutez GridSearchCv avec refit = False, et après avoir sélectionné le meilleur paramètre en termes de qualité du modèle sur l'ensemble de test, recalculez le meilleur estimateur avec probabilité = True sur tout l'ensemble.)

étape serait d'utiliser RandomizedSearchCv au lieu de GridSearchCV, ce qui vous permettrait d'atteindre une meilleure qualité de modèle à peu près en même temps (comme contrôlé par le paramètre n_iters).

Et, comme déjà mentionné, utilisez n_jobs = -1