Skip to content

分支树地图:从 1x1 到 m×n

Abstract

当前你已经打通了一个最小例子:

  • 1 个模型:DLinear
  • 1 个 strategy:rolling_forecast
  • 1 个 adapter:transformer_adapter
  • 1 个数据文件:ETTh1.csv

这一篇只做一件事:

把这个 1x1 主线扩成 m×n 分支树,明确这个仓库是在哪些层分叉的。

1. 当前最小主线在总树里的位置

当前最小主线可以压成:

text
ETTh1.csv
-> DLinear
-> transformer_adapter
-> rolling_forecast

它只是整个仓库分支树中的一条具体路径。

2. 总分支树

3. 三个最重要的分叉层

当前最重要的分叉层只有三个:

  1. strategy 分叉
  2. model 分叉
  3. adapter 分叉

这三个分叉不是在同一个函数里发生的。

4. strategy 分叉发生在哪

strategy 分叉发生在:

python
eval_model(model_factory, series_list, evaluation_config)

更具体地说,是这里:

python
strategy_class = STRATEGY.get(evaluation_config["strategy_args"]["strategy_name"])

注册表在:

当前仓库里至少有:

  • rolling_forecast
  • fixed_forecast

4.1 strategy 分支树

4.2 两条 strategy 的接口差异

共同点:

  • 都继承 ForecastingStrategy
  • 都通过:
    • strategy.execute(series_name, model_factory)
    • 进入各自的 _execute(...)

不同点:

  • rolling_forecast

    • fit 一次
    • 测试区间做 rolling 窗口预测
    • 关键主体:_eval_batch(...)
  • fixed_forecast

    • fit 一次
    • 直接对固定 horizon 做一次 forecast
    • 主体更短,不需要 rolling index 和 batch maker

4.3 当前主线落在哪

当前主线走的是:

text
strategy_name = rolling_forecast
-> RollingForecast
-> _eval_batch(...)

5. model 分叉发生在哪

model 分叉发生在:

python
get_models(model_config)

更具体地说,是这里:

python
model_info = get_model_info(model_config)

对应文件:

5.1 model 分支树

5.2 当前仓库里 time_series_library 这一支

对应导出表在:

这里能看到一大批模型:

  • DLinear
  • Informer
  • PatchTST
  • Autoformer
  • FEDformer
  • TimesNet
  • Transformer
  • ...

5.3 当前主线落在哪

当前主线走的是:

text
model_name = time_series_library.DLinear
-> get_model_info(...)
-> DLinear

6. adapter 分叉发生在哪

adapter 分叉也发生在:

python
get_model_info(model_config)

更具体地说,是这里:

python
adapter_name = model_config.get("adapter")
if adapter_name is not None:
    model_info = _import_attribute(ADAPTER[adapter_name])(model_info)

adapter 注册表在:

6.1 adapter 分支树

6.2 这几条 adapter 的语义差异

transformer_adapter

  • 对接 time_series_library 这批模型
  • 当前你已经打通:
    • TransformerAdapter._process(...)
    • DLinear.forward(...)

darts_*_adapter

  • 对接 Darts 体系模型
  • 更接近:
    • forecast_fit(...)
    • forecast(...)
    • TimeSeries.from_dataframe(...)

6.3 当前主线落在哪

当前主线走的是:

text
adapter = transformer_adapter
-> TransformerAdapter

7. 哪些分叉已经有图谱,哪些还没有

已经有详细主线图谱

  • rolling_forecast
  • DLinear
  • transformer_adapter

也就是你当前走通的这一条:

text
DLinear + transformer_adapter + rolling_forecast

还没有细致图谱,但已经能定位

  • fixed_forecast
  • Informer
  • PatchTST
  • darts_*_adapter

也就是说:

现在你缺的不是“它们在哪分叉”,而是“每条分叉内部怎么继续展开”。

8. 之后最合理的扩展顺序

如果按性价比排序,最值得的扩展顺序是:

8.1 先扩模型分支

从:

  • DLinear

扩到:

  • Informer

原因:

  • strategy 和 adapter 都先保持不变
  • 只换模型
  • 这样你能看清:
    • 哪些是框架固定部分
    • 哪些是模型内部变化部分

最推荐的新路径是:

text
ETTh1.csv
-> Informer
-> transformer_adapter
-> rolling_forecast

8.2 再扩 strategy 分支

从:

  • rolling_forecast

扩到:

  • fixed_forecast

原因:

  • 模型先保持 DLinear
  • adapter 也保持 transformer_adapter
  • 这样只换 strategy

最推荐的新路径是:

text
ETTh1.csv
-> DLinear
-> transformer_adapter
-> fixed_forecast

8.3 最后再扩 adapter 分支

从:

  • transformer_adapter

扩到:

  • darts_*_adapter

原因:

  • 这一层变化最大
  • 需要同时理解不同模型生态的接口习惯

9. 当前最应该继续画哪棵子树

现在最值得继续补的,不是新的总图,而是下面这棵:

因为:

  • 你已经有了 DLinear 的完整坐标
  • 只差一个第二模型,来建立“框架固定 / 模型变化”的对照能力

10. 最后压成一句

当前这套文档已经把 1x1 最小主线打通;下一步最合理的扩展不是继续深挖局部,而是沿着“模型 / strategy / adapter”三棵分支树,逐步把 1x1 扩成 m×n

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