私の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_ )
どのカーネルが最適に機能するかは、データに大きく依存します。サンプルと次元の数、およびどのような種類のデータがありますか?範囲を比較できるようにするには、データを正規化する必要があります。多くの場合、平均と単位の分散がゼロであるStandardScalerをお勧めします。データが負でない場合は、MinMaxScalerを試してみてください。
ために kernel="gamma"
、私は通常、
{'C': np.logspace(-3, 2, 6), 'gamma': np.logspace(-3, 2, 6)}
これは、過去2年間、私に役立っただけのものです。私は非対数グリッドに対して強くアドバイスしますが、離散パラメーターを使用したランダム化検索に対してはなおさらです。ランダム検索の主な利点の1つは、連続分布を使用して連続パラメーターを実際に検索できることです [ドキュメントを参照] 。
ハイパーパラメータを検索するには、それぞれが何をしているかを理解することが常に良いです...
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