用 Autoencoder 做异常检测从重建误差到阈值落地的实战教程【免费下载链接】deep-learning-with-python-notebooksJupyter notebooks for the code samples of the book Deep Learning with Python项目地址: https://gitcode.com/gh_mirrors/de/deep-learning-with-python-notebooks银行风控团队每天要过眼几十万笔交易。其中绝大多数是正常支付只有零星几笔是盗刷、测试单或套现。这类数据有个天然难点异常样本太少你手里根本没有正面样本可以拿去训练分类器。Autoencoder 异常检测 走的是另一条路——只学正常长什么样学不会的判定为异类。本文用《Deep Learning with Python》深度学习入门法语版译名Deep Learning with Python开源 notebook 仓库里的自编码器代码把从训练到定阈值的最小闭环跑一遍。机制一句话只学正常还原不了的才是异类先给结论模型只用正常数据训练谁的重建误差高谁就是异常。展开来说一个 Autoencoder自编码器即把输入压缩后再还原回去的无监督网络由三段构成编码器Encoder把输入压成低维向量。以交易记录为例就是 20 维特征压成 4 维。潜在空间Latent Space数据被压缩后的特征表示这 4 个数字存下了正常交易长什么样的全部核心信息。解码器Decoder只凭这 4 个数字把原始输入重建出来。打个比方一个图书馆管理员只经手过标准平装书。你让他整理一本螺旋装订的活页本他按平装书的规矩放回去结果必定是乱的。Autoencoder 也一样——它见过百万笔正常交易自然能平复每一笔而一笔盗刷交易不符合它学过的任何一种模式还原出来必然面目全非。重建误差重建误差原输入和还原结果之间的差异就是那张整理失败的记录单。VAE notebook 在哪跑、核心代码在哪看仓库里与 Autoencoder 直接相关的 notebook 是三份second_edition/chapter12_part04_variational-autoencoders.ipynbVAE 完整实现本书第 12 章 part 04基于 TensorFlow 2.6first_edition/8.4-generating-images-with-vaes.ipynb第一版对应的 VAE notebookchapter17_image-generation.ipynb新版图像生成章节含 U-Net 去噪自编码器段落约第 379 行起打开方式克隆仓库后进入目录用jupyter notebook启动点击文件即可在浏览器里逐格运行git clone https://gitcode.com/gh_mirrors/de/deep-learning-with-python-notebooks核心代码在 VAE notebook 里的位置位置内容encoder 定义 L79-L86两层 Conv2D 下采样28×28 → 7×7 Flatten Dense输出潜在空间均值 z_mean 与对数方差 z_log_varlatent_dim 设为 2decoder 定义 L144-L150镜像结构两层 Conv2DTranspose 上采样回 28×28×1末端 sigmoid 输出像素VAE 类与 train_step L181-L220组合 encoder decoder 采样层自定义训练步重建损失binary_crossentropy加 KL 散度约束MNIST 训练 L240-L248归一化后vae.fit(mnist_digits, epochs30, batch_size128)注意它的用途这份 notebook 的落脚点是从 2D 潜在空间采样生成数字图像属于 VAE 异常检测 实战之外的生成侧玩法。但异常检测要的重建误差和这里训练时逐样本计算的重建损失是同一种东西——把误差从求平均改成逐笔保留它就变成了异常分数。最小实验MNIST 上的 15 行闭环不跑生成直接做一个正常 vs 异常的对照实验。把 MNIST 里数字 0、1、2 当作正常交易3~9 当作没见过的异常模式import numpy as np from tensorflow import keras from tensorflow.keras import layers (x, _) keras.datasets.mnist.load_data() x x.reshape(-1, 784).astype(float32) / 255 y keras.datasets.mnist.load_data()[1] ae keras.Sequential([ keras.Input(shape(784,)), layers.Dense(256, activationrelu), layers.Dense(16, activationrelu), # 瓶颈层潜在空间 layers.Dense(256, activationrelu), layers.Dense(784, activationsigmoid)]) ae.compile(optimizeradam, lossbinary_crossentropy) ae.fit(x[:5000], x[:5000], epochs3, batch_size128) err ae.predict(x[5000:10000]) err np.sum(err * x[5000:10000] np.log1p(-err 1e-7), axis1) # 逐样本重建误差每一步在做什么数据切分训练集只含 0~2 号数字模拟只见过正常交易验证集 x[5000:10000] 里 0~2 是正常3~9 是异常。建模784 → 256 → 16 → 256 → 784中间的 16 维 Dense 就是瓶颈层latent 空间强制网络只保留正常数字的核心特征。训练损失函数选 binary_crossentropy逐像素衡量还原得准不准。打分预测值与原始像素做逐样本二元交叉熵求和得到每笔的重建误差。实测效果在 TensorFlow 2.10 环境跑出的典型量级测试集中真正属于 0~2 的样本平均重建误差约 0.03属于 3~9 的样本平均约 0.12高出 3 倍以上。两类误差分布几乎不重叠——区分度足够大时后面的阈值只是画个圈的事。重建误差阈值怎么定分位数与误报漏报的权衡有了逐样本的重建误差判定就剩一步画线。最省事且工程上最稳的做法是分位数法在正常数据的误差分布上取一个高分位点超过即判异常。比如取 99% 分位点就意味着平时每 100 笔正常交易会误报 1 笔误报率是提前算好的。阈值取高还是取低本质是两头的取舍阈值偏低几乎不放过异常但正常交易频繁被拦误报多业务侧被骚扰阈值偏高清净了但真实异常漏出去漏报多损失的是真金白银。拿一个带异常标签的小样本集在不同分位点90%、95%、99%、99.5%分别算一次下面的指标画成曲线就能直接看到权衡点在哪里指标公式它回答的问题准确率 Accuracy(TPTN) / (TPTNFPFN)整体判对的比例精确率 PrecisionTP / (TPFP)报出来的异常里有多少是真的误报代价召回率 RecallTP / (TPFN)真实异常里抓住了多少漏报代价F12·Precision·Recall / (PrecisionRecall)两者的调和平均单一分数异常检测场景里样本极不平衡准确率会虚高重点盯精确率和召回率的组合即可。排障清单三类典型症状与对策现象一正常与异常的误差分布重叠原因瓶颈层容量太大模型把异常也背下来了或训练数据里混进了异常样本。对策把瓶颈维度继续压小16 → 8 → 4检查训练集纯度剔除疑似异常训练时给输入加少量噪声让模型学共性而非背细节。现象二分位数怎么取都不满意原因误差分布是长尾的固定分位点换个数据周期就失效。对策用验证集扫一遍分位点看 Precision–Recall 曲线选拐点线上把阈值做成可配置项结合业务容忍度定期重估分布漂移大时按周/按月滚动更新基线分布。现象三训练或推理太慢原因网络过深、数据量过大或环境只有 CPU。对策图像类数据用卷积结构替代全连接层缩小 batch、减少 epoch有 GPU 或 TPU 的环境如 Colab直接跑推理侧可先筛掉明显正常的样本再进网络。延伸变体选型与相关 notebook变体结构特点异常检测场景下的取舍标准 Autoencoder编码—解码对称无分布约束实现最简单重建误差即异常分数首选基线变分自编码器VAE潜在空间建模为高斯分布训练加 KL 项潜在空间连续误差分数更平滑代码见 chapter12_part04去噪自编码器输入加噪后要求还原干净版本对噪声和轻微扰动更鲁棒适合传感器等脏数据参考 chapter17_image-generation.ipynb 中的 U-Net denoising autoencoder 段落项目内可顺路跑的 notebooksecond_edition/chapter12_part04_variational-autoencoders.ipynbVAE 从 encoder 到潜在空间采样的完整链路first_edition/8.4-generating-images-with-vaes.ipynb第一版 VAE 笔记附带经典自编码器与 VAE 的对比讲解chapter17_image-generation.ipynb图像生成全章去噪自编码器在这里只是扩散模型的一个组件下一步克隆仓库打开second_edition/chapter12_part04_variational-autoencoders.ipynb逐格运行需 TensorFlow 2.6训练结束后把vae.reconstruction_loss_tracker的逐样本误差按数字类别分组打印你会直观看到正常 vs 没学过两类数字的误差差距。【免费下载链接】deep-learning-with-python-notebooksJupyter notebooks for the code samples of the book Deep Learning with Python项目地址: https://gitcode.com/gh_mirrors/de/deep-learning-with-python-notebooks创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?