预测区间
/v1/forecast 默认只返回点预测 y_hat。在请求中传入 level,每个预测点会额外带上对应水平的区间。
1. level 参数
level 是 1 至 99 的整数列表,例如 [80, 90]。重复的值会合并,顺序不影响结果。
每个水平 L 对应模型的两个分位数:
| 边界 | 分位数 | L = 80 时 | L = 90 时 |
|---|---|---|---|
lo | 0.5 − L / 200 | 0.10 | 0.05 |
hi | 0.5 + L / 200 | 0.90 | 0.95 |
2. 原生分位点
模型只能输出训练时固定的分位点,服务不做插值:
| 模型 | 原生分位点 | 可原样得到的 level |
|---|---|---|
hora-1.0 | 0.01、0.05、0.10、0.15 … 0.90、0.95、0.99 | 10、20 … 80、90、98 |
请求的分位数不在列表中时,由 quantile_policy 决定处理方式。
3. quantile_policy(Beta)
| 取值 | 行为 |
|---|---|
nearest(默认) | 用最接近的原生分位点代替(距离相同时取更靠外的一个),区间键按实际使用的分位数标注,不沿用请求的水平。 |
strict | 只要有一个分位数不是原生的,就在推理和额度预占之前返回 422 QUANTILE_UNSUPPORTED,不计费。 |
例如请求 level: [80, 95]:80 对应 0.1 与 0.9,是原生的;95 需要 0.025 与 0.975,在 nearest 下分别由 0.01 与 0.99 代替,因此响应里是 "80" 与 "98" 两个键,不会出现 "95"。
strict 下的错误响应列出不支持的分位数与模型支持的分位数:
{
"error": {
"code": "QUANTILE_UNSUPPORTED",
"message": "Model 'hora-1.0' does not natively produce quantile levels [0.025, 0.975]",
"request_id": "req_…",
"details": {
"model": "hora-1.0",
"level": [95],
"unsupported": [0.025, 0.975],
"supported": [0.01, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 0.99]
}
}
}4. 响应形状
intervals 是以水平字符串为键的对象,键是实际使用的两个分位数之间的覆盖水平 (hi − lo) × 100;不传 level 时,预测点上没有 intervals 字段。
{
"unique_id": "meter-001",
"ds": "2026-09-03T00:00:00Z",
"y_hat": 140.2,
"intervals": {
"80": {"lo": 133.9, "hi": 146.8},
"90": {"lo": 131.7, "hi": 148.9}
}
}lo总是不大于hi。- 多个水平落到同一对原生分位数时只返回一次;两端都落到中位数的水平不返回区间。
- 区间与点预测都来自同一次模型推理,不额外计费。
响应顶层还有 quantile_report(Beta),说明请求的分位数、实际使用的分位数以及每一处替换:
{
"quantile_report": {
"policy": "nearest",
"requested": [0.025, 0.1, 0.5, 0.9, 0.975],
"used": [0.01, 0.1, 0.5, 0.9, 0.99],
"substitutions": [
{"requested": 0.025, "used": 0.01},
{"requested": 0.975, "used": 0.99}
]
}
}5. 点预测分位数 point_quantile(Beta)
y_hat 默认是模型的中位数(0.5 分位),不是期望值。需要偏保守或偏乐观的点预测时(例如备货用 P70),传入 point_quantile,y_hat 就改为该分位数:
- 取值 0.01–0.99,最多 3 位小数(如
0.7、0.025);超出范围、更多小数、布尔值或字符串都返回 422VALIDATION_ERROR,details.errors[].field为point_quantile。 - 与
level一样按quantile_policy映射到模型的原生分位点,不做插值:nearest下取最接近的原生分位点(例如 0.33 由 0.35 提供),距离相同时取离中位数更远的一个;strict下非原生值在额度预占之前返回 422QUANTILE_UNSUPPORTED,details.point_quantile为请求值。 - 与
level相互独立,所以y_hat可以落在区间之外(例如point_quantile: 0.95配level: [80])。 - 不传时行为与响应完全不变。传了时响应顶层回显实际使用的
point_quantile,quantile_report的requested、used、substitutions包含它,并新增point_forecast。不额外计费。
{
"model": "hora-1.0",
"series": [ … ],
"h": 24,
"level": [80],
"point_quantile": 0.33
}{
"model_used": "hora-1.0",
"point_quantile": 0.35,
"forecast": [
{"unique_id": "meter-001", "ds": "2026-09-03T00:00:00Z", "y_hat": 145.1,
"intervals": {"80": {"lo": 133.9, "hi": 146.8}}}
],
"quantile_report": {
"policy": "nearest",
"requested": [0.1, 0.33, 0.5, 0.9],
"used": [0.1, 0.35, 0.5, 0.9],
"substitutions": [{"requested": 0.33, "used": 0.35}],
"point_forecast": {"requested": 0.33, "used": 0.35, "method": "nearest"}
}
}