预测分析
时序数据预测分析以持续一个时间段的时序数据作为输入,预测接下一个连续时间区间内时间序列数据趋势,并且用户可以指定(预测)输出的时间序列数据点数量。为此,TDengine 引入新 SQL 函数 FORECAST
提供预测分析功能。基础数据(用于预测的历史时间序列数据)是该函数的输入,预测结果是该函数的输出。用户可以通过 FORECAST
函数调用 Anode 提供的预测算法提供的服务。预测分析通常只能针对超级表的子表或者不同表中同一个时间序列。
在后续章节中,使用时序数据表 foo
作为示例,介绍预测和异常检测算法的使用方式,foo
表模式定义如下:
列名称 | 类型 | 说明 |
---|---|---|
ts | timestamp | 主时间戳列 |
i32 | int32 | 4字节整数,设备测量值 metric |
taos> select * from foo;
ts | i32 |
========================================
2020-01-01 00:00:12.681 | 13 |
2020-01-01 00:00:13.727 | 14 |
2020-01-01 00:00:14.378 | 8 |
2020-01-01 00:00:15.774 | 10 |
2020-01-01 00:00:16.170 | 16 |
2020-01-01 00:00:17.558 | 26 |
2020-01-01 00:00:18.938 | 32 |
2020-01-01 00:00:19.308 | 27 |
语法
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]
[,expr2]
"}
column_expr
:预测的时序数据列,只支持数值类型列输入。options
:预测函数的参数。字符串类型,其中使用 K=V 方式调用算法及相关参数。采用逗号分隔的 K=V 字符串表示,其中的字符串不需要使用单引号、双引号、或转义号等符号,不能使用中文及其他宽字符。预测支持conf
、every
、rows
、start
、rows
几个控制参数,其含义如下。
参数说明
参数 | 含义 | 默认值 |
---|---|---|
algo | 预测分析使用的算法 | holtwinters |
wncheck | 白噪声(white noise data)检查 | 默认值为 1,0 表示不进行检查 |
conf | 预测数据的置信区间范围 ,取值范围 [0, 100] | 95 |
every | 预测数据的采样间隔 | 输入数据的采样间隔 |
start | 预测结果的开始时间戳 | 输入数据最后一个时间戳加上一个采样间隔时间区间 |
rows | 预测结果的记录数 | 10 |
- 预测查询结果新增三个伪列,具体如下。
_FROWTS
:预测结果的时间戳_FLOW
:置信区间下界_FHIGH
:置信区间上界,对于没有置信区间的预测算法,其置信区间同预测结果
- 更改参数
START
:返回预测结果的起始时间,改变起始时间不会影响返回的预测数值,只影响起始时间。 EVERY
:可以与输入数据的采样频率不同。采样频率只能低于或等于输入数据采样频率,不能高于输入数据的采样频率。- 对于某些不需要计算置信区间的算法,即使指定了置信区间,返回的结果中其上下界退化成为一个点。
- rows 的最大输出值是 1024,即只能预测 1024 个值。超过输出范围的参数会被自动设置为 1024。
- 预测分析的输入数据行数最大值是 40000 行,即用于预测分析的历史数据不能超过 40000 行。针对部分分析模型接受的输入数据行数更少。
示例
--- 使用 arima 算法进行预测,预测结果是 10 条记录(默认值),数据进行白噪声检查,默认置信区间 95%.
SELECT _flow, _fhigh, _frowts, FORECAST(i32, "algo=arima")
FROM foo;
--- 使用 arima 算法进行预测,输入数据的是周期数据,每 10 个采样点是一个周期,返回置信区间是95%的上下边界,同时忽略白噪声检查
SELECT _flow, _fhigh, _frowts, FORECAST(i32, "algo=arima,alpha=95,period=10,wncheck=0")
FROM foo;
taos> select _flow, _fhigh, _frowts, forecast(i32) from foo;
_flow | _fhigh | _frowts | forecast(i32) |
========================================================================================
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 |
内置预测算法
- ARIMA
- HoltWinters
- CES (Complex Exponential Smoothing)
- Theta
- Prophet
- XGBoost
- LightGBM
- Multiple Seasonal-Trend decomposition using LOESS (MSTL)
- ETS (Error, Trend, Seasonal)
- Long Short-Term Memory (LSTM)
- Multilayer Perceptron (MLP)
- DeepAR
- N-BEATS
- N-HiTS
- PatchTST (Patch Time Series Transformer)
- Temporal Fusion Transformer
- TimesNet
算法有效性评估工具
TDgpt 在企业版中提供预测分析算法有效性评估工具 analytics_compare
,调用该工具并设置合适的参数,能够使用 TDengine 中已经保存的数据作为回测依据,评估不同预测算法或训练模型的预测有效性。预测有效性的评估使用 MSE
指标作为依据,后续还将增加 MAPE
和 MAE
指标。
使用评估工具,需要在配置文件 taosanode.ini
中设置正确的参数,包括选取评估的数据范围、结果输出时间、参与评估的算法、算法相应的参数、是否生成预测结果图等配置信息。
[forecast]
# 训练数据的周期,每个周期包含多少个输入点
period = 10
# 使用范围内最后 10 条记录作为预测结果
rows = 10
# 训练数据开始时间
start_time = 1949-01-01T00:00:00
# 训练数据结束时间
end_time = 1960-12-01T00:00:00
# 输出结果的起始时间
res_start_time = 1730000000000
# 是否绘制预测结果图
gen_figure = true
在具备完备的 Python 库的运行环境中,通过 shell
调用 TDgpt 安装路径下的 misc 中 analytics_compare
的命令即可。可以按照如下方式体验算法有效性评估工具:
-
在配置文件
analytics.ini
配置文件中设置taosd
服务的连接信息,包括 主机地址、配置文件路径、用户名、登录密码等信息。[taosd]
# taosd 服务主机名
host = 127.0.0.1
登录用户名
user = root
登录密码
password = taosdata
配置文件路径
conf = /etc/taos/taos.cfg
[input_data]
用于预测评估的数据库名称
db_name = test
读取数据的表名称
table_name = passengers
读取列名称
column_name = val, _c0
2. 准备数据。
我们在 TDgpt 安装目录下的 `resource` 文件夹中准备了一个样例数据 `sample-fc.sql`, 执行以下命令即可见示例数据写入到数据库:
```shell
taos -f sample-fc.sql
即可将示例数据写入到数据库中,以便进行后续的评估
- 执行算法评估工具,首先需要确保激活虚拟环境并调用 taosanode 运行的虚拟环境的 Python,否则启动的时候 Python 会提示找不到所需要的依赖库。
python3.10 ./analytics_compare.py forecast
- 运行完成后,在当前目录下生成
fc_result.xlsx
文件,此文件即为算法评估的结果文件。该文件中第一个卡片是算法运行结果(如下表所示),分别包含了算法名称、执行调用参数、均方误差、执行时间 4 个指标。
algorithm | params | MSE | elapsed_time(ms.) |
---|---|---|---|
holtwinters | {"trend":"add", "seasonal":"add"} | 351.622 | 125.1721 |
arima | {"time_step":3600000, "start_p":0, "max_p":10, "start_q":0, "max_q":10} | 433.709 | 45577.9187 |
如果设置了 gen_figure
为 true,分析结果中还会有绘制的分析预测结果图(如下图所示)。
