SUOD:「大规模异常检测系统」初体验


SUOD:「大规模异常检测系统」初体验
本文插图

本文经授权转载自知乎
原文:https://zhuanlan.zhihu.com/p/112588169
作者:微调
异常检测(又称outlier detection、anomaly detection、离群值检测)是一种重要的数据挖掘或机器学习方法 , 可以找到与“主体数据分布”不同的异常值 , 比如从信用卡交易中找出诈骗案例 , 从正常的网络数据流中找出入侵 , 在正常案例中找到罕见病患者 , 有非常广泛的商业应用价值 。 同时它可以被用于机器学习任务中的预处理 , 防止因为少量异常点存在而导致的训练或预测失败 。
虽然我们已经有了一系列完备的工具进行异常检测 , 但还有很多问题亟待解决 。 而从实用性监督来说 , 对于异常检测算法落地影响最大的就是「在高维度、大数据上算法无法收敛」 。
针对这个问题 , 我们提出了一个全新的加速系统——SUOD(Scalable Unsupervised Outlier Detection Framework)
SUOD的代码在GitHub上并可以通过pip下载安装 , SUOD的最初版文章先是被AAAI'20 的workshop接收 , 扩充完善后的文章KDD 20在审中 , 可以从arxiv上查看 。 欢迎大家star、follow、fork , 提出宝贵的意见和建议 。

  • 代码:https://github.com/yzhao062/SUOD
  • PyPI:https://pypi.org/project/suod/
  • 文档:https://suod.readthedocs.io/en/latest/
  • KDD提交版本:https://arxiv.org/abs/2003.05731
  • AAAI Workshop版本:https://arxiv.org/abs/2002.03222

1. 背景简介
异常检测因为标签难以获得的原因 , 往往得依靠无监督学习模型 。 而无监督学习在异常检测这种数据极端不平衡的分类问题中往往表现的很不稳定 。 对于无监督学习中的稳定性差的问题 , 最常见的解决方案就是用集成学习 , 即合并、选择多个基学习器而得到有提升的结果 。
但训练或者用大量无监督模型做预测会面临巨大的开销问题 , 尤其是在高维度、大数据上 , 很多时候甚至无法收敛 。
2. 解决方法
为了解决在高维大数据上训练多个无监督异常检测模型无法收敛 , 或耗时过长的问题 。 我们提出了Scalable Unsupervised Outlier Detection(SUOD) 。 SUOD的目标是加速训练的同时不牺牲训练和预测的效果 , 至少以较小的代价使得不易完成的过程变得可能 。
【SUOD:「大规模异常检测系统」初体验】
所以特别值得指出的是 , SUOD的目的是加速 , 而并非提高精度 。 SUOD模型的输入是数据集X , 与多个要被训练的模型D 。 而输出则是训练好的模型D , 如果需要预测的话 , 还有预测结果 。

SUOD:「大规模异常检测系统」初体验
本文插图

SUOD主要在三个层面对训练与预测进行加速 , 分别是:系统层面 , 数据层面 , 模型层面 。
3. 系统层面:平衡的并行调度
先说系统层面 。 当我们需要训练多个模型时 , 很自然的就是想把它们并行化 , 在多个core上进行运行 。 但当我们的多个模型是异质的(heterogeneous)的话 , 运算的开销会有很大的差别 。 举个最简单的例子 , 决策树可能就比K近邻的运算速度要快的多 。 假设我要训练100个模型 , 前50个是决策树 , 后50个是K近邻 。 假设我们只有2个集群或者worker , 那么简单的按照数量进行分的话 , 那么集群1上的任务会会比集群2上完成的速度快的多 。 那么这种调度上的不平衡会使得整个系统的运行效率很低 。
为了解决异质模型在系统调度上的不平衡 , 我们先训练了一个回归模型 , 用来预测每个基学习器可能需要的运算开销 。 之后我们设定了一个调度方法来确保不同的worker上的任务负载尽量接近 。 在这种设计下 , 每个worker(比如core)上的任务数量可能不同 , 但总的需要时间会更加接近 , 因此并行任务可以在几乎同一时刻完成 。


推荐阅读