如何从Scikit Learn中的详细输出估计GridSearchCV的进度?

2024-04-18 22:24:01 发布

您现在位置:Python中文网/ 问答频道 /正文

现在我正在进行一次非常积极的网格搜索。我有一个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

我的目标:

我如何才能知道网格搜索的进度(相对于可能需要的总时间)?

我困惑的是:

stdout中的[CV]行、在stdout中的拟合总数与stderr中的任务之间的关系是什么?


Tags: test网格verboseparamparallelstdoutjobsmin
1条回答
网友
1楼 · 发布于 2024-04-18 22:24:01

数学很简单,但乍一看有点误导:

  1. 当每个任务启动时,日志记录机制会生成一个“[CV]…”行到stdout注意执行的starting和任务后的ends另一行,其中添加了特定任务的花费时间(在行的末尾)。

  2. 此外,对于某些时间间隔,日志记录机制会将进度条写入stderr(或者如果将verbose设置为>;50到stdout),指示总任务(fits)和当前总花费时间中已完成的任务数,例如:

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

对于您的情况,您有5842368完全适合,即任务。

您计算了“[CV]…”中的7047332,即around 7047332/2 = 3523666已完成的任务,进度条显示了exactly已完成的任务数-3523550(大约-因为有些任务可以开始,但在计算时不会结束)。

相关问题 更多 >