参考论文:
An, Jinwon, and Sungzoon Cho. “Variational autoencoder based anomaly detection using reconstruction probability.” Special Lecture on IE 2.1 (2015): 1-18.

整体的算法思路

AutoEncoder的模型与pytorch建模可以参考:https://blog.csdn.net/weixin_35757704/article/details/118457110

  1. 将正常样本与异常样本切分为:训练集X,训练集Y,测试集X,测试集Y
  2. AutoEncoder建模:建模
  3. 用正样本数据训练AutoEncoder:因为AutoEncoder是要想办法复现原有数据,因此要确保AutoEncoder看到的都只是自身正常的数据,这样当异常的数据到来时,就会出现很突兀的状况,这也是我们要的效果。
  4. 计算阈值:这是很多研究讨论的点。因为异常样本会造成很突兀的效果,但是突兀的程度有多大,我们认为是异常样本,就是这里要明确的
  5. 让样本通过Autoencoder模型,复现后的Loss超过阈值,就被认为是异常样本,没有超过阈值则为正常样本

示例代码

在下面的代码中,步骤从上到下,通过def main()函数串联整个流程,Debug效果更加

import numpy as np
from pyod.utils.data import generate_data
import torch
import torch.nn as nn
import torch.utils.data as Data
from loguru import logger
from sklearn.metrics import accuracy_score, recall_score# 步骤1:获取数据源
def get_data():"""生成数据"""X_train, X_test, y_train, y_test = generate_data(n_train=10000, n_test=1000, n_features=50, contamination=0.2, behaviour='new')  # 这里生产数据return X_train, X_test, y_train, y_test# 步骤2:AutoEncoder建模,这里根据自己的数据调整模型,AutoEncoder不是一个固定的模型
class AutoEncoder(nn.Module):def __init__(self, input_size, hidden_layer_size=32):super().__init__()self.hidden_layer_size = hidden_layer_size# 输入与输出的维度相同self.input_size = input_sizeself.output_size = input_sizeself.encode_linear = nn.Linear(self.input_size, hidden_layer_size)self.decode_linear = nn.Linear(hidden_layer_size, self.output_size)self.relu = nn.ReLU()self.sigmoid = nn.Sigmoid()def forward(self, input_x):# encodeencode_linear = self.encode_linear(input_x)encode_out = self.sigmoid(encode_linear)# decodedecode_linear = self.decode_linear(encode_out)  # =self.linear(lstm_out[:, -1, :])return decode_linear# 步骤3:训练模型
def train_auto_encoder(normal_data: np.ndarray):"""训练Auto Encoder模型"""train_tensor = torch.tensor(normal_data).float()batch_size = 20train_loader = Data.DataLoader(dataset=Data.TensorDataset(train_tensor),  # 封装进Data.TensorDataset()类的数据,可以为任意维度batch_size=batch_size,  # 每块的大小shuffle=True,  # 要不要打乱数据 (打乱比较好)num_workers=2,  # 多进程(multiprocess)来读数据)# 建模三件套:loss,优化,epochsmodel = AutoEncoder(train_tensor.shape[1])  # 模型loss_function = nn.MSELoss()  # lossoptimizer = torch.optim.Adam(model.parameters(), lr=0.001)  # 优化器epochs = 30# 开始训练model.train()loss_list = []for i in range(epochs):epoch_loss_list = []for seq in train_loader:seq = seq[0]optimizer.zero_grad()y_pred = model(seq).squeeze()  # 压缩维度:得到输出,并将维度为1的去除single_loss = loss_function(y_pred, seq)single_loss.backward()optimizer.step()epoch_loss_list.append(single_loss.detach().numpy())logger.debug("Train Step:{} loss: {}", i, np.mean(epoch_loss_list))loss_list.append(np.mean(epoch_loss_list))return model, np.min(loss_list)# 步骤4:模型训练完成,开始找正常数据与异常数据的阈值
def set_threshold(auto_encoder_model, error_data: np.ndarray, normal_loss):"""阈值计算:这里通过正常数据的最小loss与最大异常的loss取中间值,作为阈值的loss"""error_tensor = torch.tensor(error_data).float()error_loader = Data.DataLoader(dataset=Data.TensorDataset(error_tensor),shuffle=True,num_workers=2,)loss_function = nn.MSELoss()error_loss = []auto_encoder_model.eval()for seq in error_loader:seq = seq[0]y_pred = auto_encoder_model(seq).squeeze()loss = loss_function(y_pred, seq)error_loss.append(loss.detach().numpy())threshold = (np.min(error_loss) - normal_loss) / 2logger.info("阈值计算完毕:正常样本的最大loss:{},异常样本的最小loss:{},阈值:{}", normal_loss, np.min(error_loss), threshold)return threshold# 步骤5:异常检测
def anomaly_detection(auto_encoder_model, threshold, x_test, y_test):# 这里构建测试数据test_tensor = torch.tensor(x_test).float()test_loader = Data.DataLoader(dataset=Data.TensorDataset(test_tensor),shuffle=True,num_workers=2,)pred_list = []loss_function = nn.MSELoss()# 通过 Auto Encoder 模型进行预测auto_encoder_model.eval()for seq in test_loader:seq = seq[0]y_pred = auto_encoder_model(seq).squeeze()loss = loss_function(y_pred, seq)if loss < threshold:pred_list.append(0)else:pred_list.append(1)  # 异常# 评价指标logger.info("准确率:{} 召回率:{}", accuracy_score(y_test, pred_list), recall_score(y_test, pred_list))def main():x_train, x_test, y_train, y_test = get_data()model, normal_loss = train_auto_encoder(x_train[y_train == 0])  # 拿正例数据进行训练threshold = set_threshold(model, x_train[y_train == 1], normal_loss)anomaly_detection(model, threshold, x_test, y_test)if __name__ == '__main__':main()

打印的日志:

2022-03-25 16:22:45.409 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:0 loss: 7.666098117828369
2022-03-25 16:22:47.507 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:1 loss: 0.2303541898727417
2022-03-25 16:22:49.653 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:2 loss: 0.22991487383842468
2022-03-25 16:22:51.769 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:3 loss: 0.2299502193927765
2022-03-25 16:22:53.881 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:4 loss: 0.23001298308372498
2022-03-25 16:22:56.002 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:5 loss: 0.23006229102611542
2022-03-25 16:22:58.057 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:6 loss: 0.23018917441368103
2022-03-25 16:23:00.111 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:7 loss: 0.23030006885528564
2022-03-25 16:23:02.169 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:8 loss: 0.23039482533931732
2022-03-25 16:23:04.224 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:9 loss: 0.23047684133052826
2022-03-25 16:23:06.284 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:10 loss: 0.23054634034633636
2022-03-25 16:23:08.323 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:11 loss: 0.23061569035053253
2022-03-25 16:23:10.347 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:12 loss: 0.23073334991931915
2022-03-25 16:23:12.372 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:13 loss: 0.22996807098388672
2022-03-25 16:23:14.427 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:14 loss: 0.2291102260351181
2022-03-25 16:23:16.485 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:15 loss: 0.2279823124408722
2022-03-25 16:23:18.540 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:16 loss: 0.22661711275577545
2022-03-25 16:23:20.598 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:17 loss: 0.22481602430343628
2022-03-25 16:23:22.646 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:18 loss: 0.221832737326622
2022-03-25 16:23:24.710 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:19 loss: 0.2177421599626541
2022-03-25 16:23:26.776 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:20 loss: 0.21366573870182037
2022-03-25 16:23:28.779 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:21 loss: 0.2092127650976181
2022-03-25 16:23:30.764 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:22 loss: 0.2051170915365219
2022-03-25 16:23:32.736 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:23 loss: 0.19992759823799133
2022-03-25 16:23:34.755 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:24 loss: 0.19542557001113892
2022-03-25 16:23:36.771 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:25 loss: 0.1883782595396042
2022-03-25 16:23:38.757 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:26 loss: 0.1813327670097351
2022-03-25 16:23:40.760 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:27 loss: 0.17500406503677368
2022-03-25 16:23:42.744 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:28 loss: 0.16993017494678497
2022-03-25 16:23:44.727 | DEBUG    | __main__:train_auto_encoder:93 - Train Step:29 loss: 0.16403226554393768
2022-03-25 16:23:47.161 | INFO     | __main__:set_threshold:116 - 阈值计算完毕:正常样本的最大loss:0.16403226554393768,异常样本的最小loss:15.091814041137695,阈值:7.46389102935791
2022-03-25 16:23:49.223 | INFO     | __main__:anomaly_detection:142 - 准确率:0.694 召回率:0.235

异常检测3——AutoEncoder异常检测相关推荐

  1. 【时间序列异常检测】时序异常检测综述整理(2020-2021)

    转载:宅码 最近阅读几篇异常检测综述,这里整理分享给大家,推荐阅读:5星.不足之处,还望批评指正. 赵越博士的异常检测库Python Outlier Detection (PyOD) [1]写的很好, ...

  2. 异常检测/离群点检测算法汇总

    不存在普遍意义上的最优模型,不过有些模型的表现一直不错,建议优先考虑.对于大数据量和高纬度的数据集,Isolation Forest算法的表现比较好.小数据集上,简单算法KNN和MCD的表现不错. 模 ...

  3. 异常检测概念、异常检测的思路、孤立森林Isolation Forest、​​​​​​​局部异常因子LOF、OneClassSVM、EllipticEnvelop

    异常检测概念.异常检测的思路.孤立森林Isolation Forest.局部异常因子LOF.OneClassSVM.EllipticEnvelop 目录

  4. 使用VAE、CNN encoder+孤立森林检测ssl加密异常流的初探——真是一个忧伤的故事!!!...

    ssl payload取1024字节,然后使用VAE检测异常的ssl流. 代码如下: from sklearn.model_selection import train_test_split from ...

  5. 无监督学习:异常检测与剔除(局部异常因子法 SVM异常检测器)

    1.前言 前面介绍的都是有监督学习的回归和分类算法.有监督学习是指对输入和输出都有成对出现的训练样本{(xi,yi)}.在这里,主要介绍在没有输出信息时,只利用输入样本{xi}的信息进行无监督学习的方 ...

  6. 5个专注于检测和预测异常的Java工具分享

    正所谓,工欲善其事必先利其器.对于程序员来说也不例外,在程序开发中如果擅长用一些小工具,能让你的工作效率事半功倍.下面,小千将给大家分享5个专注于检测和预测异常的Java工具,帮助初学者提高编程效率. ...

  7. 深度学习助力异常胸部 X 光片检测

    关注公众号,发现CV技术之美 发布人:Google Health 软件工程师 Zaid Nabulsi 和 Po-Hsuan Cameron Chen 在医学成像中应用机器学习 (ML),为改善胸部 ...

  8. 检测到无效的异常处理程序例程。_异常控制流(1):异常概述和基本类型

    异常控制流的学习内容来自深入理解计算机系统. 异常控制流是操作系统用来实现I/O.进程和虚拟内存的基本机制.应用程序通过使用一个叫陷阱(trap)或者系统调用(为应用程序提供到操作系统的入口点的异常) ...

  9. Metis异常检测算法率值检测和量值检测源码刨析

    Metis异常检测算法率值检测和量值检测源码刨析 1. 测试代码 2. 率值检测 2.1 rate_predict方法(detect.py) 2.2 predict方法(statistic.py) 2 ...

最新文章

  1. 软件工程第二次作业完整版
  2. kafka解决了什么问题?
  3. BGP——本地始发选路+AS-PATH选路(讲解+命令)
  4. 深度学习与TensorFlow:VGG论文复现
  5. [转]Sublime Text 2 C++编译运行简单配置
  6. 漫游Kafka设计篇之Producer和Consumer(4)
  7. gcc编译器_2020好用的C++编译器有哪些?这几款值得下载
  8. cropper.js插件做图片上传裁剪图片大小
  9. 控制系统数字仿真与CAD-第三次实验-附完整代码
  10. 2018年终总结以及未来展望
  11. 每天一道剑指offer-从上往下打印二叉树
  12. php json替换,php解决json中中文部分被替换为unicode编码
  13. 华为模拟器linux,华为ENSP模拟器 官方安装版
  14. QNX实时操作系统简介
  15. easyexcel 第一次导入导出会报错com.alibaba.excel.exception.ExcelAnalysisException,所以自定义excel导入导出表格
  16. 程序员面试技巧必读篇(一套太极剑法传授给你)
  17. 一次性餐具 disposable dishware
  18. 如何测算BMI指数(Python)
  19. cve-2019-0708漏洞复现
  20. 用Python自动生成数据日报!

热门文章

  1. python为什么没有指针_Python中有指针吗?
  2. 调用另一个cpp的变量_Il2Cpp Internals: 托管调用栈
  3. mosquitto源码分析(二)
  4. python自训练神经网络_tensorflow学习笔记之简单的神经网络训练和测试
  5. python爬取数据生成词云_Python 爬取生成中文词云以爬取知乎用户属性为例
  6. LintCode,hihoCoder,LeetCode有什么区别?
  7. 应急管理部等四部门联合督导 烟花爆竹安全生产工作
  8. MLPlatform project的统一结构-----------运行机制(原理)
  9. UpdatePanel无法导出下载文件
  10. ikvm.net简介