web-dev-qa-db-ja.com

GridsearchCVを実行するより速い方法はありますか

SklearnでSVCのいくつかのパラメーターを最適化していますが、ここでの最大の問題は、他のパラメーター範囲を試す前に30分待たなければならないことです。さらに悪いことに、同じ範囲内でcとgammaの値を増やしたいのですが(より滑らかな表面プロットを作成できるように)、時間がかかることはわかっています...今日実行したときcache_sizeを200から600に変更して(実際には何をするのかわからない)、違いが生じるかどうかを確認しました。時間は約1分短縮されました。

これは私が助けることができるものですか?それとも私は非常に長い時間を処理する必要がありますか?

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)

戻り値:

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)
11
bidby

いくつかのこと:

  1. 10倍のCVはやり過ぎであり、パラメーターグループごとに10個のモデルを適合させることになります。 5倍または3倍のCVに切り替えると、瞬時に2〜3倍のスピードアップが得られます(つまり、cv=3GridSearchCV呼び出しで)パフォーマンスの見積もりに意味のある違いはありません。
  2. 各ラウンドでより少ないパラメータオプションを試してください。 9x9の組み合わせでは、実行ごとに81の異なる組み合わせを試しています。通常、スケールの一方の端またはもう一方の端でパフォーマンスが向上するため、3〜4つのオプションの粗いグリッドから始めて、データにとってより興味深い領域を特定し始めると、さらに細かくなります。 3x3オプションは、現在行っていることに対して9倍のスピードアップを意味します。
  3. njobs呼び出しでGridSearchCVを2+に設定して、一度に複数のモデルを実行することで、ささいなスピードアップを得ることができます。データのサイズによっては、データを大きくしすぎることができない場合があり、実行しているコアの数を超えてデータを増やしても改善は見られませんが、おそらくその方法で少し時間を短縮できます。 。
12
Randy

また、SVC推定器の内部でprobability = Falseを設定して、高価なPlattのキャリブレーションを内部で適用しないようにすることもできます。 (predict_probaを実行する機能が重要な場合は、refit = FalseでGridSearchCvを実行し、テストセットでモデルの品質に関して最良のパラメーターセットを選択した後、trainigセット全体でprobability = Trueで最良の推定量を再トレーニングします。)

もう1つのステップは、GridSearchCVの代わりにRandomizedSearchCvを使用することです。これにより、ほぼ同時に(n_itersパラメーターで制御されるように)より良いモデル品質に到達できます。

そして、すでに述べたように、n_jobs = -1を使用します

4