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
?
Les mathématiques sont simples, mais un peu trompeuses à première vue:
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).
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).