本文介紹資料庫內機器學習的流程,包括模型訓練、模型推理和模型管理。
資料庫內機器學習介紹
Lindorm時序引擎支援開箱即用的資料庫內機器學習服務(Lindorm ML),資料庫內機器學習的流程主要包括:模型訓練、模型推理和模型管理。開通資料庫內機器學習服務之後可以直接通過SQL語句在資料庫內完成機器學習流程,協助您挖掘資料價值。資料庫內機器學習服務主要有以下優勢:
- 簡單易用:無需專業的機器學習知識,只需要使用標準的SQL就能完成資料庫內機器學習的整個流程。
- 無資料移動:無需將資料匯出到外部平台,提高效率,更好應對監管需求。
- 企業級特性支援:模型和資料都儲存在資料庫內,享受資料庫成熟的企業級特性,包括許可權管理、審計、加密等操作。
模型訓練
Lindorm ML在模型訓練時需要指定模型解決的機器學習任務類型,對不同的任務類型,Lindorm ML提供了不同的演算法列表。您可以使用擴充的CREATE MODEL語句在資料庫中完成模型訓練。
文法
CREATE MODEL model_name
FROM { table_name | (select_statement) }
[ TARGET column_name ]
TASK ( TIME_SERIES_FORECAST | TIME_SERIES_ANOMALY_DETECTION )
ALGORITHM ( DEEPAR | TFT | esd | nsigma | ttest )
[ PREPROCESSORS 'string' ]
SETTINGS (
EPOCHS integer,
...
)參數說明
- model_name:模型名稱。Schema內是唯一的。
- FROM { table_name | (select_statement) }:包含訓練資料的表名或查詢語句,查詢語句的結果至少包含2個列,其中1列需為時間列。
- TARGET column_name:用於指定時序預測或時序異常檢測的目標列。
- TASK:指定模型解決的任務類型。目前Lindorm ML支援的任務類型如下表所示:
任務類型 關鍵字 時序預測 TIME_SERIES_FORECAST 時序異常檢測 TIME_SERIES_ANOMALY_DETECTION - ALGORITHM:指定模型使用的演算法。目前Lindorm ML支援的演算法如下表所示:
任務類型 演算法 說明 時序預測 DeepAR DeepAR演算法是基於RNN的深度神經網路演算法。詳細資料,請參見DeepAR論文。 TFT Temporal Fusion Transformer演算法是基於Transformer機制的深度神經網路演算法,詳細資料,請參見TFT論文。 時序異常檢測 esd 達摩院自研演算法,適用於尖刺型異常(例如監控曲線出現尖刺的現象),對於資料點中有少量顯著離群點的情況,檢測結果準確。詳細資料,請參見時序異常檢測。 nsigma 達摩院自研演算法,原理簡單,便於分析異常原因。詳細資料,請參見時序異常檢測。 ttest 達摩院自研演算法,適用於識別一個時間視窗內時序指標是否存在因均值變化而發生的異常。詳細資料,請參見時序異常檢測。 - PREPROCESSORS 'string':選擇性參數。用於指定某些列的預先處理操作,通常使用JSON表示的字串定義。
PREPROCESSORS參數包括要處理的列集合Columns和要進行的預先處理巨集指令清單Transformers。其中Transformers參數構成一個管道,會按照指定的順序執行。每一個Transformers都包含預先處理操作名稱Name和參數Parameters。範例程式碼如下:
PREPROCESSORS '[ { "Columns":[ "c1" ], "Transformers":[ { "Name": "Imputer", "Parameters": {"value": 0} }, { "Name": "StandardScaler" } ] }, { "Columns":[ "c2", "c3" ], "Transformers":[ { "Name": "OrdinalEncoder" } ] } ]'說明 其中,處理的列集合Columns參數和預先處理操作包含的Parameters參數都為選擇性參數。在模型訓練時指定的預先處理操作會被自動應用到模型推理的過程中。目前Lindorm ML支援的預先處理操作如下表所示:
預先處理操作 參數 說明 OneHotEncoder 無 使用二進位對類別特徵進行編碼,適用於沒有大小關係的類別特徵。 OrdinalEncoder 無 將類別特徵編碼從0開始的整數,適用於有大小關係的類別特徵。 Imputer - method:字串。取值為dummy、mean、median、most_frequent、roll7、last,預設為dummy。
- value:整型。選擇性參數,預設為0。
對缺失值進行插值,可選多種策略。 StandardScaler 無 將資料轉換成標準常態分佈(均值為0,標準差為1),也叫z-score標準化。 MinMaxScaler - min:整型。
- max:整型。選擇性參數。
將資料範圍縮放至(min,max)區間,預設縮放至(0,1)。 LogTransformer 無 將資料轉換成log對數值。 - SETTINGS:指定其他相關參數。不同的任務類型可以指定不同的參數,支援的參數如下:
時序預測相關參數
參數名 參數類型 說明 是否必填 epochs INTEGER 訓練epochs的個數,只適用於時序預測。預設為80。 是 time_column VARCHAR 時間列。 是 group_columns VARCHAR 分組列。即決定時間軸的TAG列。 是 freq VARCHAR 時序資料的頻率。例如“1D”。 是 prediction_length INTEGER 預測步長。 是 feat_static_columns VARCHAR 靜態特徵列(TAG)的集合,以英文逗號(,)分隔。 否 時序異常檢測相關參數
時序異常檢測支援的訓練參數,請參見時序異常檢測中的訓練參數。
樣本
CREATE MODEL tft_model
FROM (SELECT * FROM fresh_sales WHERE `time` > '2021-02-08T00:00:00+08:00')
TARGET sales
TASK time_series_forecast
ALGORITHM tft
SETTINGS
(
time_column 'time',
group_columns 'id_code',
feat_static_columns 'cate1_id,cate2_id,brand_id',
context_length '28',
prediction_length '6',
epochs '5',
freq '1D'
);模型管理
在CREATE MODEL語句執行成功後,您需要通過模型管理相關SQL語句查看模型的狀態是否Ready。
查看資料庫中所有模型的資訊
使用SHOW MODELS語句查看資料庫中所有模型的基本資料。
樣本如下:
SHOW MODELS;返回結果:
+-------------------+--------+--------------------+-------------------------------+-------------------------------+
| name | status | sql_function | created_time | update_time |
+-------------------+--------+--------------------+-------------------------------+-------------------------------+
| tft_model | Ready | forecast | 2022-11-04T11:38:05.873+08:00 | 2022-11-04T11:39:14.046+08:00 |
+-------------------+--------+--------------------+-------------------------------+-------------------------------+
1 rows in set (524 ms)傳回值說明如下表所示:
| 傳回值 | 說明 |
| name | 模型名稱。 |
| status | 模型狀態。包括Init(初始化)、Training(訓練中)、Ready(就緒)、Failed(失敗)。 |
| sql_function | 推理函數。 |
| created_time | 模型建立時間。 |
| update_time | 模型更新時間。 |
查看指定模型的資訊
使用SHOW MODEL model_name查看指定模型的詳細資料。
樣本如下:
SHOW MODEL tft_model;返回結果:
+-----------+--------+--------------+----------------------+-----------+------------------------------------+---------------+-------------------------------------------------+--------------------------------+-------------------------------+-------------------------------+
| name | status | sql_function | task_type | algorithm | query | preprocessors | settings | metrics | created_time | update_time |
+-----------+--------+--------------+----------------------+-----------+------------------------------------+---------------+-------------------------------------------------+--------------------------------+-------------------------------+-------------------------------+
| tft_model | Ready | forecast | TIME_SERIES_FORECAST | TFT | SELECT `time`, FIRST(`sales`) AS | [] | {time_column=time, group_columns=id_code, | {MAPE=0.35002756118774414, | 2022-11-04T11:38:05.873+08:00 | 2022-11-04T11:39:14.046+08:00 |
| | | | | | `sales`, `id_code`, `cate1_id`, | | feat_static_columns=cate1_id,cate2_id,brand_id, | MASE=0.41281554008773325, | | |
| | | | | | `cate2_id`, `brand_id` FROM | | context_length=28, prediction_length=6, | MSE=456.3769938151042} | | |
| | | | | | `fresh_sales` WHERE `time` > | | epochs=5, freq=1D,train_mode=LOCAL, | | | |
| | | | | | '2021-02-08T00:00:00+08:00' | | past_length=28, | | | |
| | | | | | sample by 1D fill zero | | forecast_start=2022-07-31 08:00:00} | | | |
+-----------+--------+--------------+----------------------+-----------+------------------------------------+---------------+-------------------------------------------------+--------------------------------+-------------------------------+-------------------------------+
1 rows in set (334 ms)傳回值說明如下表所示:
| 傳回值 | 說明 |
| task_type | 任務類型。 |
| algorithm | 演算法名稱。 |
| query | 訓練使用的查詢語句。 |
| preprocessors | 預先處理文法。 |
| settings | 參數設定。 |
| metrics | 模型指標。 |
刪除指定模型
使用DROP MODEL model_name語句刪除指定模型。
樣本如下:
DROP MODEL tft_model;返回結果:
No rows affected (0.397 seconds)模型推理
模型狀態為Ready時,您可以使用系統函數進行推理,不同的任務類型使用不同的系統函數。
文法
SELECT function_name(field_name, model_name, params) FROM table_name [WHERE clause] SAMPLE BY 0;樣本
SELECT device_id, region, `time`, raw(temperature) as temperature, anomaly_detect(temperature, ad_model) as detect_result from sensor WHERE time >= '2022-01-01 00:00:00' and time < '2022-01-01 00:01:00' SAMPLE BY 0;