SLS智能巡检最佳实践:针对有异常标签数据

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志服务 SLS 智能异常分析 APP 提供自动化、智能化模型训练能力,可以根据设定的历史数据区间进行监督建模。您可以使用模型训练任务通过监督的方式加强对自身数据的异常学习,来提升未来的异常预警的准确率,模型训练任务主要有以下优势:直接使用SLS的智能巡检功能,准确率不及预期,可以选择使用SLS的模型训练任务,来提升异常检测的准确性智能巡检检测出来的异常和您所认为的异常之间可能存在gap,这种情况

日志服务 SLS 智能异常分析 APP 提供自动化、智能化模型训练能力,可以根据设定的历史数据区间进行监督建模。您可以使用模型训练任务通过监督的方式加强对自身数据的异常学习,来提升未来的异常预警的准确率,模型训练任务主要有以下优势:

  1. 直接使用SLS的智能巡检功能,准确率不及预期,可以选择使用SLS的模型训练任务,来提升异常检测的准确性
  2. 智能巡检检测出来的异常和您所认为的异常之间可能存在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 -> 模型训练 -> 作业标识 进入创建的模型训练作业,查看作业的结果。

任务运行状态查看

作业会运行一段时间。可以通过查看作业详情中的时间线来指导任务目前运行的阶段。

任务信息包含两部分:

  1. 任务信息(总体任务的运行信息):  读取训练数据 -> 训练数据读取完成 -> 开始模型训练 -> 模型训练完成 -> 读取验证数据 -> 验证数据读取完成 -> 开始预测验证数据 -> 预测完成,生成报告 -> 开始保存模型 -> 保存模型完成 -> 保存模型完成 -> 任务完成,点击查看总时间
  2. 单个实体进展信息 : 开始特征工程 -> 特征工程完成 -> 开始模型训练 -> 模型训练完成 -> 开始训练预测 -> 训练预测完成" -> 开始验证预测 -> 验证预测完成 -> 生成报告中 -> 生成报告完成

任务信息:

通过点击实体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类型

该类型日志主要记录任务运行中的重要事件。

重要信息所在字段如下:

字段

字段含义

__tag__:__data_type__

标识日志类型

__tag__:__job_name__

标识模型训练作业的名称

__tag__:__schedule_id__

标识相同模型训练作业的名称的次数

meta.project_name

标识模型训练任务的数据所在project名称

meta.logstore_name

标识模型训练任务的数据所在logstore名称

resul.event_msg

标识任务该时刻的进度事件信息

result.occ_time

标识任务进度事件的时间戳

result.tips

标识事件的简介信息

detection_process类型

该类型日志主要记录监督模型的检测结果。

重要信息所在字段如下:

字段

字段含义

__tag__:__data_type__

标识日志类型

__tag__:__job_name__

标识模型训练作业的名称

__tag__:__schedule_id__

标识相同模型训练作业的名称的次数

__tag__:__model_name__

标识某个实体构建模型的ID(和上述实体ID一致),即一个实体对应一个

meta.project_name

标识模型训练任务的数据所在project名称

meta.logstore_name

标识模型训练任务的数据所在logstore名称

result.dim_name

标识该实体下某个维度名称

result.score

标识该实体下该点模型预测的异常分数

result.value

标识该实体下该点的实际大小

result.is_train_step

标识该实体下该点是否属于训练集

eval_report类型

该类型日志主要记录任务运行结束后的各实体验证集的结果报告。

重要信息所在字段如下:

字段

字段含义

__tag__:__data_type__

标识日志类型

__tag__:__job_name__

标识模型训练作业的名称

__tag__:__schedule_id__

标识相同模型训练作业的名称的次数

__tag__:__model_name__

标识某个实体构建模型的ID(和上述实体ID一致),即一个实体对应一个

entity

标识模型所在的实体信息(key:value组合)

meta.project_name

标识模型训练任务的数据所在project名称

meta.logstore_name

标识模型训练任务的数据所在logstore名称

result.evaluation_metrics.auc

标识该实体训练的监督模型计算验证集的auc值

result.evaluation_metrics.macro_f1

标识该实体训练的监督模型计算验证集的macro f1 score值

result.evaluation_metrics.precision

标识该实体训练的监督模型计算验证集的precision值

result.evaluation_metrics.recall

标识该实体训练的监督模型计算验证集的recall值

result.time_config.training_start_time

标识该实体下模型训练的开始时间(与算法配置中的起始时间一致,单位为s的时间戳)

result.time_config.training_stop_time

标识该实体下模型训练的结束时间(与算法配置中的模型训练集的结束时间一致,单位为s的时间戳)

result.time_config.validation_end_time

标识该实体下模型验证的结束时间(与算法配置中的结束时间一致,单位为s的时间戳)

result.time_config.predict_time

标识该实体下模型验证的时间(单位为s)

result.time_config.train_time

标识该实体下模型训练的时间(单位为s)

result.statistic.train_data_meta.train_anomaly_num

标识该实体下训练集的异常点个数

result.statistic.train_data_meta.train_data_length

标识该实体下训练集的长度

result.statistic.evaluation_data_meta.evaluation_anomaly_num

标识该实体下验证集的异常点个数

result.statistic.evaluation_data_meta.evaluation_data_length

标识该实体下验证集的长度

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
13天前
|
测试技术 开发工具 git
写了BUG还想跑——闲鱼异常日志问题自动追踪-定位-分发机制
为了高效地发现、定位和解决预发问题,闲鱼团队研发了一套异常日志问题自动追踪-定位-分发机制。这套机制通过自动化手段,实现了异常日志的定时扫描、精准定位和自动分发,显著降低了开发和测试的成本,提高了问题解决的效率。
写了BUG还想跑——闲鱼异常日志问题自动追踪-定位-分发机制
|
28天前
|
存储 Oracle 关系型数据库
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
本文介绍了MySQL InnoDB存储引擎中的数据文件和重做日志文件。数据文件包括`.ibd`和`ibdata`文件,用于存放InnoDB数据和索引。重做日志文件(redo log)确保数据的可靠性和事务的持久性,其大小和路径可由相关参数配置。文章还提供了视频讲解和示例代码。
132 11
【赵渝强老师】MySQL InnoDB的数据文件与重做日志文件
|
2月前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
39 2
|
2月前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
56 1
|
28天前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle的联机重做日志文件与数据写入过程
在Oracle数据库中,联机重做日志文件记录了数据库的变化,用于实例恢复。每个数据库有多组联机重做日志,每组建议至少有两个成员。通过SQL语句可查看日志文件信息。视频讲解和示意图进一步解释了这一过程。
|
2月前
|
数据采集 机器学习/深度学习 存储
使用 Python 清洗日志数据
使用 Python 清洗日志数据
41 2
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
49 2
|
3月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
3月前
|
开发者 Python
基于Python的日志管理与最佳实践
日志是开发和调试过程中的重要工具,然而,如何高效地管理和利用日志常常被忽略。本文通过Python中的logging模块,探讨如何使用日志来进行调试、分析与问题排查,并提出了一些实际应用中的优化建议和最佳实践。
|
3月前
|
JSON 缓存 fastjson
一行日志引发的系统异常
本文记录了一行日志引发的系统异常以及作者解决问题的思路。