2014-10-13 4 views
10

Ich laufe auf das Problem, dass die Hyperparameter meines svm.SVC() zu breit sind, so dass die GridSearchCV() nie abgeschlossen wird! Eine Idee ist es stattdessen RandomizedSearchCV() zu verwenden. Aber wiederum ist mein Datensatz relativ groß, so dass 500 Iterationen etwa 1 Stunde dauern!Was ist ein guter Wertebereich für die svm.SVC() - Hyperparameter, die über GridSearchCV() erkundet werden sollen?

Meine Frage ist, was ist eine gute Einrichtung (in Bezug auf den Bereich der Werte für jeden Hyperparameter) in GridSearchCV (oder RandomizedSearchCV), um die Verschwendung von Ressourcen zu stoppen?

Mit anderen Worten, wie zu entscheiden, ob z. C Werte über 100 Sinn machen und/oder Schritt 1 ist weder groß noch klein? Jede Hilfe wird sehr geschätzt. Dies ist das Set-up ist derzeit mit:

parameters = { 
    'C':   np.arange(1, 100+1, 1).tolist(), 
    'kernel':  ['linear', 'rbf'],     # precomputed,'poly', 'sigmoid' 
    'degree':  np.arange(0, 100+0, 1).tolist(), 
    'gamma':  np.arange(0.0, 10.0+0.0, 0.1).tolist(), 
    'coef0':  np.arange(0.0, 10.0+0.0, 0.1).tolist(), 
    'shrinking': [True], 
    'probability': [False], 
    'tol':   np.arange(0.001, 0.01+0.001, 0.001).tolist(), 
    'cache_size': [2000], 
    'class_weight': [None], 
    'verbose':  [False], 
    'max_iter':  [-1], 
    'random_state': [None], 
    } 

model = grid_search.RandomizedSearchCV(n_iter    = 500, 
             estimator   = svm.SVC(), 
             param_distributions = parameters, 
             n_jobs    = 4, 
             iid     = True, 
             refit    = True, 
             cv     = 5, 
             verbose    = 1, 
             pre_dispatch  = '2*n_jobs' 
             )   # scoring = 'accuracy' 
model.fit(train_X, train_Y) 
print(model.best_estimator_) 
print(model.best_score_) 
print(model.best_params_) 

Antwort

4

für Hyper suchen, ist es immer besser zu verstehen, was jeder von ihnen tut ...

C : float, optional (default=1.0) 
    Penalty parameter C of the error term. 

Sie sollten versuchen, es zu ändern in der Größenordnung (0, 0,1, 1, 10, 100) und vielleicht reduzieren Sie dann Ihre Suche zwischen Magnitude, aber ich denke nicht, dass es so viel Ihr Modell verbessern wird.

degree : int, optional (default=3) 
    Degree of the polynomial kernel function (‘poly’). Ignored by all other kernels. 

Hier sollten Sie die Art und Weise ändern Sie Ihre Rastersuche tun, weil, wie die Dokumentation schlägt vor, den Grad wird nur für Polynom-Kernel verwendet, so dass Sie Zeit mit der Suche für jeden Grad verschwenden, wenn die ‚RBF‘ Kernel. Anderer Punkt ist, dass die Verwendung von zwei viele Grad nur Ihre Daten überfrachten wird. Hier verwenden Sie so etwas wie (1, 2, 3, 4, 5)

gleiche Bemerkung für coef0, weil es nur mit 'Poly' kernel

tol : float, optional (default=1e-3) 
    Tolerance for stopping criterion. 

Ich würde nicht verwendet wird, berühren, dass Ihr Angebot an Wert macht keinen Sinn.

Ich bin nicht so vertraut mit dem Gamma-Parameter.

So diese Darstellung anstelle von Ihnen (http://scikit-learn.org/stable/modules/grid_search.html#exhaustive-grid-search):

param_grid = [ 
{'C': [1, 10, 100, 1000], 'kernel': ['linear']}, 
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']}, 
] 

Und versuchen zu verstehen, was jedes dieser Parameter bedeuten:

http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf

http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

9

Welche Kernel funktioniert Das hängt am meisten von Ihren Daten ab. Wie viele Muster und Dimensionen haben Sie und welche Daten haben Sie? Damit die Bereiche vergleichbar sind, müssen Sie Ihre Daten normalisieren. Häufig ist StandardScaler, das keine Mittelwert- und Einheitsvarianz darstellt, eine gute Idee. Wenn Ihre Daten nicht negativ sind, können Sie MinMaxScaler versuchen.

Für kernel="gamma", ich in der Regel

{'C': np.logspace(-3, 2, 6), 'gamma': np.logspace(-3, 2, 6)} 

, die auf nichts basiert, sondern hat mir gute Dienste in den letzten paar Jahren. Ich rate dringend von nicht-logarithmischen Rastern ab, und noch mehr, wenn es um randomisierte Suche mit diskreten Parametern geht. Einer der Hauptvorteile der randomisierten Suche ist, dass Sie kontinuierliche Parameter mit kontinuierlichen Verteilungen [see the docs] suchen können.

+0

schlagen Sie hier vor, dass es unklug ist, kontinuierliche und diskrete Parameter in einer zufälligen Suche zu mischen? Warum ist das so und wie suchen Sie normalerweise nach Parametern, wenn sie für einen einzelnen Algorithmus gemischt sind? –

+1

Das war nicht was ich meinte. Ich rate davon ab, Listen für Parameter zu verwenden, die tatsächlich fortlaufend sind, siehe das Papier: https://encrypted.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CB4QFjAA&url=http% 3A% 2F% 2Fwww.jmlr.org% 2Fpapers% 2FVolume13% 2Fbergstra12a% 2Fbergstra12a.pdf & ei = -bpkVf839bWxBJ_Lg4gJ & usg = AFQjCNFKAQbDd5l0Q7WH36ejee4ahKlZQg & sig2 = ftE5PnFHyIvTKvIGGTS4xw & bvm = bv.93990622, d.cWc Mischen kontinuierlich und diskret ist in Ordnung. –

+0

Sie können auch den mittleren Abschnitt meines Vortrags hier einsehen: https://www.youtube.com/watch?v=0wUF_Ov8b0A –

Verwandte Themen