目前我正在运行一个相当激进的网格搜索。我有n=135个样本
,并且使用自定义的交叉验证训练/测试列表运行23个折叠
。我的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.o8475533Fitting 23 folds for each of 254016 candidates, totalling 5842368 fits
根据这个输出,看起来使用我的网格参数有5842368
种交叉验证组合。
$ grep -c "[CV]" gridsearch.o84755337047332
看起来到目前为止已经完成了大约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
我的目标:
如何知道我的网格搜索相对于总时间的进度?
我感到困惑的地方:
stdout
中的[CV]
行、stdout
中的总拟合次数和stderr
中的任务之间有什么关系?
回答:
数学很简单,但乍一看有点误导:
-
当每个任务开始时,日志机制会在
stdout
中生成一行'[CV] …’,指出执行的开始
,任务结束
后,另一行会加上该任务所花费的时间(在行的末尾)。 -
此外,日志机制会在一定时间间隔内向
stderr
(或者如果你将verbose
设置为>50,则向stdout
)写入进度条,指示已完成的任务数量与总任务(拟合)数量以及当前总共花费的时间,例如:[Parallel(n_jobs=32)]: Done 2724 tasks | elapsed: 11.6s
在你的情况下,总共有5842368
次拟合,即任务。
你统计了7047332
个'[CV] …’,这大约是7047332/2 = 3523666
个已完成的任务,而进度条显示确切
完成了多少任务 – 3523550(大约 – 因为有些任务可能已经开始,但尚未结束在统计时)。