web-dev-qa-db-ja.com

GridSearchCV()を介して探索されるsvm.SVC()ハイパーパラメーターの適切な値の範囲は何ですか?

私のsvm.SVC()のハイパーパラメータが大きすぎてGridSearchCV()が完了しないという問題に遭遇しています! 1つのアイデアは、代わりにRandomizedSearchCV()を使用することです。しかし、繰り返しになりますが、私のデータセットは比較的大きく、500回の反復には約1時間かかります。

私の質問は、リソースの浪費を停止するために、GridSearchCV(またはRandomizedSearchCV)の(各ハイパーパラメータの値の範囲に関して)良い設定とは何ですか?

つまり、たとえば、 C 100を超える値は理にかなっているか、1のステップは小さくも小さくも大きくありませんか?どんな助けでも大歓迎です。これは現在使用しているセットアップです。

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_ )
17
user706838

どのカーネルが最適に機能するかは、データに大きく依存します。サンプルと次元の数、およびどのような種類のデータがありますか?範囲を比較できるようにするには、データを正規化する必要があります。多くの場合、平均と単位の分散がゼロであるStandardScalerをお勧めします。データが負でない場合は、MinMaxScalerを試してみてください。

ために kernel="gamma"、私は通常、

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

これは、過去2年間、私に役立っただけのものです。私は非対数グリッドに対して強くアドバイスしますが、離散パラメーターを使用したランダム化検索に対してはなおさらです。ランダム検索の主な利点の1つは、連続分布を使用して連続パラメーターを実際に検索できることです [ドキュメントを参照]

14
Andreas Mueller

ハイパーパラメータを検索するには、それぞれが何をしているかを理解することが常に良いです...

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

等級(0、0.1、1、10、100)で変更してみて、等級間の検索を減らす必要があるかもしれませんが、モデルがそれほど改善されるとは思いません。

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

ドキュメントが示唆しているように、ここではグリッド検索の方法を変更する必要があります。次数は多項式カーネルにのみ使用されるため、 'rbf'カーネルを使用するときに各次数を探すのに時間を浪費します。他のポイントは、2つの多くの学位を使用すると、データに適合しすぎることです。ここでは(1、2、3、4、5)のようなものを使用します

Coef0についても同じ注意です。'poly 'カーネルでのみ使用されるためです。

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

私はそれに触れません、あなたの価値の範囲は実際には何の意味もありません。

ガンマパラメータについてはあまり詳しくありません。

あなたの代わりにこの表現を使用してください( 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']},
]

そして、これらの各パラメータの意味を理解してみてください。

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

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

5
ThiS