尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

sktime 内嵌 EnbPI 预测区间算法源码解析:从 aws-fortuna 提取的分位数共形预测实现

sktime 内嵌 EnbPI 预测区间算法源码解析:从 aws-fortuna 提取的分位数共形预测实现 sktime 内嵌 EnbPI 预测区间算法源码解析从 aws-fortuna 提取的分位数共形预测实现【免费下载链接】sktimeA unified framework for machine learning with time series项目地址: https://gitcode.com/GitHub_Trending/sk/sktime导读EnbPIEnsemble Batch Prediction Intervals集成批预测区间是一种基于 bootstrap 与分位数共形预测的时间序列回归区间估计算法。由于上游库 aws-fortuna 存在依赖版本冲突、难以直接安装的问题sktime 将其核心EnbPI类提取并轻微重写存放于sktime/libs/_aws_fortuna_enbpi/并在此基础上实现了集成式概率预测器EnbPIForecaster。本文以该 README 为线索结合仓库内的完整实现源码讲解 EnbPI 的算法原理、EnbPI类的完整 API 与逐段逻辑、在 sktime 预测框架中的集成方式以及实际调用示例与使用限制。读完本文你将能够在自己的时序预测任务中直接复用该共形区间计算管线或深入理解EnbPIForecaster的区间生成机制。背景为什么 sktime 要内嵌一个 EnbPI 实现Fortunaaws-fortuna是亚马逊开源的概率预测与不确定性量化库其中提供了 EnbPI 算法的实现。然而正如关联文档 README.md 所述Extracted and slightly rewritten enbpi class from the aws-fortuna library due to installation issues由于原库的依赖如 JAX 生态相关包存在版本匹配问题导致直接安装 aws-fortuna 不可行仓库 libs/README.md 中的记录为 The installation of the original package is not working due to dependency mismatches。sktime 因此将其中EnbPI类所在的代码提取出来做轻微改写后随仓库一同分发从而在不引入 aws-fortuna 及其重依赖的前提下为 sktime 的预测模块提供共形区间计算能力。这一做法在 sktime 中并不罕见sktime/libs/README.md 将libs目录划分为三类随 sktime 分发并维护的库如fracdiff、pykalman、vmdpy可独立使用私有 vendor fork完整或部分拷贝如granite_ttm、lag_llama、timesfm等供 sktime 内部估计器使用来自其他库的私有片段即文件夹名以下划线_开头的目录_aws_fortuna_enbpi就属于这一类——它们不应被 sktime 用户直接访问而是作为内部基础设施供sktime估计器调用。随包分发的代码同时附带 LICENSE.txtApache License 2.0与 NOTICE.txtCopyright Amazon.com, Inc. or its affiliates保留了上游版权归属。EnbPI 算法原理EnbPIEnsemble Batch Prediction Intervals是 Chen Xu 与 Yao Xie 于 2021 年提出的针对动态时间序列的共形预测区间算法。其核心思想可概括为三步Bootstrap 重采样对训练时序数据做有放回抽样生成 B 组 bootstrap 样本集成预测对每一组样本训练一个模型并对训练点与测试点分别给出预测分位数共形校正利用未被该 bootstrap 样本包含的训练点即 out-of-bag 样本计算残差分布再取1 - error分位数构造区间从而对区间宽度进行自适应校准满足近似边际覆盖率保证。该算法的两个显著特性来自 enbpi.py 的类文档通过 bootstrap 与集成能为每个测试点计算出满足近似边际保证approximate marginal guarantee的共形区间支持在线反馈当新的批次数据陆续到来时可以增量更新区间而无需重新训练模型。在 sktime 内部这一算法被用于EnbPIForecaster的predict_interval为点预测补充置信区间见 sktime/forecasting/enbpi.py。EnbPI 类 API 详解EnbPI类定义在 sktime/libs/_aws_fortuna_enbpi/enbpi.py构造函数只暴露一个参数。构造参数aggregation_fun取值含义默认mean对多个 bootstrap 模型的预测取均值聚合✔median对多个 bootstrap 模型的预测取中位数聚合—源码中的映射逻辑enbpi.py#L26-L30def __init__(self, aggregation_funmean): if aggregation_fun mean: self.aggregation_fun lambda x: np.mean(x, 0) elif aggregation_fun median: self.aggregation_fun lambda x: np.median(x, 0)注意若传入mean、median之外的字符串aggregation_fun属性将不会被赋值后续调用会抛出AttributeError。相比之下sktime 更高层的EnbPIForecaster会对非法取值显式抛出ValueError见下文集成一节这是一个实现上的差异点。方法conformal_interval(...)该方法是 EnbPI 的全部核心用于为每个测试输入计算给定覆盖率下的区间。参数一览参数形状说明bootstrap_indices(B, T)每个 bootstrap 样本从训练集中有放回抽样的原始索引第一维是 B 个 bootstrap 样本第二维是训练点数 T。可用numpy.random.choice(T, size(B, T))生成。用户需自行保证各模型正是在这些索引对应的数据上训练的bootstrap_train_preds(B, T)或(B, T, d)各 bootstrap 模型在训练输入点上的预测第三维若存在必须是 1仅支持一维目标bootstrap_test_preds(B, T_test)或(B, T_test, d)各 bootstrap 模型在测试输入点上的预测train_targets(T,)或(T, 1)训练点对应的真实目标值errorfloat期望的覆盖率误差取值区间 [0, 1]含端点最终区间覆盖率为1 - errorreturn_residualsbool若为True额外返回训练集上计算的残差供在线更新等场景复用默认False返回值return_residualsFalse返回conformal_intervals形状为(T_test, 2)第二维的两个分量分别对应区间左边界与右边界return_residualsTrue返回元组(conformal_intervals, train_residuals)后者是形状为(T, 1)的训练残差。该方法仅支持一维目标变量且每次只能处理一条时间序列见 enbpi.py#L44-L48。源码级解读区间是怎么算出来的conformal_interval的实现enbpi.py#L103-L136可拆解为以下几个阶段1. 构造 out-of-bag 掩码。把每个 bootstrap 样本抽中的索引转化为布尔掩码矩阵n_bootstraps, n_train_times bootstrap_indices.shape in_bootstrap_indices np.zeros((n_bootstraps, n_train_times), dtypebool) np.put_along_axis(in_bootstrap_indices, bootstrap_indices, values1, axis1)2. 逐训练点计算留一集成预测与残差。对每个训练时间点t找出所有没有在 bootstrap 中抽到t的模型which_bootstraps用聚合函数对它们的训练预测取均值/中位数得到该点的聚合预测残差即真实值与聚合预测的绝对差for t in range(n_train_times): which_bootstraps np.where(~(in_bootstrap_indices[:, t]))[0] if len(which_bootstraps) 0: aggr_bootstrap_train_pred self.aggregation_fun(bootstrap_train_preds[which_bootstraps, t]) train_residuals[t] np.abs(train_targets[t] - aggr_bootstrap_train_pred) aggr_bootstrap_test_preds[t] self.aggregation_fun(bootstrap_test_preds[which_bootstraps]) else: train_residuals[t] np.abs(train_targets[t])这里蕴含一个细节所有测试点共享同一组 out-of-bag 模型——对每个训练点t选取的是不包含t的那批模型再把这些模型的测试预测聚合作为去偏后的测试预测。这保证了测试预测与残差估计在模型集合上的一致性是共形保证成立的关键。3. 分位数合成区间。分别对测试聚合预测和训练残差取1 - error分位数然后用预测分位数 ± 残差分位数构造区间test_quantiles np.quantile(aggr_bootstrap_test_preds, q1 - error, axis0) residuals_quantile np.quantile(train_residuals, q1 - error, axis0) left test_quantiles - residuals_quantile right test_quantiles residuals_quantile conformal_intervals np.array(list(zip(left, right)))可以看到区间宽度完全由训练残差分布的分位数自适应决定无需对误差分布做高斯等参数假设这正是共形预测的分布无关特性。若error取 0.05则得到约 95% 覆盖率的区间。4. 残差复用可选。当return_residualsTrue时train_residuals一并返回可用于在后续批次数据到达时增量调整区间宽度即文档所述的在线反馈而不必重训模型。与 sktime 预测框架的集成EnbPIForecasterEnbPI 在 sktime 中的直接消费者是EnbPIForecastersktime/forecasting/enbpi.py它把sktime 基础预测器 tsbootstrap 引导器 EnbPI 算法三者组合成一个完整的概率预测器声明其能力标签为capability:pred_int: True即能够输出预测区间。训练阶段的三步流程用 bootstrap 变换器对目标序列生成 bootstrap 样本并同时返回原始序列的索引要求变换器具备capability:bootstrap_index标签且return_indicesTrue对每个 bootstrap 样本的前n - max(fh)个值分别拟合一个基础预测器用每个已拟合的预测器预测各样本最后max(fh)个值保存为训练期预测。概率预测阶段_predict_intervalsktime/forecasting/enbpi.py#L214-L237将 bootstrap 索引、训练期预测、测试期预测、训练目标与error 1 - cov一并传入EnbPI(...).conformal_interval(...)为每个覆盖水平cov生成(T_test, 2)的区间数组最后按 sktime 的predict_interval列规范{y}{cov}{lower/upper}形式组装成pd.DataFrame返回。关键参数参数默认值说明forecasterNone退化为NaiveForecaster()每个 bootstrap 样本上拟合的基础预测器bootstrap_transformerNone退化为MovingBlockBootstrapTransformer(return_indicesTrue)生成 bootstrap 样本的变换器必须支持返回索引random_stateNone随机种子用于可复现性aggregation_functionmean集成预测的聚合方式仅支持mean或median否则抛ValueError其可用的内置 bootstrap 变换器包括 sktime/transformations/bootstrap/_mbb.py 中的MovingBlockBootstrapTransformer与 sktime/transformations/bootstrap/_tsbootstrap.py 中的TSBootstrapAdapter用于适配tsbootstrap库。注意EnbPIForecaster依赖软依赖tsbootstrap0.1.0且当前在测试中标记为tests:skip_all见 sktime/forecasting/enbpi.py#L104-L121 的_tags跳过原因为 issue #10083。实战示例跑通 EnbPI 预测区间以下是 sktime/forecasting/enbpi.py 类文档中提供的官方使用示例读者可直接在已安装tsbootstrap的环境中运行import numpy as np from tsbootstrap import MovingBlockBootstrap from sktime.forecasting.enbpi import EnbPIForecaster from sktime.forecasting.naive import NaiveForecaster from sktime.datasets import load_airline from sktime.transformations.difference import Differencer from sktime.transformations.detrend import Deseasonalizer from sktime.forecasting.base import ForecastingHorizon y load_airline() forecaster Differencer(lags[1]) * Deseasonalizer(sp12) * EnbPIForecaster( forecasterNaiveForecaster(sp12), bootstrap_transformerMovingBlockBootstrap(n_bootstraps10), ) fh ForecastingHorizon(np.arange(1, 13)) forecaster.fit(y, fhfh) res forecaster.predict() res_int forecaster.predict_interval(coverage[0.5])示例要点通过Differencer(lags[1]) * Deseasonalizer(sp12) * EnbPIForecaster(...)以管道方式组合差分、去季节化与 EnbPI 预测器MovingBlockBootstrap(n_bootstraps10)生成 10 组 bootstrap 样本fh ForecastingHorizon(np.arange(1, 13))指定未来 12 步的预测范围predict_interval(coverage[0.5])调用 EnbPI 计算 50% 覆盖率的共形区间。若想单独复用底层EnbPI类不经过EnbPIForecaster可仿照其内部调用方式直接构造import numpy as np from sktime.libs._aws_fortuna_enbpi.enbpi import EnbPI B, T 10, 100 # bootstrap 样本数、训练点数 bootstrap_indices np.random.choice(T, size(B, T)) # 有放回采样索引 bootstrap_train_preds np.random.rand(B, T) # (B, T) bootstrap_test_preds np.random.rand(B, 12) # (B, T_test) train_targets np.random.rand(T, 1) # (T, 1) intervals EnbPI(mean).conformal_interval( bootstrap_indicesbootstrap_indices, bootstrap_train_predsbootstrap_train_preds, bootstrap_test_predsbootstrap_test_preds, train_targetstrain_targets, error0.05, # 期望覆盖率 95% ) print(intervals.shape) # (12, 2)每行依次为 [下界, 上界]使用限制与注意事项适用范围EnbPI.conformal_interval仅支持一维目标变量、单条时间序列的处理enbpi.py#L44-L48多元目标或面板数据需自行封装循环调用契约调用方必须保证bootstrap_train_preds、bootstrap_test_preds与bootstrap_indices之间的一一对应——即第b组模型确实是在bootstrap_indices[b]对应的数据上训练的否则共形保证将失效error取值范围为 [0, 1] 闭区间内的标量对应覆盖率1 - error内部模块定位sktime/libs/_aws_fortuna_enbpi属于来自其他库的私有片段sktime/libs/README.mdsktime 官方建议通过上层估计器如EnbPIForecaster间接使用而非直接 import 该内部模块依赖与测试状态EnbPIForecaster需要软依赖tsbootstrap0.1.0且当前测试被临时跳过issue #10083使用前需评估其维护状态许可该片段源自 aws-fortuna随包保留 Apache License 2.0LICENSE.txt与 Amazon 版权声明NOTICE.txt二次分发或修改时需遵守对应条款。总结sktime/libs/_aws_fortuna_enbpi是 sktime 为解决 aws-fortuna 安装问题而内嵌的 EnbPI 共形预测算法实现目录虽小却承担了EnbPIForecaster概率区间生成的全部底层逻辑。通过本文的拆解可以看到其conformal_interval方法用out-of-bag 模型聚合 分位数残差校准的方式在无需重新训练的前提下为时序回归输出带近似边际保证的区间而EnbPIForecaster则把该算法与 bootstrap 变换器和 sktime 基础预测器组合形成了开箱即用的集成式概率预测器。理解这一实现不仅能让你掌握一个可复用的共形区间工具也有助于读懂 sktime 处理概率预测与不确定性量化的整体设计思路。【免费下载链接】sktimeA unified framework for machine learning with time series项目地址: https://gitcode.com/GitHub_Trending/sk/sktime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表