用PyOD工具库进行「异常检测」

2023-05-16

转载于知乎:微调。

异常检测(又称outlier detection、anomaly detection,离群值检测)是一种重要的数据挖掘方法可以找到与“主要数据分布”不同的异常值(deviant from the general data distribution),比如从信用卡交易中找出诈骗案例,从正常的网络数据流中找出入侵,有非常广泛的商业应用价值。同时它可以被用于机器学习任务中的预处理(preprocessing),防止因为少量异常点存在而导致的训练或预测失败。

今天要介绍的工具库,**Python Outlier Detection(PyOD)**是当下最流行的Python异常检测工具库,其主要亮点包括:

  • 包括近20种常见的异常检测算法,比如经典的LOF/LOCI/ABOD以及最新的深度学习如对抗生成模型(GAN)和集成异常检测(outlier ensemble)
  • 支持不同版本的Python:包括2.7和3.5+;支持多种操作系统:windows,macOS和Linux
  • 简单易用且一致的API只需要几行代码就可以完成异常检测,方便评估大量算法
  • 使用JIT和并行化(parallelization)进行优化,加速算法运行及扩展性(scalability),可以处理大量数据

从2018年5月正式发布以来,PyOD已经获得了超过300,000次下载2,500个GitHub Star,在所有GitHub数据挖掘(data mining)工具库[1]排名8 。**PyOD论文**也已经在 **Journal of Machine Learning Research (JMLR)**上发表。同时它也被运用于多项学术研究中[2][3][4][5][6],我也曾在回答中使用过PyOD:「数据挖掘中常见的「异常检测」算法有哪些?」。

因为现阶段所有文档与实例全部为英文,为了方便大家使用,特别创作了这篇中文使用指南,欢迎转载(无需授权)

1. 背景概览(package overview)

PyOD提供了约20种异常检测算法(详见图1),部分算法介绍可以参考「数据挖掘中常见的「异常检测」算法有哪些?」或异常检测领域的经典教科书[7]。同时该工具库也包含了一系列辅助功能,包括数据可视化及结果评估等:

img图1. PyOD中所包括的算法一栏

工具库相关的重要信息汇总如下:

  • Github地址: pyod
  • PyPI下载地址: pyod
  • 文档与API介绍(英文): Welcome to PyOD documentation!
  • Jupyter Notebook示例(notebooks文件夹): Binder (beta)
  • JMLR论文: PyOD: A Python Toolbox for Scalable Outlier Detection

PyOD提供两种非常简单的安装方法。我个人推荐使用pip进行安装:

pip install pyod

  • GitHub安装:pyod
  • PyPI安装:pyod

使用其包含的算法也很简单:每个算法均有相对应的例子,方便使用者学习了解API(示例文件夹),比如LOF算法的对应例子就叫做lof_example.py,非常容易找到。除此之外,作者还提供了**可互动的Jupyter Notebook示例**,无需安装,直接从浏览器打开notebook就可以尝试PyOD工具库。

2. API介绍与实例(API References & Examples)

特别需要注意的是,异常检测算法基本都是无监督学习,所以只需要X(输入数据),而不需要y(标签)。PyOD的使用方法和Sklearn中聚类分析很像,它的检测器(detector)均有统一的API。所有的PyOD检测器clf均有统一的API以便使用,完整的API使用参考可以查阅(API CheatSheet - pyod 0.6.8 documentation):

  • fit(X): 用数据X来“训练/拟合”检测器clf。即在初始化检测器clf后,用X来“训练”它。
  • fit_predict_score(X, y): 用数据X来训练检测器clf,并预测X的预测值,并在真实标签y上进行评估。此处的y只是用于评估,而非训练
  • decision_function(X): 在检测器clf被fit后,可以通过该函数来预测未知数据的异常程度,返回值为原始分数,并非0和1。返回分数越高,则该数据点的异常程度越高
  • predict(X): 在检测器clf被fit后,可以通过该函数来预测未知数据的异常标签,返回值为二分类标签(0为正常点,1为异常点)
  • predict_proba(X): 在检测器clf被fit后,预测未知数据的异常概率,返回该点是异常点概率

当检测器clf被初始化且fit(X)函数被执行后,clf就会生成两个重要的属性:

  • decision_scores: 数据X上的异常打分,分数越高,则该数据点的异常程度越高
  • labels_: 数据X上的异常标签,返回值为二分类标签(0为正常点,1为异常点)

不难看出,当我们初始化一个检测器clf后,可以直接用数据X来“训练”clf,之后我们便可以得到X的异常分值(clf.decision_scores)以及异常标签(clf.labels_)。当clf被训练后(当fit函数被执行后),我们可以使用decision_function()和predict()函数来对未知数据进行训练。

在有了背景知识后,我们可以使用PyOD来实现一个简单的异常检测实例:

from pyod.models.knn import KNN   # imprt kNN分类器

# 训练一个kNN检测器
clf_name = 'kNN'
clf = KNN() # 初始化检测器clf
clf.fit(X_train) # 使用X_train训练检测器clf

# 返回训练数据X_train上的异常标签和异常分值
y_train_pred = clf.labels_  # 返回训练数据上的分类标签 (0: 正常值, 1: 异常值)
y_train_scores = clf.decision_scores_  # 返回训练数据上的异常值 (分值越大越异常)

# 用训练好的clf来预测未知数据中的异常值
y_test_pred = clf.predict(X_test)  # 返回未知数据上的分类标签 (0: 正常值, 1: 异常值)
y_test_scores = clf.decision_function(X_test)  #  返回未知数据上的异常值 (分值越大越异常)

不难看出,PyOD的API和scikit-learn非常相似,只需要几行就可以得到数据的异常值。当检测器得到输出后,我们可以用以下代码评估其表现,或者直接可视化分类结果(图2

# 评估预测结果
print("\nOn Test Data:")
evaluate_print(clf_name, y_test, y_test_scores)

# 可视化
visualize(clf_name, X_train, y_train, X_test, y_test, y_train_pred,
    y_test_pred, show_figure=True, save_figure=False)

img图2. 预测结果(右图)与真实结果(左图)对比

3. 相关教程、资源与未来计划

除此之外,不少网站都曾提供过如何使用PyOD的教程,比较权威的有:

  • Analytics Vidhya: An Awesome Tutorial to Learn Outlier Detection in Python using PyOD Library
  • KDnuggets: Intuitive Visualization of Outlier Detection Methods
  • awesome-machine-learning: General-Purpose Machine Learning

根据开发团队的计划(Todo & Contribution Guidance),很多后续功能会被逐步添加:

  • 支持GPU运算
  • 支持conda安装
  • 增加中文文档

除此之外,开发团队也整理异常检测相关的资源汇总(课程、论文、数据等),非常值得关注:anomaly-detection-resources

总结来看,PyOD是当下最为流行的异常检测工具库,且处于持续更新中。建议大家尝试、关注并参与到PyOD的开发当中。有鉴于功能可能会不断更新,请以GitHub版本为准。


引用PyOD非常方便,可参考如下:

Zhao, Y., Nasrullah, Z. and Li, Z., 2019. PyOD: A Python Toolbox for Scalable Outlier Detection. Journal of machine learning research (JMLR), 20(96), pp.1-7.

或者

@article{zhao2019pyod,
  author  = {Zhao, Yue and Nasrullah, Zain and Li, Zheng},
  title   = {PyOD: A Python Toolbox for Scalable Outlier Detection},
  journal = {Journal of Machine Learning Research},
  year    = {2019},
  volume  = {20},
  number  = {96},
  pages   = {1-7},
  url     = {http://jmlr.org/papers/v20/19-011.html}
}

参考

  1. ^https://github.com/topics/data-mining
  2. ^Ramakrishnan, J., Shaabani, E., Li, C. and Sustik, M.A., 2019. Anomaly Detection for an E-commerce Pricing System. arXiv preprint arXiv:1902.09566.
  3. ^Zhao, Y., Nasrullah, Z., Hryniewicki, M.K. and Li, Z., 2019, May. LSCP: Locally selective combination in parallel outlier ensembles. In Proceedings of the 2019 SIAM International Conference on Data Mining (pp. 585-593). Society for Industrial and Applied Mathematics.
  4. ^Ishii, Y. and Takanashi, M., 2019. Low-cost Unsupervised Outlier Detection by Autoencoders with Robust Estimation. Journal of Information Processing, 27, pp.335-339.
  5. ^Klaeger, T., Schult, A. and Oehm, L., 2019. Using anomaly detection to support classification of fast running (packaging) processes. arXiv preprint arXiv:1906.02473.
  6. ^Krishnan, S. and Wu, E., 2019. AlphaClean: Automatic Generation of Data Cleaning Pipelines. arXiv preprint arXiv:1904.11827.
  7. ^Aggarwal, C.C., 2015. Outlier analysis. In Data mining (pp. 237-263). Springer, Cham.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用PyOD工具库进行「异常检测」 的相关文章

  • 架构设计:如何实现一个高性能分布式 RPC 框架

    在前面的课程中 xff0c 我们由浅入深地讲解了 Netty 的基础知识和实现原理 xff0c 并对 Netty 的核心源码进行了剖析 xff0c 相信你已经体会到了 Netty 的强大之处 本身学习一门技术是一个比较漫长的过程 xff0c
  • 【Java学习路线之JavaWeb】Hibernate框架入门教程

    文章目录 Hibernate框架入门教程读者阅读条件 ORM是什么ORM 的缺点ORM 框架总结 Hibernate是什么什么是 ORM xff1f 什么是持久化 xff1f Hibernate 支持的数据库Hibernate 是一种全自动
  • JDBC快速入门教程

    JDBC快速入门教程 xff1a https www yiibai com jdbc jdbc quick guide html
  • 嵌入式中5个难查的软件问题

    在嵌入式开发软件中查找和消除潜在的错误是一项艰巨的任务 通常需要英勇的努力和昂贵的工具才能从观察到的崩溃 xff0c 死机或其他计划外的运行时行为追溯到根本原因 在最坏的情况下 xff0c 根本原因会破坏代码或数据 xff0c 使系统看起来
  • 【Go语言入门教程】Go语言简介

    文章目录 Go语言简介Go语言创始人1 Ken Thompson2 Rob Pike3 Robert Griesemer Go 是编译型语言为什么要学习Go语言Go语言吉祥物 Go语言的特性有哪些 xff1f 语法简单并发模型内存分配垃圾回
  • 【Go语言入门教程】Go语言基本语法

    文章目录 Go语言变量的声明 xff08 使用var关键字 xff09 标准格式批量格式简短格式 Go语言变量的初始化回顾C语言 变量初始化的标准格式编译器推导类型的格式短变量声明并初始化 Go语言多个变量同时赋值Go语言匿名变量 xff0
  • 【Go语言入门教程】Go语言容器(container)

    文章目录 其它语言中的容器 Go语言数组详解Go语言数组的声明比较两个数组是否相等遍历数组 访问每一个数组元素 Go语言多维数组简述Go语言切片详解从数组或切片生成新的切片1 从指定范围中生成切片2 表示原有的切片3 重置切片 xff0c
  • 跨平台组件方案设计

    转一篇看完有点收获的文章 xff1a https blog csdn net c12345423 article details 117914561 一 背景说明 模块是对业务的抽象 xff0c 组件是对功能的抽象 xff0c 组件化的目的
  • 996,活着抑或死亡

    就在昨天 xff0c 2021年元旦假期的最后一天 xff0c 网传某大厂多多买菜的23岁小姑娘离开了这个世界 不久之前 xff0c 也有另一大厂的朋友因工作强度太大 xff0c 在字节跳动与心脏跳动中选择了后者 还有更戏剧化的新闻是刚因大
  • 怎么用手机拍摄制作视频

    今天看了一个用手机拍摄视频的Up主讲解他用手机拍摄来制作视频的过程 xff0c 在此总结一下 xff0c 学习一下 任何形式的内容创作 xff0c 都需要及时记录 xff0c 现在手机这么方便 xff0c 用备忘录记录一下想法和灵感 写稿子
  • 2021年ML和NLP依然发展迅速,DeepMind科学家最近总结了过去一年的十五项亮点研究方向,快来看看哪个方向适合做你的新坑

    转载于 xff1a https mp weixin qq com s IDdY2Wd77fT3DkYXCnSBCA 最近 xff0c DeepMind科学家Sebastian Ruder总结了15个过去一年里高能 有启发性的研究领域 xff
  • BCD码-百度百科

    BCD码 xff08 Binary Coded Decimal xff09 xff0c 用4位二进制数来表示1位十进制数中的0 9这10个数码 xff0c 是一种二进制的数字编码形式 xff0c 用二进制编码的十进制代码 BCD码这种编码形
  • STM32单片机学习教程

    STM32单片机学习教程 64 先可以看一个简单的入门教程 xff1a STM32新手入门教程 后面就是整理于 xff1a https stm32 tech readthedocs io en latest base 00 E5 89 8D
  • 分享一份嵌入式软件工具清单

    文章目录 1 BowPad2 keil3 VSCode4 VS5 MinGW6 Source Insight7 VMWare8 Git9 Beyond Compare10 串口助手11 STM32Cube xff08 1 xff09 STM
  • beyond compare下载安装及使用教程

    一 下载安装 下载地址 xff1a https www beyondcompare cc 普通的软件安装 xff0c 直接点点点即可 二 简单使用教程 一般我们的使用场景是比较两个文件或者两个文件夹 推荐看官方的教程 xff1a Beyon
  • RT-Thread 编程风格

    文章目录 1 目录名称2 文件名称3 头文件定义4 文件头注释5 结构体定义6 宏定义7 函数名称 声明8 注释编写9 缩进及分行10 大括号与空格11 trace log信息12 函数13 对象14 格式化代码使用 astyle 格式化使
  • 程序人生文章汇总(持续更新,方便查阅)

    已经转载和写过不少关于程序人生的文章 xff0c 这篇就主要对这些文章进行主题分类 xff1a 我自己将这些内容分成以下主题 xff1a 提高认知方向选择 amp 学习路线学习方法 amp 做事方法总结重要技能其他 提高认知 程序员为什么越
  • 使用Github Pages和HTML+CSS搭建自己的个人简历网页

    最近看到一个使用Github Pages和HTML 43 CSS搭建的个人简历网页 xff0c 看起来还是不错的 xff0c 因此想重新整理一下这方面的内容 另外 xff0c HTML和Markdown之前也是可以在一定程度上转换的 xff
  • 单片机开发项目全局变量太多怎么管理?

    转载于无际 xff1a https blog csdn net weixin 43982452 article details 121387105 spm 61 1001 2014 3001 5502 大家好 xff0c 我是无际 最近有几
  • 你和高手的差距,就在一念之间

    我一直做软件开发和技术管理工作 xff0c 虽然在做联合创始人期间也参与2B的市场销售运营等众多事情 xff0c 但2C的电商卖货这件事从未体验过 想起小学时学的小马过河的故事 xff0c 要想知道怎么做 xff0c 不能只听别人的说法 x

随机推荐

  • 如何看待2022届秋招嵌入式开发岗位薪资大涨?

    转载于无际 xff1a http t csdn cn ZSlSW 大家好 xff0c 我是无际 最近在网上看到了关于2022届嵌入式开发岗位薪资大涨的帖子 xff0c 比如说像海康 大华 汇顶 联发科等公司的招聘 普遍年薪达到25W xff
  • 电子工程师是怎样的成长之路?

    转载于无际 xff1a https blog csdn net weixin 43982452 article details 121535177 spm 61 1001 2014 3001 5502 10年前 xff0c 我就是通过智能小
  • 单片机怎么做定时器矩阵,彻底解决各种定时问题?

    转载于 xff1a https blog csdn net weixin 43982452 article details 120555258 spm 61 1001 2014 3001 5502 大家好 xff0c 我是无际 定时功能非常
  • 为什么我学51单片机很顺利,学STM32却一头雾水?

    转载于 xff1a https blog csdn net weixin 43982452 article details 120515134 spm 61 1001 2014 3001 5502 五年懂行 xff0c 十年称王 当初自学转
  • 物联网专业真的把人坑惨了?浅谈物联网的未来发展趋势和未来方向

    转载于 xff1a https blog csdn net weixin 43982452 article details 120200879 spm 61 1001 2014 3001 5502 大家好 xff0c 我是无际 从事10年单
  • STM32单片机跑RTOS会比裸机有优势吗?

    转载于无际 xff1a https blog csdn net weixin 43982452 article details 115139030 spm 61 1001 2014 3001 5502 在工作中总是能碰到通过秀技术来满足虚荣
  • 如何快速学会别人的代码和思维

    转载于 xff1a https blog csdn net weixin 43982452 article details 120700863 spm 61 1001 2014 3001 5502 大家好 xff0c 我是无际 也有很多天没
  • 单片机和嵌入式哪个好?单片机会被嵌入式取代吗?

    转载于 xff1a https blog csdn net weixin 43982452 article details 120062206 spm 61 1001 2014 3001 5502 很多初学者都搞不清楚单片机和嵌入式的区别
  • 怎么看懂别人写的单片机项目代码?

    转载于 xff1a https blog csdn net weixin 43982452 article details 120049443 spm 61 1001 2014 3001 5502 记得刚开始接触代码的时候 xff0c 总觉
  • 嵌入式单片机产品开发设计框架

    转载于 xff1a https blog csdn net weixin 43982452 article details 119616145 spm 61 1001 2014 3001 5502 老板突然要给你一个新的需求 xff0c 要
  • 8大话题,解惑企业数字化

    从IT到DT xff0c 从信息化到数字化 xff0c 这个观念已经毋庸置疑 xff0c 但是 xff0c 这条路却缺少参照 xff0c 暗夜前行 xff0c 全靠摸索 关于数字化 xff0c 肯定不是上马一些OA工具 购买一些营销工具就行
  • ARINC 429总线学习资料?

    Hello xff0c 我是小熊coder xff0c 方向是嵌入式AI xff0c 后端开发 我的主页 xff1a Home xff0c 欢迎互相关注 xff0c 互相学习 最近在网上寻找关于ARINC 429总线的资料时 xff0c 发
  • 周期任务框架在裸机、RTOS上的实现

    周期任务框架在裸机 RTOS上的实现 一 任务的类型 运行的程序 xff0c 有响应指令的触发式程序 xff0c 也有一直运行的守护程序 xff0c 周期程序 贴别是在单片机 嵌入式领域 xff0c 大部分程序都是周期性的执行 xff0c
  • CAN通讯实验

    前面我们讲解了CAN总线的一些基础知识 xff0c 文章链接 xff1a 一口气从零读懂CAN总线以及应用 了解完之后 xff0c 我们也需要来用一用CAN总线 这篇文章就是主要讲解在STM32中怎么使用CAN总线
  • 航空机载总线网络概述

    1 机载总线网络概述 现代战斗机的航空电子系统是航空电子技术经历了半个多世纪的漫长演变和不断进步的结果 航空电子系统结构的每次变化 xff0c 其核心的机载总线网络技术也不断跨上新台阶 xff0c 而且每次变革都能使飞机性能得到大幅提升 现
  • 【C/C++开源库】单片机/嵌入式中的C语言日志库

    日志系统在系统开发和调整过程中的重要性 xff0c 大家应该都清楚 xff0c 特别是项目出问题之后 xff0c 却没有日志可以帮忙定位问题 xff0c 就非常令人痛苦 因为我们不可能一直通过调试器去单步调试程序 xff0c 所以设备的运行
  • 稚晖君软件硬件开发环境总结

    0 引言 这两天在bilibili上发现一个宝藏up主 xff0c 稚晖君 啧啧啧 xff0c 很厉害 虽然年龄不大 xff0c 但是真全栈 xff0c 从产品到机械到电路到软件 xff0c 这就是那种真的聪明 xff0c 一学就会的高智商
  • 一文弄清51、STM32、Linux点灯的区别

    嵌入式初学者入门的第一个 项目 就是LED点灯 xff0c 那么 xff0c 本文带你看看51 STM32 Linux点灯有什么区别 xff1f 51点灯 51点灯 xff0c 是很多单片机初学者的首选 xff0c 难度也是相对比较低的 准
  • Keil 模拟器 STM32F103 上手指南

    一般嵌入式操作系统因为它的特殊性 xff0c 往往和硬件平台密切相关连 xff0c 具体的嵌入式操作系统往往只能在特定的硬件上运行 对于刚接触 RT Thread 操作系统的读者并不容易马上就获得一个和 RT Thread 操作系统相配套的
  • 用PyOD工具库进行「异常检测」

    转载于知乎 xff1a 微调 异常检测 xff08 又称outlier detection anomaly detection xff0c 离群值检测 xff09 是一种重要的数据挖掘方法 xff0c 可以找到与 主要数据分布 不同的异常值