web-dev-qa-db-ja.com

Scikit-Learnの詳細出力からGridSearchCVの進行状況を推定する方法は?

現在、かなり積極的なグリッド検索を実行しています。私が持っています n=135 samplesと実行中23 foldsカスタムの交差検証トレイン/テストリストを使用します。私はverbose=2

以下は私が実行したものです:

param_test = {"loss":["deviance"],
           'learning_rate':[0.01, 0.025, 0.05, 0.075, 0.1, 0.15, 0.2],
           "min_samples_split": np.linspace(0.1, 0.5, 12),
           "min_samples_leaf": np.linspace(0.1, 0.5, 12),
           "max_depth":[3,5,8],
          "max_features":["log2","sqrt"],
          "min_impurity_split":[5e-6, 1e-7, 5e-7],
          "criterion": ["friedman_mse",  "mae"],
           "subsample":[0.5, 0.618, 0.8, 0.85, 0.9, 0.95, 1.0],
          "n_estimators":[10]}

Mod_gsearch = GridSearchCV(estimator = GradientBoostingClassifier(),
                           param_grid = param_test, scoring="accuracy",n_jobs=32, iid=False, cv=cv_indices, verbose=2)

stdoutの詳細出力を確認しました。

$head gridsearch.o8475533
Fitting 23 folds for each of 254016 candidates, totalling 5842368 fits

これに基づいて、5842368グリッドのパラメーターを使用した交差検証ペアの順列。

$ grep -c  "[CV]" gridsearch.o8475533
7047332 

これまでに行われた約700万回の相互検証があるようですが、それは5842368はめあい合計...

7047332/5842368 = 1.2062458236

次に、stderrファイルを見ると、

$ cat ./gridsearch.e8475533
[Parallel(n_jobs=32)]: Done 132 tasks      | elapsed:    1.2s
[Parallel(n_jobs=32)]: Done 538 tasks      | elapsed:    2.8s
[Parallel(n_jobs=32)]: Done 1104 tasks      | elapsed:    4.8s
[Parallel(n_jobs=32)]: Done 1834 tasks      | elapsed:    7.9s
[Parallel(n_jobs=32)]: Done 2724 tasks      | elapsed:   11.6s
...
[Parallel(n_jobs=32)]: Done 3396203 tasks      | elapsed: 250.2min
[Parallel(n_jobs=32)]: Done 3420769 tasks      | elapsed: 276.5min
[Parallel(n_jobs=32)]: Done 3447309 tasks      | elapsed: 279.3min
[Parallel(n_jobs=32)]: Done 3484240 tasks      | elapsed: 282.3min
[Parallel(n_jobs=32)]: Done 3523550 tasks      | elapsed: 285.3min

私の目標:

グリッドサーチの進行状況を、それがかかる可能性がある合計時間に関してどのように知ることができますか?

私が混乱していること:

[CV]stdoutの行、stdoutのフィットの合計数、およびstderr?のタスク数

11
O.rka

数学は単純ですが、一見すると少し誤解を招きます。

  1. 各タスクが開始されると、ロギングメカニズムはstdoutに「[CV] ...」行を生成し、実行のstartingと、タスクの後にendsを追加-別の行を追加特定のタスクに費やされた時間(行末)。

  2. さらに、いくつかの時間間隔で、ロギングメカニズムはstderrにプログレスバーを書き込み(またはverboseを> 50からstdoutに設定した場合)、完了したタスクの数を示しますそのような、合計タスク(適合)と現在費やされた合計時間:

    [Parallel(n_jobs=32)]: Done 2724 tasks | elapsed: 11.6s

あなたのケースでは、あなたは5842368はめあい、つまりタスク。

カウントした7047332 of '[CV] ...'これはaround 7047332/2 = 3523666完了したタスクと進行状況バーに、完了したタスクの数exactlyが表示されます-3523550(およそ-一部のタスクは開始できたが、カウント時に終了しなかったため)。

5
vladkha