web-dev-qa-db-fra.com

Comment estimer la progression d'un GridSearchCV à partir d'une sortie détaillée dans Scikit-Learn?

En ce moment, je lance une recherche de grille assez agressive. J'ai n=135 samples et je cours 23 folds à l'aide d'une liste de test/train de validation croisée personnalisée. J'ai mon verbose=2.

Voici ce que j'ai couru:

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)

J'ai jeté un œil à la sortie détaillée dans stdout:

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

Sur cette base, il semble qu'il y ait 5842368 permutations de paires de validation croisée en utilisant mes paramètres de grille.

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

Il semble qu'il y ait environ 7 millions de validations croisées qui ont été faites jusqu'à présent, mais c'est plus que le 5842368 ajustement total ...

7047332/5842368 = 1.2062458236

Puis quand je regarde le fichier 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

Mon objectif:

Comment puis-je connaître la progression de ma recherche de grille par rapport au temps total que cela peut prendre?

Ce qui m'embrouille:

Quelle est la relation entre [CV] lignes dans stdout, nombre total d'ajustements dans stdout et tâches dans stderr?

11
O.rka

Les mathématiques sont simples, mais un peu trompeuses à première vue:

  1. Lorsque chaque tâche est lancée, le mécanisme de journalisation génère une ligne "[CV] ..." vers stdout notant starting d'exécution et après la tâche ends - une autre ligne avec l'ajout du temps passé pour une tâche particulière (à la fin de la ligne).

  2. De plus, avec certains intervalles de temps, le mécanisme de journalisation écrit une barre de progression dans stderr (ou si vous définissez verbose sur> 50 à stdout) indiquant un nombre de tâches terminées sur tâches totales (ajustements) et temps total passé actuellement, comme celui-ci:

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

Pour votre cas, vous avez 5842368 ajustements totaux, c'est-à-dire tâches.

Vous avez compté 7047332 de '[CV] ...' qui est around 7047332/2 = 3523666 les tâches terminées et la barre de progression indiquent exactly le nombre de tâches terminées - 3523550 (environ - car certaines tâches peuvent démarrer mais ne pas se terminer au moment du comptage).

5
vladkha