十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

TDengine 时序数据异常检测实战:ANOMALY_WINDOW 窗口语法、内置算法与最佳实践

TDengine 时序数据异常检测实战:ANOMALY_WINDOW 窗口语法、内置算法与最佳实践 TDengine 时序数据异常检测实战ANOMALY_WINDOW 窗口语法、内置算法与最佳实践【免费下载链接】tdengineTDengine is an open source, high-performance, cloud native time-series database optimized for Internet of Things (IoT), Connected Cars, Industrial IoT and DevOps.项目地址: https://gitcode.com/taosdata/tdengine时序数据中的异常点往往隐藏着设备故障、攻击行为或业务突变等关键信号。TDengine 在高级分析TDgpt体系中内置了时序数据异常检测服务通过一种特殊的窗口——异常窗口ANOMALY_WINDOW——将算法识别出的连续异常区间暴露给 SQL 查询层用户可以直接使用标准聚合、变换与窗口伪列对异常片段进行二次加工。本文以 异常检测文档 为主线完整讲解ANOMALY_WINDOW的语法、参数、伪列语义逐类梳理内置的统计学、数据密度与机器学习异常检测算法并给出运行环境部署、Anode 注册与模型评估工具的实战指引。读完本文你将能够在 TDengine 中独立编写异常检测查询并根据数据分布特征为不同场景选择合适算法。上图展示了 Anode 对一段时序数据执行异常检测后返回的异常窗口[10:51:30, 10:53:40]窗口内即为算法判定为异常的时间范围可以在此基础上进行查询聚合、变换处理等操作。异常窗口由算法决定边界的事件窗口TDengine 中定义了异常状态窗口来提供异常检测服务。异常窗口可以视为一种特殊的事件窗口Event Window即异常检测算法确定的连续异常时间序列数据所在的时间窗口。与普通事件窗口的关键区别在于异常窗口的起始时间和结束时间均由分析算法识别确定不通过用户给定的表达式进行判定。因此在查询的窗口子句中使用ANOMALY_WINDOW即可调用时序数据异常检测服务。同时窗口伪列_WSTART、_WEND、_WDURATION也能够像其他时间窗口一样用于描述异常窗口伪列含义_WSTART异常窗口的起始时间_WEND异常窗口的结束时间_WDURATION异常窗口的持续时间例如使用异常检测算法 IQR 对输入列col_val进行异常检测同时输出异常窗口的起始时间、结束时间以及异常窗口内col列的和SELECT _wstart, _wend, SUM(col) FROM foo ANOMALY_WINDOW(col_val, algoiqr);ANOMALY_WINDOW作为窗口子句的关键字自v3.3.4.3起可用见 关键字附录。语法与参数详解语法定义ANOMALY_WINDOW(column_expr [, column_expr ...] [, option_expr]) option_expr: { algoexpr1 [,wncheck1|0] [,expr2] }输入列column_exprcolumn_expr是进行时序数据异常检测的输入数据列只能是数值类型不能是字符类型例如NCHAR、VARCHAR、VARBINARY等。支持结果为数值类型的表达式不支持 tag 和非数值结果。自v3.4.1.0起支持多列输入对于只能处理单列的模型只识别第一列多余的列将自动忽略。选项option_exproption_expr是字符串其中使用KV调用异常检测算法及与算法相关的参数采用逗号分隔的KV字符串表示字符串内部不需要使用单引号、双引号或转义符号不能使用中文及其他宽字符例如algoksigma,k2表示进行异常检测的算法是 ksigma该算法接受的输入参数是 2。结果使用规则异常检测的结果可以作为外层查询的子查询输入在SELECT子句中使用的聚合函数或标量函数与其他类型的窗口查询相同。输入数据默认进行白噪声检查如果输入数据是白噪声将不会有任何异常窗口信息返回。参数说明参数含义默认值algo异常检测调用的算法iqrwncheck对输入数据列是否进行白噪声检查取值为 0 或 11异常标识伪列 _anomalymark异常检测还会增加相应的伪列_anomalymark用于输出和标识不同的异常类型。默认情况下所有的内置异常检测算法针对异常的点异常值均输出为-1。完整示例以下示例假设存在表foo其中包含ts时间戳、i32INT 类型数值列、i8等列。-- 使用 iqr 算法进行异常检测检测列 i32同时输出异常窗口的起始时间、结束时间、窗口异常值的汇总 (sum) 以及异常标识。 SELECT _wstart, _wend, SUM(i32), _anomalymark FROM foo ANOMALY_WINDOW(i32, algoiqr); -- 使用 ksigma 算法进行异常检测输入参数 k 值为 2检测列 i32 列 SELECT _wstart, _wend, SUM(i32) FROM foo ANOMALY_WINDOW(i32, algoksigma,k2);使用默认算法不指定algo时的执行效果taos SELECT _wstart, _wend, count(*) FROM foo ANOMALY_WINDOW(i32); _wstart | _wend | count(*) | 2020-01-01 00:00:16.000 | 2020-01-01 00:00:17.000 | 2 | Query OK, 1 row(s) in set (0.028946s)多列输入与自动忽略-- 使用 ksigma 算法进行异常检测输入参数 k 值为 2检测列 i32 列i8 列会被自动忽略。 -- 在 v3.4.1.0 之前的版本会报告错误自 v3.4.1.0 起自动忽略 i8 列 SELECT _wstart, _wend, SUM(i32) FROM foo ANOMALY_WINDOW(i32, i8, algoksigma,k2);内置异常检测算法分析平台内置了若干异常检测模型分为 3 个类别基于统计学的算法、基于数据密度的算法以及基于机器学习的算法。在不指定异常检测方法的情况下默认调用IQR进行异常检测。可用算法以SHOW ANODES FULL实际返回为准详见 SHOW 命令。统计学算法统计学算法文档位于 01-statistics-approach.md。k-sigma即68–95–99.7 rule正态分布的 3σ 法则。k值默认为 3即以序列均值的 3 倍标准差范围为边界超过边界的是异常值。KSigma 要求数据整体上服从正态分布如果一个点偏离均值 K 倍标准差则该点被视为异常点。参数说明是否必选默认值k标准差倍数选填3-- 指定调用的算法为 ksigma参数 k 为 2 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, algoksigma,k2)IQRInterquartile rangeIQR四分位距是一种衡量变异性的方法。四分位数将一个按等级排序的数据集划分为四个相等的部分即 Q1第 1 个四分位数、Q2第 2 个四分位数和 Q3第 3 个四分位数。$IQRQ3-Q1$。对于 $v$满足 $Q1-(1.5 \times IQR) \le v \le Q3(1.5 \times IQR)$ 的值为正常值范围之外的是异常值。无输入参数。-- 指定调用的算法为 iqr无参数 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, algoiqr)GrubbsGrubbs test即最大标准残差测试。Grubbs 通常用作检验最大值、最小值偏离均值的程度是否为异常要求单变量数据集遵循近似标准正态分布非正态分布数据集不能使用该方法。无输入参数。-- 指定调用的算法为 grubbs无参数 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, algogrubbs)ECODEmpirical Cumulative Distribution-based Outlier Detection基于经验累积分布的离群点检测算法。该算法根据数据点在各个特征经验累积分布中的尾部概率计算离群程度尾部概率越小表示数据点越异常。ECOD不要求数据服从特定的参数分布支持多变量数据。参数contamination用于指定预期异常点比例默认值为0.1。-- 使用 ECOD 进行多变量异常检测 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, foo.i64, algoecod,contamination0.1)COPODCopula-Based Outlier Detection基于 Copula 的离群点检测算法。该算法根据各个特征的经验累积分布构造联合分布并利用数据点在联合分布中的尾部概率计算离群程度。COPOD不需要预先假设数据的具体分布适用于多变量数据。参数contamination用于指定预期异常点比例默认值为0.1。-- 使用 COPOD 进行多变量异常检测 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, foo.i64, algocopod,contamination0.1)PCAPrincipal Component Analysis基于主成分分析的离群点检测算法。该算法将数据投影到主成分空间并根据数据点偏离主成分空间的程度计算离群分数。PCA适用于正常数据具有较明显低维线性结构的场景。参数说明是否必选默认值contamination预期异常点比例取值范围为(0, 0.5]否0.1n_componentsPCA 使用的主成分数量必须大于0否全部主成分standardization是否对输入特征进行标准化1表示启用0表示禁用否1-- 使用 PCA 进行多变量异常检测 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, foo.i64, algopca,contamination0.1,n_components2)SHESD带有季节性的 ESD 检测算法。ESD 可以检测时间序列数据的多异常点。需要指定异常检测方向pos/neg/both与异常值比例的上界max_anoms最差的情况是至多 49.9%数据集的异常比例一般不超过 5%。参数说明是否必选默认值direction异常检测方向类型pos/neg/both否bothmax_anoms异常值比例 $0 K \le 49.9$否0.05period一个周期包含的数据点否0-- 指定调用的算法为 shesd参数 direction 为 both异常值比例 5% SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, algoshesd,directionboth,max_anoms0.05)规划中的统计学算法文档中还预告了后续待添加的算法Gaussian Process Regression高斯过程回归基于变点检测的异常检测算法CUSUMCumulative Sum Control Chart累积和控制图、PELTPruned Exact Linear Time。基于数据密度/数据挖掘的算法数据密度算法文档位于 02-data-density.md。LOFLocal Outlier Factor局部离群因子/局部异常因子是 Breunig 在 2000 年提出的一种基于密度的局部离群点检测算法适用于不同类簇密度分散情况迥异的数据。其原理是根据数据点周围的数据密集情况先计算每个数据点的局部可达密度再通过局部可达密度进一步计算得到每个数据点的一个离群因子。该离群因子即标识了一个数据点的离群程度——因子值越大离群程度越高因子值越小离群程度越低。最后输出离群程度最大的topK个点。从v3.4.1.13起LOF 支持多变量异常检测可同时输入多个数值列作为特征。-- 指定调用的算法为 LOF即可调用该算法 SELECT count(*) FROM foo ANOMALY_WINDOW(foo.i32, algolof) -- 使用 LOF 进行多变量异常检测 SELECT count(*) FROM foo ANOMALY_WINDOW(foo.i32, foo.i64, foo.f32, algolof)HBOSHistogram-based Outlier Score基于直方图离群分数的检测算法。该算法分别为每个特征构建直方图并根据数据点所在分箱的密度计算离群分数数据点所在分箱的密度越低离群程度越高。HBOS适用于需要高效处理数据的场景但通常假设各个特征相互独立。参数contamination用于指定预期异常点比例默认值为0.1参数n_bins用于指定直方图分箱数量默认值为10且必须至少为2。-- 使用 HBOS 进行多变量异常检测 SELECT count(*) FROM foo ANOMALY_WINDOW(foo.i32, foo.i64, algohbos,contamination0.1,n_bins10)机器学习算法机器学习算法文档位于 03-machine-learning.md。Autoencoder示例模型TDgpt 提供了一个使用自编码器Autoencoder构建的深度学习异常检测示例。该模型基于 NAB 的art_daily_small_noise数据集进行训练详细步骤见 添加机器学习模型。该示例模型默认既不在model目录中也不会自动出现在算法列表里。要正常运行需要从sample-ad-autoencoder下载模型文件并放到/var/lib/taos/taosanode/model/sample-ad-autoencoder/将示例适配代码misc/autoencoder.py复制到algo/ad/重启 taosanode并执行UPDATE ALL ANODES。此时model文件夹结构如下. └── model └── sample-ad-autoencoder ├── sample-ad-autoencoder.keras └── sample-ad-autoencoder.info-- 在 options 中增加 model 参数 sample-ad-autoencoder采用自编码器的异常检测模型进行异常检测 SELECT _wstart, count(*) FROM foo ANOMALY_WINDOW(val, algosample_ad_model,modelsample-ad-autoencoder);其中的algo设置为sample_ad_model为示例异常检测模型model指定加载模型文件的信息。需要注意的是该模型只针对训练的数据集具有较好的检测效果针对非训练相关数据集可能无法得出合适的结果。IForestIsolation Forest基于隔离树的无监督集成学习异常检测算法。该算法通过随机选择特征和切分值构建多棵隔离树并根据数据点被隔离所需的路径长度计算离群程度——数据点越容易被隔离路径越短越可能是异常点。IForest不需要预训练模型文件TDgpt 会在每次调用时基于输入数据拟合检测器。参数说明是否必选默认值contamination预期异常点比例取值范围为(0, 0.5]否0.1n_estimators隔离树数量必须大于0否100random_state随机种子否42-- 使用 IForest 进行多变量异常检测 SELECT _WSTART, COUNT(*) FROM foo ANOMALY_WINDOW(foo.i32, foo.i64, algoiforest,contamination0.1,n_estimators100,random_state42)文档同时预告了后续将添加 One-Class Support Vector Machines (SVM) 等深度学习方法。运行前提TDgpt / Anode 的部署与注册使用ANOMALY_WINDOW需要首先部署 TDgpt 服务并将其注册到 TDengine 中具体见 安装部署文档Docker 方式拉取tdengine/tdgpt镜像并启动容器TDgpt 服务端使用 6035 TCP 端口自v3.3.7.5起端口号由6090变更为6035安装包方式Linux 环境下要求 Python3.10/3.11、TDenginev3.3.6.0及以上版本安装后 anode 使用/var/lib/taos/taosanode/venv/下的虚拟环境运行Anode 服务管理Linux 通过systemctl start/stop/status taosanoded管理。Anode 启动后需要注册到 TDengine 集群才能提供服务详见 Anode 管理文档-- 注册 Anodenode_url 由 IP 和 PORT 组成 CREATE ANODE 127.0.0.1:6035; -- 查看集群中所有的数据分析节点 SHOW ANODES; -- 查看可用分析模型异常检测 预测分析 SHOW ANODES FULL;SHOW ANODES FULL的典型输出如下taos show anodes full; id | type | algo | 1 | anomaly-detection | grubbs | 1 | anomaly-detection | lof | 1 | anomaly-detection | shesd | 1 | anomaly-detection | ksigma | 1 | anomaly-detection | iqr | 1 | forecast | arima | 1 | forecast | holtwinters | 1 | forecast | tdtsfm_1 | 1 | forecast | timemoe-fc | Query OK, 9 row(s) in set (0.028750s)异常检测类算法grubbs、lof、shesd、ksigma、iqr等即通过ANOMALY_WINDOW调用。若部署了预训练示例模型或其他自定义模型也可能出现在SHOW ANODES FULL结果中。加载新的模型后需要执行UPDATE ANODE {anode_id}或UPDATE ALL ANODES刷新分析算法列表缓存。异常检测模型有效性比较工具企业版TDgpt 企业版提供模型评估工具analytics_compare详见 模型评估工具文档该工具在开源版本中不可用。针对异常检测模型使用查全率recall和查准率precision两个指标衡量模型有效性。基本流程如下准备数据在 TDgpt 安装目录下的resource文件夹中准备了样例数据sample-ad.sql执行taos -f sample-ad.sql将示例数据写入数据库。设置参数在配置文件analytics.ini中配置数据范围、是否生成标注结果图片、调用的异常检测模型及参数[ad] # 数据集起始时间戳 start_time 2021-01-01T01:01:01 # 数据集结束时间戳 end_time 2021-01-01T01:01:11 # 是否绘制检测结果 gen_figure true # 标注异常检测结果 anno_res [9] # 用于比较的模型及相关参数设置 [ad.algos] ksigma{k: 2} iqr{} grubbs{} lof{algorithm:auto, neighbors: 3}标注异常结果调用比较工具之前需要人工在anno_res选项下标注异常点在测试数组中的位置。例如sample-ad 测试数据集中第 9 个点是异常点则标注为[9]如果第 0 个点和第 9 个点都是异常点则设置为[0, 9]。调用评估工具python3 ./analytics_compare.py anomaly-detection需确保激活虚拟环境并调用该虚拟环境的 Python否则启动时 Python 会提示找不到所需的依赖库。检查结果对比程序执行完成后会自动生成名称为ad_result.xlsx的文件。第一个卡片是模型运行结果包含模型名称、执行调用参数、查全率、查准率、执行时间 5 个指标algorithmparamsprecision(%)recall(%)elapsed_time(ms.)ksigma{k:2}1001000.453iqr{}1001002.727grubbs{}1001002.811lof{algorithm:auto, neighbors:3}004.660如果设置了gen_figure为true比较程序会自动将每个参与比较的模型分析结果以图片方式呈现便于直观对比各算法在标注数据上的检测效果。使用建议与注意事项综合以上文档与算法特性实践中可以注意以下几点默认算法与数据分布匹配不指定algo时默认使用 IQR四分位距法适合快速试探如果数据近似正态分布可优先考虑ksigma或grubbs如果数据分布未知且需要多变量检测可选用ecod、copod、pca、iforest等不依赖参数分布假设的算法。多列输入的行为v3.4.1.0起支持多列输入但只支持单列的模型会自动忽略第一列之外的列单变量算法如ksigma、iqr、grubbs不要误用多列输入。白噪声检查默认开启wncheck1输入数据为白噪声时不会有任何异常窗口返回若希望忽略该检查可显式设置wncheck0。输入列类型限制只能对数值类型列或结果为数值的表达式进行异常检测字符类型列NCHAR、VARCHAR、VARBINARY等与 tag 均不支持。算法可用性以实际加载为准内置算法列表可能随版本与部署形态变化请以SHOW ANODES FULL实际返回为准自定义或预训练模型需要正确放置模型文件并执行UPDATE ALL ANODES后才能被识别。异常输出标识默认情况下所有内置算法针对异常点输出的_anomalymark值均为-1可用于在查询结果中统一标识异常位置。【免费下载链接】tdengineTDengine is an open source, high-performance, cloud native time-series database optimized for Internet of Things (IoT), Connected Cars, Industrial IoT and DevOps.项目地址: https://gitcode.com/taosdata/tdengine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表