异常检测使用指南

PaddleTS提供了时序异常检测的能力,主要包括:

  • 设计了TSDataset数据结构,适配时序异常检测场景的数据特征,详情可参考:TSDataset 文档

  • 提供了一些针对时序异常检测场景的数据可视化方法,方便用户更加直观的理解数据。

  • 实现了若干个时序异常检测的深度模型,包括经典的AutoEncoder、VAE以及领先的Anomaly Transfomer,同时提供AnomalyBaseModel基类,方便广大开发者构建新的时序异常检测模型。

  • 支持自动集成第三方异常检测库pyod中的机器学习模型,并适配时序数据,当数据量比较少的时候给用户多一种建模选择。

  • 提供了适用于时序异常检测场景的评估算子,包括Precision、Recall、F1。

示例

下方的示例使用了内置的AutoEncoder模型展示如何基于PaddleTS进行时序异常检测。

1. 数据准备

使用内置的API:get_dataset加载NAB温度数据集:NAB_TEMP。

from paddlets.datasets.repository import get_dataset

ts_data = get_dataset('NAB_TEMP') # label_col: 'label', feature_cols: 'value'

2. 数据可视化

通过PaddleTS提供的可视化接口显示数据集及相应的异常片段。

from paddlets.utils.utils import plot_anoms

plot_anoms(origin_data=ts_data, feature_name='value')
异常窗口

3. 数据处理

设置训练集(前15%)和测试集,并对数据进行标准化。

import paddle
import numpy as np
from paddlets.transform import StandardScaler

#set seed
seed = 2022
paddle.seed(seed)
np.random.seed(seed)
train_tsdata, test_tsdata = ts_data.split(0.15)

#standardize
scaler = StandardScaler('value')
scaler.fit(train_tsdata)
train_tsdata_scaled = scaler.transform(train_tsdata)
test_tsdata_scaled = scaler.transform(test_tsdata)

4. 模型训练

训练异常检测模型。

from paddlets.models.anomaly import AutoEncoder

model = AutoEncoder(in_chunk_len=2, max_epochs=100)
model.fit(train_tsdata_scaled)

5. 模型预测和评估

使用训练好的模型进行预测和评估。

from paddlets.metrics import F1,ACC,Precision,Recall

pred_label = model.predict(test_data_scaled)
lable_name = pred_label.target.data.columns[0]
f1 = F1()(test_tsdata, pred_label)
precision = Precision()(test_tsdata, pred_label)
recall = Recall()(test_tsdata, pred_label)
print ('f1: ', f1[lable_name])
print ('precision: ', precision[lable_name])
print ('recall: ', recall[lable_name])

6. 预测结果可视化

将模型的预测结果和真实的异常点做对比。

plot_anoms(origin_data=test_tsdata, predict_data=pred_label, feature_name="value")
预测结果 VS 真实结果

异常检测还提供了predict_score接口,返回每个点的异常分数,分数越高表示异常的可能性越高。

pred_score = model.predict_score(test_data_scaled)
plot_anoms(origin_data=test_tsdata, predict_data=pred_score, feature_name="value")
预测分数 VS 真实结果

7. 模型持久化

可以将训练完成的模型保存到指定路径。

model.save('./model_path/ae')

模型保存之后,可以加载模型用于新的数据预测。

from paddlets.models.model_loader import load

loaded_model = load('./model_path/ae')
pred_label = loaded_model.predict(test_data_scaled)
pred_score = loaded_model.predict_score(test_data_scaled)