异常检测(anomaly detection),也叫异常分析(outlier analysis或者outlier detection)或者离群值检测,在工业上有非常广泛的应用场景:

  • 金融业:从海量数据中找到“欺诈案例”,如信用卡反诈骗,识别虚假信贷
  • 网络安全:从流量数据中找到“侵入者”,识别新的网络入侵模式
  • 在线零售:从交易数据中发现“恶意买家”,比如恶意刷评等
  • 生物基因:从生物数据中检测“病变”或“突变”

换句话来说,异常检测就是从茫茫数据中找到那些“长得不一样”的数据。但检测异常过程一般都比较复杂,而且实际情况下数据一般都没有标签(label),我们并不知道哪些数据是异常点,所以一般很难直接用简单的监督学习。异常值检测还有很多困难,如极端的类别不平衡、多样的异常表达形式、复杂的异常原因分析等。更多介绍可参考我的文章:

异常检测虽然重要,但好用的工具库并不多。今天介绍几个不同语言上的异常检测工具库,分别是PythonMatlabJava。值得一提的是,因为这个领域的应用较少,这些工具库基本都是研究人员开发的,所以工程性稍弱,但“理论上的鲁棒性”应该是比较强的,因为开发者可能就是算法的发明人。总结来看,Java上的异常检测工具库最全,Python上的工具库正在飞速发展,Matlab上有过不错的工具库但缺乏维护。所以短时间内首选Java,长期来看Java和Python都是不错的选项。


1. Python异常检测

如果你需要多个不同的模型,可以使用Python异常检测工具库,Pyod

项目GithubPython Outlier Detection (PyOD) | 365 Stars+80 Forks

这个工具库除了支持Sklearn上支持的四种模型外,还额外提供了很多模型如:

  • 传统异常检测方法:HBOS、PCA、ABOD和Feature Bagging等。
  • 基于深度学习与神经网络的异常检测:自编码器(keras实现)

PyOD与现有工具不同:

  • 所有算法共享通用的API,方便快速调包,同时支持Python2和3。
  • 包含传统算法及前沿算法,如集成异常检测和深度学习异常检测
  • 代码经过了重重优化,大部分模型通过了并行与即时编译。
  • 提供了详细的文档以及大量例子,方便快速上手

下图为PyOD的多种模型对比图:

除此之外,这个工具库还支持一些异常检测融合算法,如Average of Maximum等。这个工具库已经被用在了不少研究和商业项目中,且已经封装打包到了PyPI上可以用pip install快速安装,同时也有对应文档(PyOD Documentation)。更详细的测评可以参考:

2. Matlab异常检测

项目Githubdsmi-lab-ntust/AnomalyDetectionToolbox | 32 Stars+38 Forks

这个工具库基本包括了常见的算法,如下图所示,常见的LOF,Isolation Forest和Distance based的算法都有。我使用过其中一部分模型,还是比较可靠的,每个模型都有>2人来编写检查。唯一的美中不足是项目最后一次维护是两年前(2016年1月),现在可能已经没人继续维护了。虽说如此,已有的模型应该足以应对大部分需求。感兴趣的小伙伴应该可以着手开发一个新的Matlab工具库。

3. Java异常检测

Java上的异常检测是最全的,必须隆重推荐ELKI,可谓是异常检测届的标杆工具库。

项目Githubelki-project/elki | 276 Stars+151 Forks

ELKI是由Heidelberg University和University of Southern Denmark的研究团队开发的,质量很高。而且 ELKI不仅仅是异常检测,而是一个全功能数据挖掘工具库,比如下图展示了各种各样的聚类模型。

至于异常检测算法,基本上常见的算法都能找到,甚至有很多最新的算法像HiCS。因此如果擅长Java的话,用ELKI必须是首选。当然,美中不足就是数据挖掘和机器学习的流行语言是Python,Java的受众面比较小。

4. 总结

不难看出,异常检测还是一个相对小众但实用的领域,工具库选择比较有限。而且这个领域的难度并不低,因为大部分算法都是无监督学习,很值得感兴趣的朋友一试。下一期文章可能会介绍更多异常检测相关的资料,敬请期待

内容中包含的图片若涉及版权问题,请及时与我们联系删除