异常检测算法库PyOD

这篇具有很好参考价值的文章主要介绍了异常检测算法库PyOD。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  • 本文介绍一种十分强大的数据异常检测算法库PyOD(Python Outlier Detection),github项目地址。官方文档说明。
  • PyOD是最全面且可扩展的Python库,用于检测多元数据中的异常对象。PyOD包含 40 多种检测算法,从经典的LOF(SIGMOD 2000)到最新的ECOD(TKDE 2022)。
  • PyOD库的优点是:
    • 跨各种算法的统一API、详细文档和交互式示例。
    • 先进的模型,包括经典的距离和密度估计、最新的深度学习方法以及ECOD等新兴算法。
    • 使用numbajoblib通过JIT和并行化优化性能。
    • 使用SUOD进行快速训练和预测
  • 最近该库的作者发布了一篇45页最全面的异常检测基准论文。在57个基准数据集上比较了30种异常检测算法。总体来说,该篇论文经过实验发现在各数据集上KNNIForestECOD算法表现均不错,若对数据无任何强烈认知,可以先尝试这3种算法。
  • 本文以KNNIForestECOD算法为示例,说明PyOD库的使用方法

环境安装

  • 若有预先安装git可以使用以下代码安装依赖库
!git clone https://github.com/yzhao062/pyod.git
%cd pyod
!pip install .
!pip install -r requirements_ci.txt
%cd ..
  • 若没有git工具,可以使用pip安装依赖库
!pip install pyod
!pip install combo
!pip install joblib
!pip install pythresh
!pip install suod
  • 导入必要包
import numpy as np
from pyod.models.knn import KNN
from pyod.models.ecod import ECOD
from pyod.models.iforest import IForest
from pyod.utils.data import generate_data
from pyod.utils.example import visualize
from pyod.utils.data import evaluate_print
from pyod.utils.utility import standardizer
from pyod.models.combination import aom, moa, average, maximization, median
from pyod.models.thresholds import FILTER
from pyod.models.suod import SUOD

单算法对比

  • 我们首先创建一个数据集,可以使用PyOD库的generate_data函数,n_features参数为特征数,这里为了方便可视化,所以设为2,及二维特征。
# 异常值比例
contamination = 0.1
# 训练集样本数
n_train = 2000
# 测试集样本数
n_test = 200

X_train, X_test, y_train, y_test = generate_data(n_train=n_train, n_test=n_test, contamination=contamination, n_features = 2, random_state = 2023)
  • 为了减少代码冗余,构造函数将模型训练、测试、输出精度指标、可视化这些工作融合到一起
def create_clf(model_name, X_train, X_test, y_train, y_test, contamination=None, **kwargs):
    model_mapping = {
        'KNN': KNN,
        'ECOD': ECOD,
        'IForest': IForest
    }
    model_class = model_mapping.get(model_name)
    
    # 自动确定异常阈值
    if contamination == None:
        contamination = FILTER()
        print("Auto calculate contamination!!")
        
    clf = model_class(contamination = contamination, **kwargs)
    clf.fit(X_train)

    # 获取训练数据的预测标签和异常值分数
    # 标签(0:正常值,1:异常值)
    y_train_pred = clf.labels_
    # 样本异常值分数
    y_train_scores = clf.decision_scores_

    # 获取测试数据的预测
    y_test_pred = clf.predict(X_test)
    # 预测标签(0:正常值,1:异常值)
    y_test_scores = clf.decision_function(X_test)

    # 预测置信度
    # 标签(0,1)和[0,1]范围内的置信度
    y_test_pred, y_test_pred_confidence = clf.predict(X_test, return_confidence=True)
    
    # 评估模型在训练集上的指标
    print("\nOn Training Data:")
    evaluate_print(model_name, y_train, y_train_scores)
    # 评估模型在测试集上的指标
    print("\nOn Test Data:")
    evaluate_print(model_name, y_test, y_test_scores)

    # 可视化检测效果
    visualize(model_name, X_train, y_train, X_test, y_test, y_train_pred,
          y_test_pred, show_figure=True, save_figure=False)
  • 函数参数说明:
    • model_name:要选择训练的模型,只有3个可选项,分别为KNNIForestECOD
    • X_train, X_test, y_train, y_test:训练集、测试集以及对应的标签
    • contamination:异常样本阈值,一般情况下这个值是未知的,可能需要凭借经验。但PyOD库结合 PyThresh库实现自动确定阈值(根据统计分析避免主观意识对结果的影响)。当函数不传入该参数时,由算法自动确定该参数(阈值)
  • PyThresh库旨在对异常值检测器生成的似然分数进行阈值处理。它包含30多种阈值算法。这些算法的范围从使用Z分数等简单的统计分析到涉及图论和拓扑的更复杂的数学方法。github项目地址

KNN异常检测算法

  • 根据上述函数参数,代码如下:
create_clf('KNN', X_train, X_test, y_train, y_test, contamination=contamination)

输出:

On Training Data:
KNN ROC:0.9994, precision @ rank n:0.99

On Test Data:
KNN ROC:0.9903, precision @ rank n:0.95

局部离群因子剔除异常值,异常检测,PyOD,ECOD,KNN

ECOD异常检测算法

create_clf('ECOD', X_train, X_test, y_train, y_test, contamination=contamination)

输出:

On Training Data:
ECOD ROC:0.9648, precision @ rank n:0.69

On Test Data:
ECOD ROC:0.9311, precision @ rank n:0.55

局部离群因子剔除异常值,异常检测,PyOD,ECOD,KNN

IForest异常检测算法

create_clf('IForest', X_train, X_test, y_train, y_test, contamination=contamination)

输出:

On Training Data:
IForest ROC:0.9997, precision @ rank n:0.99

On Test Data:
IForest ROC:0.9908, precision @ rank n:0.95

局部离群因子剔除异常值,异常检测,PyOD,ECOD,KNN

KNN自动确定阈值

  • 根据前面说的函数参数,当我们需要算法自动确定阈值时,不传入contamination参数
create_clf('KNN', X_train, X_test, y_train, y_test)

输出:

Auto calculate contamination!!

On Training Data:
KNN ROC:0.9994, precision @ rank n:0.99

On Test Data:
KNN ROC:0.9903, precision @ rank n:0.95
  • 可以看到精度指标基本上和传入contamination参数时一致,说明了自动阈值确定算法的有效性。
    局部离群因子剔除异常值,异常检测,PyOD,ECOD,KNN

组合模型异常检测

  • 由于各模型无监督的性质,异常值检测经常会受到模型不稳定的影响。因此,建议组合各种检测器输出,例如通过平均,以提高其鲁棒性。
  • 本文主要展示四种分数组合机制:
    • Average:所有模型的平均分数。
    • Maximization:所有模型的最大分数。
    • Average of Maximum (AOM):将模型分为子组,并取每个子组的最大分数。最终成绩为所有小组成绩的平均分。
    • Maximum of Average (MOA):将模型分为子组,并取每个子组的平均分数。最终得分为所有小组得分中的最高分。
  • 因为各模型对数据变化的敏感性不同,所以在进行组合模型异常检测时,要先进行数据标准化
  • 我们将不同n_neighbors参数的KNN模型组合,然后将其训练集、测试集得分整合到一起
# 数据标准化
X_train_norm, X_test_norm = standardizer(X_train, X_test)

k_list = [10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140,
            150, 160, 170, 180, 190, 200]

n_clf = len(k_list)

train_scores = np.zeros([X_train.shape[0], n_clf])
test_scores = np.zeros([X_test.shape[0], n_clf])

for i in range(n_clf):
    k = k_list[i]

    clf = KNN(n_neighbors=k, method='largest')
    clf.fit(X_train_norm)
    
    train_scores_norm, test_scores_norm = standardizer(train_scores, test_scores)
    train_scores[:, i] = clf.decision_scores_
    test_scores[:, i] = clf.decision_function(X_test_norm)
  • 对各模型的得分进行标准化,然后进行组合
train_scores_norm, test_scores_norm = standardizer(train_scores, test_scores)
comb_by_average = average(test_scores_norm)
comb_by_maximization = maximization(test_scores_norm)
comb_by_median = median(test_scores_norm)
# 分为5组
comb_by_aom = aom(test_scores_norm, 5)
comb_by_moa = moa(test_scores_norm, 5)
  • 评估组合模型的检测精度
evaluate_print('Combination by Average', y_test, comb_by_average)
evaluate_print('Combination by Maximization', y_test, comb_by_maximization)
evaluate_print('Combination by Median', y_test,comb_by_median)
evaluate_print('Combination by AOM', y_test, comb_by_aom)
evaluate_print('Combination by MOA', y_test, comb_by_moa)

输出:文章来源地址https://www.toymoban.com/news/detail-645296.html

Combination by Average ROC:0.99, precision @ rank n:0.95
Combination by Maximization ROC:0.9886, precision @ rank n:0.95
Combination by Median ROC:0.9897, precision @ rank n:0.95
Combination by AOM ROC:0.9894, precision @ rank n:0.95
Combination by MOA ROC:0.9892, precision @ rank n:0.95
  • 因为数据为低纬,小样本数据,所以检测难度不高,用单一的KNN模型已经可以达到很好的精度了,所以使用组合模型提升的效果不明显。

异模型组合SUDO

  • PyOD库还提供了不同模型间组合的SUDO通道,也非常便捷
def suod_clf(detector_list, X_train, X_test, y_train, y_test, contamination=None):
    # 自动确定异常阈值
    if contamination == None:
        contamination = FILTER()
        print("Auto calculate contamination!!")
        
    clf = SUOD(base_estimators=detector_list, n_jobs=1, combination='average', verbose=False)
    clf.fit(X_train)

    # 获取训练数据的预测标签和异常值分数
    # 标签(0:正常值,1:异常值)
    y_train_pred = clf.labels_
    # 样本异常值分数
    y_train_scores = clf.decision_scores_

    # 获取测试数据的预测
    y_test_pred = clf.predict(X_test)
    # 预测标签(0:正常值,1:异常值)
    y_test_scores = clf.decision_function(X_test)

    # 预测置信度
    # 标签(0,1)和[0,1]范围内的置信度
    y_test_pred, y_test_pred_confidence = clf.predict(X_test, return_confidence=True)
    
    # 评估模型在训练集上的指标
    print("\nOn Training Data:")
    evaluate_print(model_name, y_train, y_train_scores)
    # 评估模型在测试集上的指标
    print("\nOn Test Data:")
    evaluate_print(model_name, y_test, y_test_scores)

    # 可视化检测效果
    visualize(model_name, X_train, y_train, X_test, y_test, y_train_pred,
          y_test_pred, show_figure=True, save_figure=False)
  • KNNECODIForest算法进行组合
# 初始化一组异常检测器
detector_list = [KNN(n_neighbors=10), KNN(n_neighbors=20),
                 KNN(n_neighbors=30), KNN(n_neighbors=40),
                 ECOD(), IForest(n_estimators=100),
                 IForest(n_estimators=200)]

# 决定并行进程的数量,以及组合方法
suod_clf(detector_list, X_train, X_test, y_train, y_test)

到了这里,关于异常检测算法库PyOD的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【重新定义matlab强大系列五】函数filloutliers检测并替换数据中的离群值

    🔗 运行环境:matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥  推荐专栏:《算法研究》 ####  防伪水印—— 左手の明天 #### 💗 大家好🤗🤗🤗,我是 左手の明天 !好久不见💗 💗今天开启新的系列—— 重新定义matlab强大系列

    2024年02月04日
    浏览(158)
  • SpringBoot 如何使用 @ExceptionHandler 注解进行局部异常处理

    在开发 Web 应用程序时,异常处理是非常重要的一部分。SpringBoot 提供了多种方式来处理异常,其中之一是使用 @ExceptionHandler 注解进行局部异常处理。使用 @ExceptionHandler 注解,我们可以在 Controller 层或方法级别上处理异常,而不用在整个应用程序中处理。 在本文中,我们将介

    2024年02月13日
    浏览(38)
  • 解密Spring MVC异常处理:从局部到全局,打造稳固系统的关键步骤

    😀前言 在现代软件开发中,异常处理是不可或缺的一部分,它能够有效地提高系统的稳定性和健壮性。在Spring MVC框架中,异常处理机制起着至关重要的作用,它允许开发者在程序运行过程中捕获、处理和报告异常,从而保障用户体验和系统可靠性。本文将带您深入探索Spr

    2024年02月10日
    浏览(44)
  • 基于局部信息提取的人脸标志检测算法matlab仿真

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 人脸检测 4.2 局部区域选择 4.3 特征提取 5.算法完整程序工程 matlab2022a         基于局部信息提取的人脸标志检测算法是计算机视觉和图像处理领域的重要研究方向。该算法旨在从人脸图像中准

    2024年01月19日
    浏览(80)
  • LoGoNet:基于局部到全局跨模态融合的精确 3D 目标检测

    论文地址:https://arxiv.org/abs/2303.03595 论文代码:https://github.com/sankin97/LoGoNet 激光雷达传感器点云通常是稀疏的,无法提供足够的上下文来区分远处的区域,从而造成性能次优。 激光雷达-摄像机融合方法在三维目标检测中表现出了良好的性能。目前先进的多模态方法主要进行

    2024年02月09日
    浏览(45)
  • Android双指缩放ScaleGestureDetector检测放大因子大图移动到双指中心点ImageView区域中心,Kotlin

      在 Android双击图片放大移动图中双击点到ImageView区域中心,Kotlin-CSDN博客 基础上,这次使用ScaleGestureDetector检测两根手指的缩放动作,记录两根手指的中心点位置,根据ScaleGestureDetector检测到的缩放因子(系数),放大原图,并移动放大前两根手指中心点在原图的位置移动到

    2024年01月23日
    浏览(59)
  • 【重新定义matlab强大系列三】MATLAB清洗离群数据(查找、填充或删除离群值)

    🔗 运行环境:matlab 🚩 撰写作者:左手の明天 🥇 精选专栏:《python》 🔥  推荐专栏:《算法研究》 ####  防伪水印—— 左手の明天 #### 💗 大家好🤗🤗🤗,我是 左手の明天 !好久不见💗 💗今天开启新的系列—— 重新定义matlab强大系列 💗 📆 

    2024年02月04日
    浏览(47)
  • Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver),前后端解决跨域问题(@CrossOrigin(局部解决)自定义跨域配置类(全局))

    学习视频:【编程不良人】2021年SpringBoot最新最全教程 异常处理作用:用来解决整合系统中任意一个控制器抛出异常时的统一处理入口 传统单体架构下的处理方式 配置全局异常处理类 resolveException :当控制器方法出现异常时,如果该方法没有try...catch,则会进入当前方法 针

    2024年02月04日
    浏览(67)
  • 中位数绝对偏差(MAD)法处理离群值

    作者:非妃是公主 专栏:《数学建模》 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 中位数绝对偏差(MAD)是由Hampel(1974)发现并推广的,中位数(M)和平均数(mean)一样,是中心趋势的衡量标准,但它的优点是对异常值的存在非常不敏感。异常检测

    2024年02月08日
    浏览(42)
  • 异常检测模型:SparkMLlib库的异常检测模型

    异常检测模型是一种常用的数据分析和预测方法,用于识别数据中的异常点。在许多应用中,异常检测模型可以帮助我们发现数据中的潜在问题,从而提高数据质量和预测准确性。本文将介绍SparkMLlib库中的异常检测模型,包括其背景、核心概念、算法原理、实际应用场景和最

    2024年02月19日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包