日志服务 SLS 智能异常分析 APP 提供自动化、智能化模型训练能力,可以根据设定的历史数据区间进行监督建模。您可以使用模型训练任务通过监督的方式加强对自身数据的异常学习,来提升未来的异常预警的准确率,模型训练任务主要有以下优势:
-
直接使用SLS的智能巡检功能,准确率不及预期,可以选择使用SLS的模型训练任务,来提升异常检测的准确性
-
智能巡检检测出来的异常和您所认为的异常之间可能存在gap,这种情况也建议您通过有监督的模型训练任务来自适应的检测所需要的异常类型。
模型训练解决方案
-
在图中第一部分描述的是我们模型训练服务部署环境中所需要的数据,包含了:带异常标签的指标数据以及不带标签的指标数据两部分,这些数据统一存储在SLS平台中,通过SQL查询来获取,对于带异常标签的指标数据直接进入算法服务,对于不带标签的指标数据通过模拟异常注入的方式,获得异常标签后进入算法服务。
-
第二部分为算法服务部分,这部分会在后一节详细说明,主要包含特征工程和监督模型两部分,这里的算法服务是每一个单独的实体训练一个模型。
-
第三部分为结果保存和可视化,在模型训练服务完成之后,会把所训练的模型进行云端的保存,且数据集的验证结果、任务运行的事件等以日志的形式保存到logstore:internal-ml-log中,且通过任务详情可以查看结果的可视化结果。
-
最后一个部分为创建预测任务(具体可以看:智能巡检最佳实践:创建预测任务)
-
模型训练任务完成,我们可以得到该任务中每个实体所训练的模型 (模型保存在我们内部,后续会逐步放开使用,注意:一个实体对应于一个模型,并用实体ID进行标识) ,我们可以通过选择 实体ID ,创建预测任务(即SLS智能巡检任务,具体可以查看SLS智能巡检最佳实践),通过智能巡检任务对未来的指标数据做实时的异常检测,我们还可以通过SLS打标工具,对结果进行打标,得到更多的标签数据,反复训练模型,提升准确率。
-
注意: 模型目前保存在我们内部,后续会放开使用(例如API调用)
-
注意: 一个实体对应于一个模型,并用唯一的实体ID进行标识,即一个模型为一个单独的实体数据训练得到的
-
注意:在预测任务创建时,所选开始时间默认为配置的结束时间,目前不可更改,后续会开放
算法服务简介
-
在图中一共分为三个部分,构建数据集、特征工程以及集成模型。
-
第一部分,通过选择时间,来构建自己的数据集,分为训练集和验证集, 这里需要注意的是: 训练集的时间长度要大于12天,验证集要大于3天,前者是因为我们需要历史一周的数据来做为特征工程的前提条件,后者是因为为了能给好的说明模型的拟合程度和鲁棒性,需要三天的数据给出验证报告,可以直观的说明训练模型的表现水平。
-
第二部为特征工程部分,特征工程包括:同环比特征、平移特征、趋势特征、窗口特征、时间特征等 ( 特征工程的选择后续会开放选择 ) 。
-
第三部分为模型的构建,这部分模型主要通过多个树模型的集成来构建最终的模型。
流程概述
对于模型训练主要包含三个章节:针对有标签数据的配置、针对无标签数据的配置以及后续预测任务的配置。
本文主要讲解有标签数据的配置
模型训练作业与其他智能异常分析作业运行过程类似,包括数据读取、数据处理和输出结果三个步骤,并且以设定的起始和结束时间作为数据集进行训练,完成会对验证集做检测生成对应的验证报告。
-
数据读取:支持使用 SQL 查询的方式从 SLS 源 Logstore、MetricStore 获取指标数据,数据源包含标签数据( 标签格式:int类型,且数值为1代表异常,0代表非异常 ),可以使用 SQL 同时获取多条指标序列,模型训练任务针对每一个实体训练一个模型。
-
数据处理:模型训练算法。
-
输出结果:模型训练结果会全部写入到智能异常分析专用的 Logstore:internal-ml-log 里面。您可以通过任务详情仪表盘中查看模型训练任务的结果,包含训练的详情(训练集、验证集的数据详情以及设定的时间详情)以及结果指标的展示(AUC值、Precision、Recall、F1 score)
数据样例
下面我们将以模拟数据ts_with_label来进行模型训练任务的创建。日志样例如下:
label:0
name:line@1681783162192026000
time:1681787580
x0:-741.6821767647078
-
label为异常标签,1代表这个时间点的数据异常,0代表正常
-
name为对应的实体字段,代表有多少条线
-
time为时间戳(s)
-
x0为对应线和时间戳的点值
算法任务配置
数据源配置
和智能巡检任务类似:
填写任务名以及数据所在project、logstore以及logstore的类型(日志库或者时序库)
数据特征配置
在数据特征配置阶段,我们会看到两个模式(数据特征配置和异常注入模式),在这里我们选择数据特征配置,接下来需要配置获取数据的 SQL 语句,然后配置时间、数据的粒度、标签名、实体和特征字段以便从 SQL 的返回结果中获取训练数据。如下图所示
我们通过图示中的 SQL 语句获取了每个实体每分钟的值,注意在 SQL 语句后面添加 limit 子结构,不加可能会造成数据采集的不全面。
每条指标序列表示某个实体的某个特征的值随时间变化的带标签的序列,我们通过对于下方时间、粒度、标签名、实体和特征字段的配置实现对于带标签指标序列的获取。其中时间字段表示了指标序列的时间取值,上例中由 time 字段表示,粒度为每个实体序列的时间间隔,标签为标记异常的标签,其中1代表异常,0代表非异常。在模型训练任务中,我们针对每个实体训练一个模型。
PS:获取数据为每一个小时拉取
算法配置
算法配置中算法选择是默认的监督异常检测算法(后续会开放高级参数),主要配置调度方面,包含起始时间、结束时间、模型的训练集的结束时间,三种时间配置如下:
其中调度配置中的起始时间、结束时间、模型的训练集的结束时间,如下图所示的关系:
-
算法配置:默认监督异常检测算法
-
调度配置:起始时间也是训练集开始时间、训练集结束时间也是验证集的开始时间、结束时间也是验证集的结束时间,大小关系如图所示。
点击完成,则模型训练任务创建成功
结果说明
在模型训练任务创建完成后,我们可以通过 智能异常分析 APP -> 模型训练 -> 作业标识 进入创建的模型训练作业,查看作业的结果。
任务运行状态查看
作业会运行一段时间。可以通过查看作业详情中的时间线来指导任务目前运行的阶段。
任务信息包含两部分:
-
任务信息(总体任务的运行信息): 读取训练数据 -> 训练数据读取完成 -> 开始模型训练 -> 模型训练完成 -> 读取验证数据 -> 验证数据读取完成 -> 开始预测验证数据 -> 预测完成,生成报告 -> 开始保存模型 -> 保存模型完成 -> 保存模型完成 -> 任务完成,点击查看总时间
-
单个实体进展信息 : 开始特征工程 -> 特征工程完成 -> 开始模型训练 -> 模型训练完成 -> 开始训练预测 -> 训练预测完成" -> 开始验证预测 -> 验证预测完成 -> 生成报告中 -> 生成报告完成
任务信息:
通过点击实体ID的高级配置中的查看该实体的任务详情:
模型训练作业详情会显示如下:
可以查看点击实体的进展信息,以及时间配置、验证集评价指标,数据统计值等。在这个过程中可以通过切换实体ID,来快速查看每个实体的监督模型训练的效果。
其中的验证集评价指标说明:
-
precesion:还称之为精确率,计算公式:精确率 = 模型检测为异常的时间点样本中实际也为异常的样本数量/被检测为异常的样本数量
-
recall:还称之为召回率,计算公式: 召回率 = 实际为异常的样本中被模型检测为异常的样本数量/实际为异常的样本数量
-
auc: AUC值为假阳性率和真阳性率为轴的曲线下面的面积大小
-
假阳性率 = 实际为正常的样本中被模型检测为异常的样本数量/实际为正常的样本数量
-
真阳性率 = 实际为异常的样本中被模型检测为异常的样本数量/实际为异常的样本数量(和recall一致)
-
macro_f1: 精确率和召回率的调和平均值 F1 = 2 * (precision * recall) / (precision + recall)(这里采用Macro Average宏平均的方式,具体是指在计算均值时使每个类别具有相同的权重,最后结果是每个类别的指标的算术平均值)
在进展信息下方,可以查看可视化(可视化线图可以通过鼠标拖动来查看更为精细的曲线状态)以及异常事件列表。
在可视化方面,蓝色代表训练集部分,而红色代表验证集部分,其中标签为红色的数值为1的竖线为异常点的标志,与红色竖线重叠的绿色为该点预测的异常分数,在图示中,我们可以通过以下字段来更方便的分析
-
train_value 训练集时间序列点大小
-
train_label 训练集异常标签
-
train_score 训练集预测异常分数
-
train_point_value 训练集点大于阈值的时间点
-
val_value 验证集时间序列点大小
-
val_label 验证集异常标签
-
val_score 验证集预测异常分数
-
val_point_value 验证集点大于阈值的时间点
如果不设置,默认为点大于0.5的点标为红色:
在详情上侧可以设置阈值:
任务运行日志
所有的模型训练的结果都写入到对应的 project 中的 internal-ml-log 这个 Logstore 中,您可以通过 SQL 语句进行相应的查询,通过__tag__:__job_name__和__tag__:__schedule_id__来获取对应任务的日志数据,时间范围可以通过时间戳固定,如下图所示
其中的job_name、schedule_id以及时间范围的时间戳都是可以从任务详情中获取
其中日志的类型(__tag__:__data_type__)分为三类:job_statistic、detection_process、eval_report
job_statistic类型
该类型日志主要记录任务运行中的重要事件。
重要信息所在字段如下:
detection_process类型
该类型日志主要记录监督模型的检测结果。
重要信息所在字段如下:
eval_report类型
该类型日志主要记录任务运行结束后的各实体验证集的结果报告。
重要信息所在字段如下: