AINode
AINode
AINode 是支持時序相關模型注冊、管理、調用的 IoTDB 原生節點,內置業界領先的自研時序大模型,如清華自研時序模型 Timer 系列,可通過標準 SQL 語句進行調用,實現時序數據的毫秒級實時推理,可支持時序趨勢預測、缺失值填補、異常值檢測等應用場景。
系統架構如下圖所示:

三種節點的職責如下:
- ConfigNode:負責保存和管理模型的元信息;負責分布式節點管理。
- DataNode:負責接收并解析用戶的 SQL請求;負責存儲時間序列數據;負責數據的預處理計算。
- AINode:負責模型文件的導入創建以及模型推理。
1. 優勢特點
與單獨構建機器學習服務相比,具有以下優勢:
簡單易用:無需使用 Python 或 Java 編程,使用 SQL 語句即可完成機器學習模型管理與推理的完整流程。如創建模型可使用CREATE MODEL語句、使用模型進行推理可使用CALL INFERENCE(...)語句等,使用更加簡單便捷。
避免數據遷移:使用 IoTDB 原生機器學習可以將存儲在 IoTDB 中的數據直接應用于機器學習模型的推理,無需將數據移動到單獨的機器學習服務平臺,從而加速數據處理、提高安全性并降低成本。

- 內置先進算法:支持業內領先機器學習分析算法,覆蓋典型時序分析任務,為時序數據庫賦能原生數據分析能力。如:
- 時間序列預測(Time Series Forecasting):從過去時間序列中學習變化模式;從而根據給定過去時間的觀測值,輸出未來序列最可能的預測。
- 時序異常檢測(Anomaly Detection for Time Series):在給定的時間序列數據中檢測和識別異常值,幫助發現時間序列中的異常行為。
- 時間序列標注(Time Series Annotation):為每個數據點或特定時間段添加額外的信息或標記,例如事件發生、異常點、趨勢變化等,以便更好地理解和分析數據。
2. 基本概念
- 模型(Model):機器學習模型,以時序數據作為輸入,輸出分析任務的結果或決策。模型是AINode 的基本管理單元,支持模型的增(注冊)、刪、查、用(推理)。
- 創建(Create): 將外部設計或訓練好的模型文件或算法加載到MLNode中,由IoTDB統一管理與使用。
- 推理(Inference):使用創建的模型在指定時序數據上完成該模型適用的時序分析任務的過程。
- 內置能力(Built-in):AINode 自帶常見時序分析場景(例如預測與異常檢測)的機器學習算法或自研模型。

3. 安裝部署
AINode 的部署可參考文檔 部署指導 章節。
4. 使用指導
AINode 對時序數據相關的深度學習模型提供了模型創建及刪除的流程,內置模型無需創建及刪除,可直接使用,并且在完成推理后創建的內置模型實例將自動銷毀。
4.1 注冊模型
通過指定模型輸入輸出的向量維度,可以注冊訓練好的深度學習模型,從而用于模型推理。
符合以下內容的模型可以注冊到AINode中:
- AINode 支持的PyTorch 2.1.0、 2.2.0版本訓練的模型,需避免使用2.2.0版本以上的特性。
- AINode支持使用PyTorch JIT存儲的模型,模型文件需要包含模型的參數和結構。
- 模型輸入序列可以包含一列或多列,若有多列,需要和模型能力、模型配置文件對應。
- 模型的輸入輸出維度必須在
config.yaml配置文件中明確定義。使用模型時,必須嚴格按照config.yaml配置文件中定義的輸入輸出維度。如果輸入輸出列數不匹配配置文件,將會導致錯誤。
下方為模型注冊的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元數據描述文件:模型注冊時需要提供的與模型結構有關的參數,其中必須包含模型的輸入輸出維度用于模型推理:
參數名 參數描述 示例 input_shape 模型輸入的行列,用于模型推理 [96,2] output_shape 模型輸出的行列,用于模型推理 [48,2] ? 除了模型推理外,還可以指定模型輸入輸出的數據類型:
參數名 參數描述 示例 input_type 模型輸入的數據類型 ['float32','float32'] output_type 模型輸出的數據類型 ['float32','float32'] ? 除此之外,可以額外指定備注信息用于在模型管理時進行展示
參數名 參數描述 示例 attributes 可選,用戶自行設定的模型備注信息,用于模型展示 'model_type': 'dlinear','kernel_size': '25'
除了本地模型文件的注冊,還可以通過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執行后會異步進行注冊的流程,可以通過模型展示查看模型的注冊狀態(見模型展示章節),注冊成功的耗時主要受到模型文件大小的影響。
模型注冊完成后,就可以通過使用正常查詢的方式調用具體函數,進行模型推理。
4.2 查看模型
注冊成功的模型可以通過show models指令查詢模型的具體信息。其SQL定義如下:
show models
show models <model_name>除了直接展示所有模型的信息外,可以指定model id來查看某一具體模型的信息。模型展示的結果中包含如下信息:
| ModelId | State | Configs | Attributes |
|---|---|---|---|
| 模型唯一標識 | 模型注冊狀態(LOADING,ACTIVE,DROPPING) | InputShape, outputShapeInputTypes, outputTypes | 模型備注信息 |
其中,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表明模型注冊成功,可用于推理。
4.3 刪除模型
對于注冊成功的模型,用戶可以通過SQL進行刪除。該操作除了刪除configNode上的元信息外,還會刪除所有AINode下的相關模型文件。其SQL如下:
drop model <model_name>需要指定已經成功注冊的模型model_name來刪除對應的模型。由于模型刪除涉及多個節點上的數據刪除,操作不會立即完成,此時模型的狀態為DROPPING,該狀態的模型不能用于模型推理。
4.4 使用內置模型推理
SQL語法如下:
call inference(<built_in_model_name>,sql[,<parameterName>=<parameterValue>])內置模型推理無需注冊流程,通過call關鍵字,調用inference函數就可以使用模型的推理功能,其對應的參數介紹如下:
- built_in_model_name: 內置模型名稱
- parameterName:參數名
- parameterValue:參數值
內置模型及參數說明
目前已內置如下機器學習模型,具體參數說明請參考以下鏈接。
| 模型 | built_in_model_name | 任務類型 | 參數說明 |
|---|---|---|---|
| Arima | _Arima | 預測 | Arima參數說明 |
| STLForecaster | _STLForecaster | 預測 | STLForecaster參數說明 |
| NaiveForecaster | _NaiveForecaster | 預測 | NaiveForecaster參數說明 |
| ExponentialSmoothing | _ExponentialSmoothing | 預測 | ExponentialSmoothing參數說明 |
| GaussianHMM | _GaussianHMM | 標注 | GaussianHMM參數說明 |
| GMMHMM | _GMMHMM | 標注 | GMMHMM參數說明 |
| Stray | _Stray | 異常檢測 | Stray參數說明 |
示例
下面是使用內置模型推理的一個操作示例,使用內置的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 = 1444.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]),對每24行數據會生成一個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其中結果集中每行的標簽對應每24行數據為一組,輸入該異常檢測模型后的輸出。
4.6 時序大模型導入步驟
AINode 目前支持多種時序大模型,部署使用請參考時序大模型
5. 權限管理
使用AINode相關的功能時,可以使用IoTDB本身的鑒權去做一個權限管理,用戶只有在具備 USE_MODEL 權限時,才可以使用模型管理的相關功能。當使用推理功能時,用戶需要有訪問輸入模型的SQL對應的源序列的權限。
| 權限名稱 | 權限范圍 | 管理員用戶(默認ROOT) | 普通用戶 | 路徑相關 |
|---|---|---|---|---|
| USE_MODEL | create model / show models / drop model | √ | √ | x |
| READ_DATA | call inference | √ | √ | √ |
6. 實際案例
6.1 電力負載預測
在部分工業場景下,會存在預測電力負載的需求,預測結果可用于優化電力供應、節約能源和資源、支持規劃和擴展以及增強電力系統的可靠性。
我們所使用的 ETTh1 的測試集的數據為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/tree/main'該模型基于較為輕量化的深度模型DLinear訓練而得,能夠以相對快的推理速度盡可能多地捕捉到序列內部的變化趨勢和變量間的數據變化關系,相較于其他更深的模型更適用于快速實時預測。
步驟三:模型推理
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天)的油溫這一數據的可能變化進行了建模,可以看到可視化后預測曲線與實際結果在趨勢上保持了較高程度的一致性。
6.2 功率預測
變電站需要對電流、電壓、功率等數據進行電力監控,用于檢測潛在的電網問題、識別電力系統中的故障、有效管理電網負載以及分析電力系統的性能和趨勢等。
我們利用某變電站中的電流、電壓和功率等數據構成了真實場景下的數據集。該數據集包括變電站近四個月時間跨度,每5 - 6s 采集一次的 A相電壓、B相電壓、C相電壓等數據。
測試集數據內容為data。
在該數據集上,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 中選擇內置模型或已經注冊好的模型用于后續的推理。
我們采用內置模型STLForecaster進行預測,STLForecaster 是一個基于 statsmodels 庫中 STL 實現的時間序列預測方法。
步驟三:模型推理
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(_STLForecaster, "select s0,s1,s2 from root.eg.voltage", window=head(96),predict_length=48)
+---------+---------+---------+
| output0| output1| output2|
+---------+---------+---------+
|2026.3601|2018.2953|2029.4257|
|2019.1538|2011.4361|2022.0888|
|2025.5074|2017.4522|2028.5199|
......
|2022.2336|2015.0290|2025.1023|
|2015.7241|2008.8975|2018.5085|
|2022.0777|2014.9136|2024.9396|
|2015.5682|2008.7821|2018.3458|
+---------+---------+---------+
Total line number = 48我們將對C相電壓的預測的結果和真實結果進行對比,可以得到以下的圖像。
圖中 02/14 20:48 之前的數據為輸入模型的過去數據, 02/14 20:48 后的藍色線條為模型給出的C相電壓預測結果,而紅色為數據集中實際的C相電壓數據(用于進行對比)。

可以看到,我們使用了過去10分鐘的電壓的數據,基于之前學習到的序列間相互關系對未來5分鐘的C相電壓這一數據的可能變化進行了建模,可以看到可視化后預測曲線與實際結果在趨勢上保持了一定的同步性。
6.3 異常檢測
在民航交通運輸業,存在著對乘機旅客數量進行異常檢測的需求。異常檢測的結果可用于指導調整航班的調度,以使得企業獲得更大效益。
Airline Passengers一個時間序列數據集,該數據集記錄了1949年至1960年期間國際航空乘客數量,間隔一個月進行一次采樣。該數據集共含一條時間序列。數據集為airline。
在該數據集上,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模型對輸入序列變化進行了建模,成功檢測出出現異常的時間點。