23

私のハイパーパラメータが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_ )
4

2 に答える 2

19

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

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

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

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

于 2014-10-13T18:30:16.450 に答える
9

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

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」カーネルを使用すると各次数を探すのに時間がかかるため、ここでグリッド検索の方法を変更する必要があります。もう1つのポイントは、2つの多度を使用すると、データがオーバーフィットすることです。ここでは (1, 2, 3, 4, 5) のようなものを使用します

「poly」カーネルでのみ使用されるため、coef0 についても同じコメント

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

于 2014-10-13T12:06:10.440 に答える