跳到主要内容

预测分析

时序数据预测分析以持续一个时间段的时序数据作为输入,预测接下来一个连续时间区间内的时间序列数据趋势,并且用户可以指定(预测)输出的时间序列数据点数量。TDengine 引入 SQL 函数 FORECAST 提供预测分析功能。用于预测的历史时间序列是该函数的输入,输出即为预测结果。用户可以通过 FORECAST 函数调用 TDgpt 提供的预测算法服务。预测分析通常只能针对超级表的子表或者不同表中同一个时间序列。

在后续章节中,使用时序数据表 foo 作为示例介绍预测算法的使用方式,foo 表模式定义如下:

列名称类型说明
tsTIMESTAMP主时间戳列
val整数测量值
past_co_val整数历史协变量数据
future_co_val整数未来协变量数据
taos> select * from foo limit 8;
ts | val | past_co_val | future_co_val |
======================================================================
2020-01-01 00:00:12.681 | 13 | 1| 1 |
2020-01-01 00:00:13.727 | 14 | 2| 1 |
2020-01-01 00:00:14.378 | 8 | 3| 1 |
2020-01-01 00:00:15.774 | 10 | 4| 1 |
2020-01-01 00:00:16.170 | 16 | 5| 1 |
2020-01-01 00:00:17.558 | 26 | 6| 1 |
2020-01-01 00:00:18.938 | 32 | 7| 1 |
2020-01-01 00:00:19.308 | 27 | 8| 1 |

语法

FORECAST(column_expr, option_expr)

option_expr: {"
algo=expr1
[,wncheck=1|0]
[,conf=conf_val]
[,every=every_val]
[,rows=rows_val]
[,start=start_ts_val]
[,timeout=timeout_val]
[,expr2]
"}
  1. column_expr:预测的时序数据列,只支持数值类型列输入。
  2. option_expr:预测函数的参数。字符串类型,其中使用 K=V 方式调用算法及相关参数。采用逗号分隔的 K=V 字符串表示,其中的字符串不需要使用单引号、双引号或转义号等符号,不能使用中文及其他宽字符。预测支持 confeveryrowsstarttimeout 等控制参数,其含义如下。

参数说明

参数含义默认值
algo预测分析使用的算法holtwinters
wncheck是否对输入做白噪声(white noise)检查1(检查);0 表示不检查
conf预测置信水平(写入 _FLOW / _FHIGH 时使用),默认 0.95。查询侧有效范围为 (0, 1],越界回退为默认值;Anode 侧当前拒绝 conf >= 1.0,端到端请使用 (0, 1)(例如 0.950.95
every预测数据的采样间隔输入数据的采样间隔,单位同查询的时序数据
start预测结果的开始时间戳输入数据最后一个时间戳加上一个采样间隔
rows预测结果的记录数10
timeout预测分析等待的最长时间,超时以后自动返回错误;自 v3.3.6.5 起支持60(秒),最大值为 1200(秒)
  • 预测查询结果新增三个伪列,具体如下。
    • _FROWTS:预测结果的时间戳
    • _FLOW:置信区间下界
    • _FHIGH:置信区间上界;对于没有置信区间的预测算法,其上下界与预测结果相同
  • 更改参数 start:返回预测结果的起始时间,改变起始时间不会影响返回的预测数值,只影响起始时间。
  • every:可以与输入数据的采样频率不同。采样频率只能低于或等于输入数据采样频率,不能高于输入数据的采样频率。
  • 对于某些不需要计算置信区间的算法,即使指定了置信区间,返回结果中的上下界也会退化成一个点。
  • rows 的最大输出值是 1024,即最多预测 1024 个值。超过上限将返回错误。
  • 预测分析需要至少 10 行数据作为预测依据,最多允许 40000 行数据作为预测依据;部分分析模型接受的输入数据行数更少。

CES、Theta 和 ETS 选型建议

数据特征推荐算法原因
季节模式较复杂,难以用常规加法或乘法模式描述CESCES 使用复数状态描述季节变化,并支持自动选择模型形式
序列具有明显的长期趋势和相对规律的季节性ThetaTheta 侧重趋势预测;季节振幅稳定时使用加法分解,季节振幅随序列水平成比例变化时使用乘法分解
希望明确解释误差、趋势和季节成分ETSETS 可以自动选择或显式配置加法、乘法成分,并支持阻尼趋势

不确定模型结构时,可以先使用 CES 的 model=Z 或 ETS 的 model=ZZZ 自动选择。Theta 的乘法分解以及 ETS 中显式指定的乘法成分都要求输入数据严格为正数。进行季节性预测时,需要设置 period,并提供至少两个完整周期的历史数据。

示例

-- 使用 arima 算法进行预测,预测结果是 10 条记录(默认值),数据进行白噪声检查,默认置信区间 95%
SELECT _flow, _fhigh, _frowts, FORECAST(val, "algo=arima")
FROM foo;

-- 使用 arima 算法进行预测:输入为周期数据,每 10 个采样点是一个周期;返回置信区间 95% 的上下边界,同时忽略白噪声检查
SELECT _flow, _fhigh, _frowts, FORECAST(val, "algo=arima,conf=0.95,period=10,wncheck=0")
FROM foo;
taos> select _flow, _fhigh, _frowts, forecast(val) from foo;
_flow | _fhigh | _frowts | forecast(val) |
========================================================================================
10.5286684 | 41.8038254 | 2020-01-01 00:01:35.000 | 26 |
-21.9861946 | 83.3938904 | 2020-01-01 00:01:36.000 | 30 |
-78.5686035 | 144.6729126 | 2020-01-01 00:01:37.000 | 33 |
-154.9797363 | 230.3057709 | 2020-01-01 00:01:38.000 | 37 |
-253.9852905 | 337.6083984 | 2020-01-01 00:01:39.000 | 41 |
-375.7857971 | 466.4594727 | 2020-01-01 00:01:40.000 | 45 |
-514.8043823 | 622.4426270 | 2020-01-01 00:01:41.000 | 53 |
-680.6343994 | 796.2861328 | 2020-01-01 00:01:42.000 | 57 |
-868.4956665 | 992.8603516 | 2020-01-01 00:01:43.000 | 62 |
-1076.1566162 | 1214.4498291 | 2020-01-01 00:01:44.000 | 69 |

单变量与协变量分析预测

TDgpt 支持单变量分析预测(single-variable forecasting)。自 v3.3.6.6 起支持历史协变量分析预测(co-variate forecasting),暂不支持静态协变量

使用协变量分析预测时,需要部署 moirai 时序数据基础模型。此时,参数 algo 只能是 moirai。 在后续版本中,还将提供其他时序基础模型(如 timesfm)的协变量预测分析能力。

协变量预测

上图中包含两个协变量和一个目标变量(又称为主变量)。其中 Target 是预测分析的目标,Prediction value 是预测结果。Past dynamic real features 是历史协变量,Dynamic real feature 是未来协变量。历史协变量和未来协变量中与目标变量相同时间区间上的数据从时序数据库中获取;未来协变量中与目标时间段对应的数据需要在 SQL 语句中输入。具体使用方式见下面的详细介绍。

历史协变量预测

使用如下语句即可调用协变量预测分析服务(以下语句只能在 v3.3.6.6 及以后的版本运行)。

FORECAST 函数输入单列时,为默认的单变量分析预测模式。输入多列时,第一列为主变量,之后的输入数据列是协变量。 所有输入列均只能是数值类型。

-- 第一列(val)为主变量,之后的列(past_co_val)为历史协变量,调用 moirai 基础时序模型
SELECT _frowts, forecast(val, past_co_val, 'algo=moirai') FROM foo;

未来协变量预测

未来协变量预测时,需要设置未来的输入值以及该输入值对应的协变量列。 协变量列的输入需要在 SQL 语句中补充,采用中括号内数组方式,不同的数值之间采用空格分隔。数量应该等于预测分析的数量,如果不等会报错。 未来协变量采用 dynamic_real_ 作为名称的前缀。有多个未来协变量时,可以分别命名为 dynamic_real_1dynamic_real_2dynamic_real_3 等。 对于每个未来协变量数据,需要设置其关联的未来协变量列。dynamic_real_1 关联的列通过参数 dynamic_real_1_col 设置,dynamic_real_2 关联的列通过参数 dynamic_real_2_col 设置。

如下所示,预测分析针对 val 列进行,同时提供一个历史协变量列 past_co_val、一个未来协变量列 future_co_val;未来协变量数值通过 dynamic_real_1 设置,数组中有 4 个未来值,通过 dynamic_real_1_col=future_co_val 设置关联的未来协变列是 future_co_val

SELECT _frowts, forecast(val, past_co_val, future_co_val, "algo=moirai,rows=4, dynamic_real_1=[1 1 1 1], dynamic_real_1_col=future_co_val") FROM foo;

内置预测算法