在工业智能化转型中,时序数据库与 AI 技术的结合对故障和异常预测场景的准确性和效率至关重要,逐渐成为行业前沿关注热点。在此方面,IoTDB 已迈出支持 AI 深度分析的重要一步,于 2023 年 12 月 3 日 IoTDB 用户大会上推出了内生机器学习节点 AINode。
AINode 的设计允许用户通过简单的 SQL 语句引入和运行外部机器学习模型,将模型的创建、管理及推理成功融合在数据库引擎中,极大地简化了时序分析任务的同时,大幅扩展了对时序数据进行机器学习分析的能力,其易用性与性能表现广受用户好评。
通过深入探讨 AINode 在工业应用中的案例及效果,并详解应用的具体场景与步骤,本文将让你更加全面地了解 IoTDB 的数据分析核心 AINode。
01 应用案例
我们先来看几个 AINode 赋能工业预测场景的案例:
(1)电力负载预测
在部分工业场景下,会存在预测电力负载的需求,预测结果可用于优化电力供应、节约能源和资源、支持规划和扩展以及增强电力系统的可靠性。
我们所使用的 ETTh1 的测试集的数据包含间隔 1h 采集一次的电力数据,每条数据由负载和油温构成,分别为:High UseFul Load, High UseLess Load, Middle UseLess Load, Low UseFul Load, Low UseLess Load, Oil Temperature。
在该数据集上,IoTDB-ML 的模型推理功能可以通过以往高中低三种负载的数值和对应时间戳油温的关系,预测未来一段时间内的油温,赋能电网变压器的自动调控和监视。
步骤一:数据导入
用户可以使用 tools 文件夹中的 import-csv.sh 向 IoTDB 中导入 ETT 数据集:
bash ./import-csv.sh -h 127.0.0.1 -p 6667 -u root -pw root -f ../../ETTh1.csv
步骤二:模型导入
我们可以在 iotdb-cli 中输入以下 SQL 从 huggingface 上拉取一个已经训练好的模型进行注册,用于后续的推理。
create model dlinear using uri 'https://huggingface.co/hvlgo/dlinear/resolve/main'
该模型基于较为轻量化的深度模型 DLinear 训练而得,能够以相对快的推理速度尽可能多地捕捉到序列内部的变化趋势和变量间的数据变化关系,相较于其他更深的模型更适用于快速实时预测。
步骤三:模型推理
我们将对油温的预测的结果和真实结果进行对比,可以得到以下的图像。
图中 10/24 00:00 之前的数据为输入模型的过去数据,10/24 00:00 后的黄色线条为模型给出的油温预测结果,而蓝色为数据集中实际的油温数据(用于进行对比)。
IoTDB> select s0,s1,s2,s3,s4,s5,s6 from root.eg.etth LIMIT 96
+-----------------------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
| Time|root.eg.etth.s0|root.eg.etth.s1|root.eg.etth.s2|root.eg.etth.s3|root.eg.etth.s4|root.eg.etth.s5|root.eg.etth.s6|
+-----------------------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
|2017-10-20T00:00:00.000+08:00| 10.449| 3.885| 8.706| 2.025| 2.041| 0.944| 8.864|
|2017-10-20T01:00:00.000+08:00| 11.119| 3.952| 8.813| 2.31| 2.071| 1.005| 8.442|
|2017-10-20T02:00:00.000+08:00| 9.511| 2.88| 7.533| 1.564| 1.949| 0.883| 8.16|
|2017-10-20T03:00:00.000+08:00| 9.645| 2.21| 7.249| 1.066| 1.828| 0.914| 7.949|
......
|2017-10-23T20:00:00.000+08:00| 8.105| 0.938| 4.371| -0.569| 3.533| 1.279| 9.708|
|2017-10-23T21:00:00.000+08:00| 7.167| 1.206| 4.087| -0.462| 3.107| 1.432| 8.723|
|2017-10-23T22:00:00.000+08:00| 7.1| 1.34| 4.015| -0.32| 2.772| 1.31| 8.864|
|2017-10-23T23:00:00.000+08:00| 9.176| 2.746| 7.107| 1.635| 2.65| 1.097| 9.004|
+-----------------------------+---------------+---------------+---------------+---------------+---------------+---------------+---------------+
Total line number = 96
IoTDB> call inference(dlinear_example, "select s0,s1,s2,s3,s4,s5,s6 from root.eg.etth", window=head(96))
+-----------+----------+----------+------------+---------+----------+----------+
| output0| output1| output2| output3| output4| output5| output6|
+-----------+----------+----------+------------+---------+----------+----------+
| 10.319546| 3.1450553| 7.877341| 1.5723765|2.7303758| 1.1362307| 8.867775|
| 10.443649| 3.3286757| 7.8593454| 1.7675098| 2.560634| 1.1177158| 8.920919|
| 10.883752| 3.2341104| 8.47036| 1.6116762|2.4874182| 1.1760603| 8.798939|
......
| 8.0115595| 1.2995274| 6.9900327|-0.098746896| 3.04923| 1.176214| 9.548782|
| 8.612427| 2.5036244| 5.6790237| 0.66474205|2.8870275| 1.2051733| 9.330128|
| 10.096699| 3.399722| 6.9909| 1.7478468|2.7642853| 1.1119363| 9.541455|
+-----------+----------+----------+------------+---------+----------+----------+
Total line number = 48
我们将对油温的预测的结果和真实结果进行对比,可以得到以下的图像。
图中 10/24 00:00 之前的数据为输入模型的过去数据,10/24 00:00 后的黄色线条为模型给出的油温预测结果,而蓝色为数据集中实际的油温数据(用于进行对比)。
可以看到,我们使用了过去 96 个小时(4 天)的六个负载信息和对应时间油温的关系,基于之前学习到的序列间相互关系对未来 48 个小时(2 天)的油温这一数据的可能变化进行了建模,可以看到可视化后预测曲线与实际结果在趋势上保持了较高程度的一致性。
(2)变电站功率预测
变电站需要对电流、电压、功率等数据进行电力监控,用于检测潜在的电网问题、识别电力系统中的故障、有效管理电网负载以及分析电力系统的性能和趋势等。
我们利用某变电站中的电流、电压和功率等数据构成了真实场景下的数据集。该数据集包括变电站近四个月时间跨度,每 5 - 6s 采集一次的 A 相电压、B 相电压、C 相电压等数据。
在该数据集上,IoTDB-ML 的模型推理功能可以通过以往 A 相电压,B 相电压和 C 相电压的数值和对应时间戳,预测未来一段时间内的 C 相电压,赋能变电站的监视管理。
步骤一:数据导入
用户可以使用 tools 文件夹中的 import-csv.sh 导入数据集:
bash ./import-csv.sh -h 127.0.0.1 -p 6667 -u root -pw root -f ../../data.csv
步骤二:模型导入
我们可以在 iotdb-cli 中输入以下 SQL 从 huggingface 上拉取一个已经训练好的模型进行注册,用于后续的推理。
create model patchtst using uri 'https://huggingface.co/hvlgo/patchtst/resolve/main'
我们采用深度模型 PatchTST 进行预测,PatchTST 是一种基于 transformer 的时序预测模型,在长时间序列预测任务中有出色的表现。
步骤三:模型推理
IoTDB> select * from root.eg.voltage limit 96
+-----------------------------+------------------+------------------+------------------+
| Time|root.eg.voltage.s0|root.eg.voltage.s1|root.eg.voltage.s2|
+-----------------------------+------------------+------------------+------------------+
|2023-02-14T20:38:32.000+08:00| 2038.0| 2028.0| 2041.0|
|2023-02-14T20:38:38.000+08:00| 2014.0| 2005.0| 2018.0|
|2023-02-14T20:38:44.000+08:00| 2014.0| 2005.0| 2018.0|
......
|2023-02-14T20:47:52.000+08:00| 2024.0| 2016.0| 2027.0|
|2023-02-14T20:47:57.000+08:00| 2024.0| 2016.0| 2027.0|
|2023-02-14T20:48:03.000+08:00| 2024.0| 2016.0| 2027.0|
+-----------------------------+------------------+------------------+------------------+
Total line number = 96
IoTDB> call inference(patchtst, "select s0,s1,s2 from root.eg.voltage", window=head(96))
+---------+---------+---------+
| output0| output1| output2|
+---------+---------+---------+
|2013.4113|2011.2539|2010.2732|
|2013.2792| 2007.902|2035.7709|
|2019.9114|2011.0453|2016.5848|
......
|2018.7078|2009.7993|2017.3502|
|2033.9062|2010.2087|2018.1757|
|2022.2194| 2011.923|2020.5442|
|2022.1393|2023.4688|2020.9344|
+---------+---------+---------+
Total line number = 48
我们将对 C 相电压的预测的结果和真实结果进行对比,可以得到以下的图像。
图中 01/25 14:33 之前的数据为输入模型的过去数据,01/25 14:33 后的黄色线条为模型给出的 C 相电压预测结果,而蓝色为数据集中实际的 A 相电压数据(用于进行对比)。
可以看到,我们使用了过去 8 分钟的电压的数据,基于之前学习到的序列间相互关系对未来 4 分钟的 A 相电压这一数据的可能变化进行了建模,可以看到可视化后预测曲线与实际结果在趋势上保持了较高程度的同步性。
(3)交通运输异常预测
在民航交通运输业,存在着对乘机旅客数量进行异常检测的需求。异常检测的结果可用于指导调整航班的调度,以使得企业获得更大效益。
Airline Passengers 是一个时间序列数据集,该数据集记录了 1949 年至 1960 年期间国际航空乘客数量,间隔一个月进行一次采样。该数据集共含一条时间序列。
在该数据集上,IoTDB-ML 的模型推理功能可以通过捕捉序列的变化规律以对序列时间点进行异常检测,赋能交通运输业。
步骤一:数据导入
用户可以使用 tools 文件夹中的 import-csv.sh 导入数据集:
bash ./import-csv.sh -h 127.0.0.1 -p 6667 -u root -pw root -f ../../data.csv
步骤二:模型推理
IoTDB 内置有部分可以直接使用的机器学习算法,使用其中的异常检测算法进行预测的样例如下:
IoTDB> select * from root.eg.airline
+-----------------------------+------------------+
| Time|root.eg.airline.s0|
+-----------------------------+------------------+
|1949-01-31T00:00:00.000+08:00| 224.0|
|1949-02-28T00:00:00.000+08:00| 118.0|
|1949-03-31T00:00:00.000+08:00| 132.0|
|1949-04-30T00:00:00.000+08:00| 129.0|
......
|1960-09-30T00:00:00.000+08:00| 508.0|
|1960-10-31T00:00:00.000+08:00| 461.0|
|1960-11-30T00:00:00.000+08:00| 390.0|
|1960-12-31T00:00:00.000+08:00| 432.0|
+-----------------------------+------------------+
Total line number = 144
IoTDB> call inference(_Stray, "select s0 from root.eg.airline", k=2)
+-------+
|output0|
+-------+
| 0|
| 0|
| 0|
| 0|
......
| 1|
| 1|
| 0|
| 0|
| 0|
| 0|
+-------+
Total line number = 144
我们将检测为异常的结果进行绘制,可以得到以下图像。其中蓝色曲线为原时间序列,用红色点特殊标注的时间点为算法检测为异常的时间点。
可以看到,Stray 模型对输入序列变化进行了建模,成功检测出出现异常的时间点。
02 使用指导
通过上述案例,我们可以看到,AINode 能够有效支持工业场景所需的数据预测、异常检测等场景,并具备出色的性能表现。
接下来我们将详细指导如何使用 AINode。AINode 对时序数据相关的深度学习模型提供了模型创建及删除的流程,内置模型无需创建及删除,可直接使用,并且在完成推理后创建的内置模型实例将自动销毁。
(1)注册模型
通过指定模型输入输出的向量维度,可以注册训练好的深度学习模型,从而用于模型推理。下方为模型注册的 SQL 语法定义。
create model <model_name> using uri <uri>
SQL 中参数的具体含义如下:
model_name:模型的全局唯一标识,不可重复。模型名称具备以下约束:
允许出现标识符 [ 0-9 a-z A-Z _ ](字母,数字,下划线)
长度限制为 2-64 字符
大小写敏感
uri:模型注册文件的资源路径,路径下应包含模型权重 model.pt 文件和模型的元数据描述文件 config.yaml
模型权重文件:深度学习模型训练完成后得到的权重文件,目前支持 pytorch 训练得到的 .pt 文件
yaml 元数据描述文件:模型注册时需要提供的与模型结构有关的参数,其中必须包含模型的输入输出维度用于模型推理:
除了模型推理外,还可以指定模型输入输出的数据类型:
除此之外,可以额外指定备注信息用于在模型管理时进行展示:
除了本地模型文件的注册,还可以通过 URI 来指定远程资源路径来进行注册,使用开源的模型仓库(例如 HuggingFace)。
示例
在当前的 example 文件夹下,包含 model.pt 和 config.yaml 文件,model.pt 为训练得到,config.yaml 的内容如下:
configs:
# 必选项
input_shape: [96, 2] # 表示模型接收的数据为96行x2列
output_shape: [48, 2] # 表示模型输出的数据为48行x2列
# 可选项 默认为全部float32,列数为shape对应的列数
input_type: ["int64","int64"] #输入对应的数据类型,需要与输入列数匹配
output_type: ["text","int64"] #输出对应的数据类型,需要与输出列数匹配
attributes: # 可选项 为用户自定义的备注信息
'model_type': 'dlinear'
'kernel_size': '25'
指定该文件夹作为加载路径就可以注册该模型:
IoTDB> create model dlinear_example using uri "file://./example"
也可以从 huggingFace 上下载对应的模型文件进行注册:
IoTDB> create model dlinear_example using uri "https://huggingface.com/IoTDBML/dlinear/"
SQL 执行后会异步进行注册的流程,可以通过模型展示查看模型的注册状态(见模型展示章节),注册成功的耗时主要受到模型文件大小的影响。
模型注册完成后,就可以通过使用正常查询的方式调用具体函数,进行模型推理。
(2)查看模型
注册成功的模型可以通过 show models 指令查询模型的具体信息。其 SQL 定义如下:
show models
show models <model_name>
除了直接展示所有模型的信息外,可以指定 model id 来查看某一具体模型的信息。模型展示的结果中包含如下信息:
其中,State 用于展示当前模型注册的状态,包含以下四个阶段:
LOADING:已经在 configNode 中添加对应的模型元信息,正将模型文件传输到 AINode 节点上
ACTIVE:模型已经设置完成,模型处于可用状态
DROPPING:模型删除中,正在从 configNode 以及 AINode 处删除模型相关信息
UNAVAILABLE: 模型创建失败,可以通过 drop model 删除创建失败的 model_name。
示例
IoTDB> show models
+---------------------+--------------------------+-----------+----------------------------+-----------------------+
| ModelId| ModelType| State| Configs| Notes|
+---------------------+--------------------------+-----------+----------------------------+-----------------------+
| dlinear_example| USER_DEFINED| ACTIVE| inputShape:[96,2]| |
| | | | outputShape:[48,2]| |
| | | | inputDataType:[float,float]| |
| | | |outputDataType:[float,float]| |
| _STLForecaster| BUILT_IN_FORECAST| ACTIVE| |Built-in model in IoTDB|
| _NaiveForecaster| BUILT_IN_FORECAST| ACTIVE| |Built-in model in IoTDB|
| _ARIMA| BUILT_IN_FORECAST| ACTIVE| |Built-in model in IoTDB|
|_ExponentialSmoothing| BUILT_IN_FORECAST| ACTIVE| |Built-in model in IoTDB|
| _GaussianHMM|BUILT_IN_ANOMALY_DETECTION| ACTIVE| |Built-in model in IoTDB|
| _GMMHMM|BUILT_IN_ANOMALY_DETECTION| ACTIVE| |Built-in model in IoTDB|
| _Stray|BUILT_IN_ANOMALY_DETECTION| ACTIVE| |Built-in model in IoTDB|
+---------------------+--------------------------+-----------+----------------------------+-----------------------+
我们前面已经注册了对应的模型,可以通过对应的指定查看模型状态,active 表明模型注册成功,可用于推理。
(3)删除模型
对于注册成功的模型,用户可以通过 SQL 进行删除。该操作除了删除 configNode 上的元信息外,还会删除所有 AINode 下的相关模型文件。其 SQL 如下:
drop model <model_name>
需要指定已经成功注册的模型 model_name 来删除对应的模型。由于模型删除涉及多个节点上的数据删除,操作不会立即完成,此时模型的状态为 DROPPING,该状态的模型不能用于模型推理。
(4)使用内置模型推理
SQL 语法如下:
call inference(<built_in_model_name>,sql[,<parameterName>=<parameterValue>])
内置模型推理无需注册流程,通过 call 关键字,调用 inference 函数就可以使用模型的推理功能,其对应的参数介绍如下:
built_in_model_name:内置模型名称
parameterName:参数名
parameterValue:参数值
内置模型及参数说明
目前已内置如下机器学习模型:
示例
下面是使用内置模型推理的一个操作示例,使用内置的 Stray 模型进行异常检测算法,输入为 [144,1],输出为 [144,1],我们通过 SQL 使用其进行推理。
IoTDB> select * from root.eg.airline
+-----------------------------+------------------+
| Time|root.eg.airline.s0|
+-----------------------------+------------------+
|1949-01-31T00:00:00.000+08:00| 224.0|
|1949-02-28T00:00:00.000+08:00| 118.0|
|1949-03-31T00:00:00.000+08:00| 132.0|
|1949-04-30T00:00:00.000+08:00| 129.0|
......
|1960-09-30T00:00:00.000+08:00| 508.0|
|1960-10-31T00:00:00.000+08:00| 461.0|
|1960-11-30T00:00:00.000+08:00| 390.0|
|1960-12-31T00:00:00.000+08:00| 432.0|
+-----------------------------+------------------+
Total line number = 144
IoTDB> call inference(_Stray, "select s0 from root.eg.airline", k=2)
+-------+
|output0|
+-------+
| 0|
| 0|
| 0|
| 0|
......
| 1|
| 1|
| 0|
| 0|
| 0|
| 0|
+-------+
Total line number = 144
(5)使用深度学习模型推理
SQL 语法如下:
call inference(<model_name>,sql[,window=<window_function>])
window_function:
head(window_size)
tail(window_size)
count(window_size,sliding_step)
在完成模型的注册后,通过 call 关键字,调用 inference 函数就可以使用模型的推理功能,其对应的参数介绍如下:
model_name:对应一个已经注册的模型
sql:sql 查询语句,查询的结果作为模型的输入进行模型推理。查询的结果中行列的维度需要与具体模型 config 中指定的大小相匹配。(这里的 sql 不建议使用 SELECT 子句,因为在 IoTDB 中, 并不会对列进行排序,因此列的顺序是未定义的,可以使用 SELECT s0,s1 的方式确保列的顺序符合模型输入的预期)
window_function:推理过程中可以使用的窗口函数,目前提供三种类型的窗口函数用于辅助模型推理:
head(window_size):获取数据中最前的 window_size 个点用于模型推理,该窗口可用于数据裁剪
tail(window_size):获取数据中最后的 window_size 个点用于模型推,该窗口可用于数据裁剪
count(window_size, sliding_step):基于点数的滑动窗口,每个窗口的数据会分别通过模型进行推理,如下图示例所示,window_size 为 2 的窗口函数将输入数据集分为三个窗口,每个窗口分别进行推理运算生成结果。该窗口可用于连续推理
说明 1:window 可以用来解决 sql 查询结果和模型的输入行数要求不一致时的问题,对行进行裁剪。需要注意的是,当列数不匹配或是行数直接少于模型需求时,推理无法进行,会返回错误信息。
说明 2:在深度学习应用中,经常将时间戳衍生特征(数据中的时间列)作为生成式任务的协变量,一同输入到模型中以提升模型的效果,但是在模型的输出结果中一般不包含时间列。为了保证实现的通用性,模型推理结果只对应模型的真实输出,如果模型不输出时间列,则结果中不会包含。
示例
下面是使用深度学习模型推理的一个操作示例,针对上面提到的输入为 [96,2],输出为 [48,2] 的 dlinear 预测模型,我们通过 SQL 使用其进行推理。
IoTDB> select s1,s2 from root.**
+-----------------------------+-------------------+-------------------+
| Time| root.eg.etth.s0| root.eg.etth.s1|
+-----------------------------+-------------------+-------------------+
|1990-01-01T00:00:00.000+08:00| 0.7855| 1.611|
|1990-01-02T00:00:00.000+08:00| 0.7818| 1.61|
|1990-01-03T00:00:00.000+08:00| 0.7867| 1.6293|
|1990-01-04T00:00:00.000+08:00| 0.786| 1.637|
|1990-01-05T00:00:00.000+08:00| 0.7849| 1.653|
|1990-01-06T00:00:00.000+08:00| 0.7866| 1.6537|
|1990-01-07T00:00:00.000+08:00| 0.7886| 1.662|
......
|1990-03-31T00:00:00.000+08:00| 0.7585| 1.678|
|1990-04-01T00:00:00.000+08:00| 0.7587| 1.6763|
|1990-04-02T00:00:00.000+08:00| 0.76| 1.6813|
|1990-04-03T00:00:00.000+08:00| 0.7669| 1.684|
|1990-04-04T00:00:00.000+08:00| 0.7645| 1.677|
|1990-04-05T00:00:00.000+08:00| 0.7625| 1.68|
|1990-04-06T00:00:00.000+08:00| 0.7617| 1.6917|
+-----------------------------+-------------------+-------------------+
Total line number = 96
IoTDB> call inference(dlinear_example,"select s0,s1 from root.**")
+--------------------------------------------+-----------------------------+
| _result_0| _result_1|
+--------------------------------------------+-----------------------------+
| 0.726302981376648| 1.6549958229064941|
| 0.7354921698570251| 1.6482787370681763|
| 0.7238251566886902| 1.6278168201446533|
......
| 0.7692174911499023| 1.654654049873352|
| 0.7685555815696716| 1.6625318765640259|
| 0.7856493592262268| 1.6508299350738525|
+--------------------------------------------+-----------------------------+
Total line number = 48
使用 tail/head 窗口函数的示例
当数据量不定且想要取 96 行最新数据用于推理时,可以使用对应的窗口函数 tail。head 函数的用法与其类似,不同点在于其取的是最早的 96 个点。
IoTDB> select s1,s2 from root.**
+-----------------------------+-------------------+-------------------+
| Time| root.eg.etth.s0| root.eg.etth.s1|
+-----------------------------+-------------------+-------------------+
|1988-01-01T00:00:00.000+08:00| 0.7355| 1.211|
......
|1990-01-01T00:00:00.000+08:00| 0.7855| 1.611|
|1990-01-02T00:00:00.000+08:00| 0.7818| 1.61|
|1990-01-03T00:00:00.000+08:00| 0.7867| 1.6293|
|1990-01-04T00:00:00.000+08:00| 0.786| 1.637|
|1990-01-05T00:00:00.000+08:00| 0.7849| 1.653|
|1990-01-06T00:00:00.000+08:00| 0.7866| 1.6537|
|1990-01-07T00:00:00.000+08:00| 0.7886| 1.662|
......
|1990-03-31T00:00:00.000+08:00| 0.7585| 1.678|
|1990-04-01T00:00:00.000+08:00| 0.7587| 1.6763|
|1990-04-02T00:00:00.000+08:00| 0.76| 1.6813|
|1990-04-03T00:00:00.000+08:00| 0.7669| 1.684|
|1990-04-04T00:00:00.000+08:00| 0.7645| 1.677|
|1990-04-05T00:00:00.000+08:00| 0.7625| 1.68|
|1990-04-06T00:00:00.000+08:00| 0.7617| 1.6917|
+-----------------------------+-------------------+-------------------+
Total line number = 996
IoTDB> call inference(dlinear_example,"select s0,s1 from root.**",window=tail(96))
+--------------------------------------------+-----------------------------+
| _result_0| _result_1|
+--------------------------------------------+-----------------------------+
| 0.726302981376648| 1.6549958229064941|
| 0.7354921698570251| 1.6482787370681763|
| 0.7238251566886902| 1.6278168201446533|
......
| 0.7692174911499023| 1.654654049873352|
| 0.7685555815696716| 1.6625318765640259|
| 0.7856493592262268| 1.6508299350738525|
+--------------------------------------------+-----------------------------+
Total line number = 48
使用 count 窗口函数的示例
该窗口主要用于计算式任务,当任务对应的模型一次只能处理固定行数据而最终想要的确实多组预测结果时,使用该窗口函数可以使用点数滑动窗口进行连续推理。假设我们现在有一个异常检测模型 anomaly_example(input: [24,2], output[1,1]),对每行数据会生成一个 0/1 的标签,其使用示例如下:
IoTDB> select s1,s2 from root.**
+-----------------------------+-------------------+-------------------+
| Time| root.eg.etth.s0| root.eg.etth.s1|
+-----------------------------+-------------------+-------------------+
|1990-01-01T00:00:00.000+08:00| 0.7855| 1.611|
|1990-01-02T00:00:00.000+08:00| 0.7818| 1.61|
|1990-01-03T00:00:00.000+08:00| 0.7867| 1.6293|
|1990-01-04T00:00:00.000+08:00| 0.786| 1.637|
|1990-01-05T00:00:00.000+08:00| 0.7849| 1.653|
|1990-01-06T00:00:00.000+08:00| 0.7866| 1.6537|
|1990-01-07T00:00:00.000+08:00| 0.7886| 1.662|
......
|1990-03-31T00:00:00.000+08:00| 0.7585| 1.678|
|1990-04-01T00:00:00.000+08:00| 0.7587| 1.6763|
|1990-04-02T00:00:00.000+08:00| 0.76| 1.6813|
|1990-04-03T00:00:00.000+08:00| 0.7669| 1.684|
|1990-04-04T00:00:00.000+08:00| 0.7645| 1.677|
|1990-04-05T00:00:00.000+08:00| 0.7625| 1.68|
|1990-04-06T00:00:00.000+08:00| 0.7617| 1.6917|
+-----------------------------+-------------------+-------------------+
Total line number = 96
IoTDB> call inference(anomaly_example,"select s0,s1 from root.**",window=count(24,24))
+-------------------------+
| _result_0|
+-------------------------+
| 0|
| 1|
| 1|
| 0|
+-------------------------+
Total line number = 4
其中结果集中的每行的标签对应 16 行输入对应的模型输出。
03 总结
本文梳理了 IoTDB 中 AINode 的基本概念,应用场景示例及使用教程,对于希望实现故障/异常预测业务场景智能化分析的工业用户,AINode 支持让时序数据与机器学习、模型分析领域的技术成果更好地结合,为用户提供更深入、多样的数据分析方法。
更多 AINode 相关功能信息,可点击用户手册:https://www.timecho.com/docs/zh/UserGuide/latest/User-Manual/AINode_timecho.html 进一步了解,欢迎联系我们获取更多信息!
更多内容推荐:
• 了解如何使用 IoTDB 企业版