Skip to content

Level 5 _eval_batch 四段总览

Abstract

入口:

python
ForecastingStrategy.execute(...)
-> RollingForecast._execute(...)
-> RollingForecast._eval_batch(...)

这一层解释:

_eval_batch(...) 内部先按顺序怎么推进,再按逻辑分块怎样嵌套。

1. 上一层与当前层位置

上一层是:

当前层是:

  • Level 5:第一次同时使用“顺序图 + 抽象索引树 + 逻辑分块”。

当前层对应上一层中的具体位置是:

  • 4B-3 进入 _eval_batch(...)

1.5 这一层的关系类型说明

这一层的 5A / 5B / 5C / 5D 表示的是:

  • 同一个函数 _eval_batch(...) 的内部职责分块
  • 不是四个独立对象
  • 也不是外层壳和内层任务体的关系

所以这一层要这样读:

  1. 顺序图:
    • _eval_batch(...) 执行时先后发生什么
  2. 抽象索引树:
    • 为了理解这个函数,人脑把它拆成哪四块

这棵树是函数内部逻辑树,不是对象包含树

2. 当前层第一性

_eval_batch(...) 的第一性是:

在一条序列上,按 rolling forecast 协议,完成“切数据 -> 训练 -> 批量预测 -> 打分收尾”。

这已经不是一个单一动作,而是一个完整业务主体,所以必须同时从两个维度看:

  1. 顺序
    • 代码实际怎么往下执行
  2. 逻辑分块
    • _eval_batch(...) 内部有哪些职责块

3. 当前命令的最小例子

这一层以下文这组参数为具体例子:

  • series.shape = (17420, 7)
  • tv_ratio = 0.8
  • train_ratio_in_tv = 0.75
  • horizon = 24
  • stride = 24
  • num_rollings = 48
  • target_channel = null 或默认目标列集合

由此得到:

  • train_length = int(17420 * 0.8) = 13936
  • test_length = 17420 - 13936 = 3484
  • train_valid_data.shape = (13936, 7)
  • test_data.shape = (3484, 7)

4. 先看顺序图

这张图回答的是:

代码执行时,大致先后顺序是什么。

5. 再看抽象索引树

Note

这里的 5A / 5B / 5C / 5D 也是 _eval_batch(...) 函数内部的并列逻辑分块

它们表示的是:

  • 同一个函数内部
  • 可以按职责拆开的四段

它们不是:

  • 四个彼此独立的外层对象
  • 四个并列顶层模块

所以这一层的树,更像“函数内部逻辑分块树”,不是“外层对象关系树”。

这棵树回答的是:

为了理解 _eval_batch(...),人脑应该把它分成哪四块。

6. 四个逻辑分块的抽象意义

6.1 5A 配置与切数

抽象意义:

把“整条序列 + strategy 配置”转换成“后续训练和预测都能直接使用的数据块”。

6.2 5B 训练子块

抽象意义:

在 rolling 预测之前,先对模型完成一次 fit。

6.3 5C 预测子块

抽象意义:

用 rolling window 的方式,把测试区间变成若干预测请求,再批量送进模型。

6.4 5D 打分与收尾子块

抽象意义:

把模型预测结果和真实目标对齐,计算指标,并组装成统一结果格式。

7. 职责树

7.1 5A 配置与切数

负责生成:

  • train_valid_data
  • test_data
  • target_train_valid_data
  • target4batch
  • covariates_train
  • covariates4batch

7.2 5B 训练子块

负责生成:

  • 训练好的模型内部状态
  • eval_scaler
  • fit_time

7.3 5C 预测子块

负责生成:

  • index_list
  • batch_maker
  • all_predicts
  • total_inference_time

7.4 5D 打分与收尾子块

负责生成:

  • targets
  • all_test_results
  • single_series_results

8. 输入输出接口

8.1 本层入口接口

python
_eval_batch(series, meta_info, model, series_name)

输入:

  • series: pd.DataFrame
  • meta_info
  • model
  • series_name

8.2 关键配置变量

  • target_channel
  • stride
  • horizon
  • num_rollings
  • train_ratio_in_tv
  • tv_ratio

8.3 本层输出

  • single_series_results: List

9. 函数 / 文件关系图

10. 当前例子的具体落地

10.1 配置与切数

  • series.shape = (17420, 7)
  • train_valid_data.shape = (13936, 7)
  • test_data.shape = (3484, 7)

10.2 训练

  • fit_method = model.forecast_fit
  • target_train_valid_data 上 fit 一次

10.3 预测

  • index_list = _get_index(13936, 3484, 24, 24)
  • 再截断为前 48 个 rolling 位置

10.4 打分

  • 每个 rolling 窗口拿到一个 predicts
  • 与同位置 target 做指标计算
  • 最终对所有 rolling 窗口指标取平均

11. 下一层怎么分

如果继续 BFS 往下走,最自然的顺序是:

  1. 先细分 5B 训练子块
  2. 再细分 5C 预测子块
  3. 最后细分 5D 打分与收尾子块

也就是先进入:

python
fit_method(...)

再进入:

python
forecast_fit(...)

这一层已经继续细分成三篇下层文档:

12. 只留一句

Level 5 要同时掌握两件事:_eval_batch(...) 的执行顺序,以及它内部的四个逻辑分块。

*记录并在线阅读我的笔记*