本文介绍数据库内机器学习的流程,包括模型训练、模型推理和模型管理。
数据库内机器学习介绍
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;