当前位置: 首页 > news >正文

Python异常检测:Isolation Forest与局部异常因子(LOF)详解

这里写目录标题

  • Python异常检测:Isolation Forest与局部异常因子(LOF)详解
    • 引言
    • 一、异常检测的基本原理
      • 1.1 什么是异常检测?
      • 1.2 异常检测的应用场景
    • 二、Isolation Forest
      • 2.1 Isolation Forest的原理
        • 2.1.1 算法步骤
      • 2.2 Python实现
      • 2.3 案例分析
        • 2.3.1 数据准备
        • 2.3.2 模型训练与预测
    • 三、局部异常因子(LOF)
      • 3.1 LOF的原理
        • 3.1.1 算法步骤
      • 3.2 Python实现
      • 3.3 案例分析
        • 3.3.1 模型训练与预测
    • 四、比较Isolation Forest和LOF
      • 4.1 优缺点
      • 4.2 适用场景
    • 五、实际应用案例
      • 5.1 例子1:金融欺诈检测
        • 5.1.1 数据准备
        • 5.1.2 模型训练与预测
      • 5.2 例子2:网络入侵检测
        • 5.2.1 数据准备
        • 5.2.2 模型训练与预测
    • 六、总结

Python异常检测:Isolation Forest与局部异常因子(LOF)详解

引言

异常检测是数据分析中的一项重要任务,它用于识别与大多数数据点显著不同的异常数据。这些异常可能是错误的测量、欺诈行为或其他感兴趣的罕见事件。在本篇博客中,我们将深入探讨两种常用的异常检测算法:Isolation Forest局部异常因子(LOF)。我们将通过多个案例展示如何在Python中实现这些算法,并使用面向对象的思想构建可复用的代码。


一、异常检测的基本原理

1.1 什么是异常检测?

异常检测是指通过分析数据集中的样本,识别出那些显著偏离其他样本的观测点。这些异常点可能具有以下特点:

  • 远离大多数数据点。
  • 由于测量错误或故障而产生。
  • 表示潜在的欺诈行为或攻击。

1.2 异常检测的应用场景

  • 金融欺诈检测:识别不寻常的交易活动。
  • 网络安全:检测潜在的入侵行为。
  • 质量控制:监测生产过程中的异常情况。

二、Isolation Forest

2.1 Isolation Forest的原理

Isolation Forest是一种基于树的算法,通过随机选择特征并划分数据来“孤立”异常点。由于异常点通常比正常点更容易被孤立,因此该算法可以有效地区分异常数据和正常数据。

2.1.1 算法步骤
  1. 构建随机森林:随机选择特征和切分点,构建多棵决策树。
  2. 孤立点评估:通过每个数据点在森林中被孤立的深度来评估其异常程度,孤立深度越浅,越可能是异常点。

2.2 Python实现

我们将创建一个IsolationForestDetector类,用于实现Isolation Forest算法。

import numpy as np
from sklearn.ensemble import IsolationForestclass IsolationForestDetector:def __init__(self, contamination=0.1):self.contamination = contaminationself.model = IsolationForest(contamination=self.contamination)def fit(self, X):self.model.fit(X)def predict(self, X):return self.model.predict(X)  # 返回1表示正常点,-1表示异常点def score_samples(self, X):return self.model.decision_function(X)  # 返回每个样本的异常评分

2.3 案例分析

我们将使用一个合成数据集来展示Isolation Forest的效果。

2.3.1 数据准备
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt# 创建合成数据集
X, _ = make_blobs(n_samples=300, centers=1, cluster_std=0.60, random_state=0)
# 添加异常点
X = np.vstack([X, np.array([[3, 3], [3, 4], [3, 5]])])# 可视化数据
plt.scatter(X[:, 0], X[:, 1])
plt.title('Data with Outliers')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
2.3.2 模型训练与预测
# 使用Isolation Forest进行异常检测
detector = IsolationForestDetector(contamination=0.1)
detector.fit(X)# 预测异常点
predictions = detector.predict(X)# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=predictions, cmap='coolwarm')
plt.title('Isolation Forest Anomaly Detection')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

三、局部异常因子(LOF)

3.1 LOF的原理

局部异常因子(Local Outlier Factor, LOF)是一种基于密度的异常检测算法。它通过比较数据点与其邻居的密度来识别异常。LOF值越大,表示该点的密度与其邻居的密度差异越大,越可能是异常点。

3.1.1 算法步骤
  1. 计算k邻居:为每个数据点找到k个最近邻居。
  2. 计算局部可达密度:基于邻居的距离,计算每个点的密度。
  3. 计算LOF值:比较每个点的密度与其邻居的密度,得到LOF值。

3.2 Python实现

我们将创建一个LOFDetector类,用于实现LOF算法。

from sklearn.neighbors import LocalOutlierFactorclass LOFDetector:def __init__(self, n_neighbors=20):self.n_neighbors = n_neighborsself.model = LocalOutlierFactor(n_neighbors=self.n_neighbors)def fit(self, X):self.model.fit(X)def predict(self, X):return self.model.fit_predict(X)  # 返回1表示正常点,-1表示异常点def score_samples(self, X):return -self.model.negative_outlier_factor_  # 返回每个样本的异常评分

3.3 案例分析

我们将使用相同的合成数据集来展示LOF的效果。

3.3.1 模型训练与预测
# 使用LOF进行异常检测
lof_detector = LOFDetector(n_neighbors=5)
lof_detector.fit(X)# 预测异常点
lof_predictions = lof_detector.predict(X)# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=lof_predictions, cmap='coolwarm')
plt.title('LOF Anomaly Detection')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

四、比较Isolation Forest和LOF

4.1 优缺点

特性Isolation ForestLOF
可解释性中等
处理大数据的能力较好中等
对异常的敏感性对全局异常更敏感对局部异常更敏感
算法复杂度O(n log n)O(n^2)(通常情况下)

4.2 适用场景

  • Isolation Forest:适合大规模数据集,尤其是当数据分布较为均匀时。
  • LOF:适合数据集存在明显局部结构的情况,例如聚类数据。

五、实际应用案例

5.1 例子1:金融欺诈检测

假设我们要检测金融交易中的异常行为。我们可以使用Isolation Forest或LOF算法来分析交易数据,识别潜在的欺诈行为。

5.1.1 数据准备
import pandas as pd# 加载交易数据集
# transactions = pd.read_csv('transactions.csv')  # 假设有一个交易数据集
# 这里我们使用合成数据进行演示
np.random.seed(0)
normal_transactions = np.random.normal(loc=100, scale=20, size=(1000, 2))
fraudulent_transactions = np.random.normal(loc=200, scale=30, size=(50, 2))
X_fraud = np.vstack([normal_transactions, fraudulent_transactions])# 可视化数据
plt.scatter(X_fraud[:, 0], X_fraud[:, 1])
plt.title('Transaction Data')
plt.xlabel('Transaction Amount')
plt.ylabel('Transaction Time')
plt.show()
5.1.2 模型训练与预测
# 使用Isolation Forest进行金融欺诈检测
detector_fraud = IsolationForestDetector(contamination=0.05)
detector_fraud.fit(X_fraud)# 预测异常交易
fraud_predictions = detector_fraud.predict(X_fraud)# 可视化结果
plt.scatter(X_fraud[:, 0], X_fraud[:, 1], c=fraud_predictions, cmap='coolwarm')
plt.title('Fraud Detection using Isolation Forest')
plt.xlabel('Transaction Amount')
plt.ylabel('Transaction Time')
plt.show()

5.2 例子2:网络入侵检测

我们可以应用LOF算法来检测网络流量中的异常行为,识别潜在的入侵。

5.2.1 数据准备
# 加载网络流量数据集(合成数据)
# network_data = pd.read_csv('network_traffic.csv')  # 假设有一个网络流量数据集
# 这里我们使用合成数据进行演示
X_network = np.random.normal(loc=0, scale=1, size=(1000, 2))
X_network = np.vstack([X_network, np.random.normal(loc=5, scale=1, size=(50, 2))])  # 添加异常流量# 可视化数据
plt.scatter(X_network[:, 0], X_network[:, 1])
plt.title('Network Traffic Data')
plt.xlabel('Packet Size')
plt.ylabel('Packet Time')
plt.show()
5.2.2 模型训练与预测
# 使用LOF进行网络入侵检测
lof_network_detector = LOFDetector(n_neighbors=10)
lof_network_detector.fit(X_network)# 预测异常流量
network_predictions = lof_network_detector.predict(X_network)# 可视化结果
plt.scatter(X_network[:, 0], X_network[:, 1], c=network_predictions, cmap='coolwarm')
plt.title('Intrusion Detection using LOF')
plt.xlabel('Packet Size')
plt.ylabel('Packet Time')
plt.show()

六、总结

本文详细探讨了异常检测中的两种常用算法:Isolation Forest和局部异常因子(LOF)。我们通过多个案例展示了如何使用Python实现这些算法,并使用面向对象的思想来构建代码,以增强可读性和复用性。这些算法在金融欺诈检测、网络安全和其他领域都有着广泛的应用,希望本文能帮助读者深入理解异常检测的基本概念与实现方法。

相关文章:

Python异常检测:Isolation Forest与局部异常因子(LOF)详解

这里写目录标题 Python异常检测:Isolation Forest与局部异常因子(LOF)详解引言一、异常检测的基本原理1.1 什么是异常检测?1.2 异常检测的应用场景 二、Isolation Forest2.1 Isolation Forest的原理2.1.1 算法步骤 2.2 Python实现…...

Git的原理和使用(二)

1. git的版本回退 之前我们也提到过,Git 能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现 之前前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本 回退的功能…...

docker 发布镜像

如果要推广自己的软件,势必要自己制作 image 文件。 1 制作自己的 Docker 容器 基于 centos 镜像构建自己的 centos 镜像,可以在 centos 镜像基础上,安装相关的软件,之后进行构建新的镜像。 1.1 dockerfile 文件编写 首先&…...

投了15亿美元,芯片创新公司Ampere为何成了Oracle真爱?

【科技明说 | 科技热点关注】 一个数据库软件公司却想要操控一家芯片厂商,这样的想法不错。也真大胆。 目前,全球数据库巨头甲骨文Oracle已经持有Ampere Computing LLC 29%的股份,并有可能通过未来的投资选择权获得对这家芯片制造…...

vue 报告标题时间来自 elementUI的 el-date-picker 有开始时间和结束时间

要在Vue中使用 Element UI 的 el-date-picker 来选择开始时间和结束时间,并将其展示在报告中,以下是详细的实现步骤。 实现思路: 使用 Element UI 的 el-date-picker 组件,让用户选择时间范围(开始时间和结束时间&am…...

简单几何问题的通解

来,这道题怎么做?边长为2的正方形内,2个扇形的交集面积是多少?这道题一定要画辅助线,因为要用到两个扇形的交点,如果不画辅助线,这个交点相关的4个子图一个都无法求出面积,只能求出子…...

DBeaver导出数据表结构和数据,导入到另一个环境数据库进行数据更新

在工作中,我们会进行不同环境之间数据库的数据更新,这里使用DBeaver导出新的数据表结构和数据,并执行脚本,覆盖另一个环境的数据库中对应数据表,完成数据表的更新。 一、导出 右键点击选中想要导出的数据表&#xff0…...

【Golang】合理运用泛型,简化开发流程

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...

OpenCV单目相机内参标定C++

基于OpenCV 实现单目相机内参标定: a.使用OpenCV库实现内参标定过程。通过角点检测、亚像素角点定位、角点存储与三维坐标生成和摄像机标定分别获取左右相机的内参。 b.具体地,使用库函数检测两组图像(左右相机拍摄图像)中棋盘格…...

基于MATLAB(DCT DWT)

第三章 图像数字水印的方案 3.1 图像数字水印的技术方案 在数据库中存储在国际互联网上传输的水印图像一般会被压缩,有时达到很高的压缩比。因此,数字水印算法所面临的第一个考验就是压缩。JPEG和EZW(Embedded Zero-Tree Wavelet&#xff0…...

渗透基础-rcube_webmail版本探测

简介 本文介绍了开源产品RoundCube webmail邮件系统的版本探测思路,并用go语言实现工具化、自动化探测。 正文 0x01 探测思路研究 探测系统版本,最理想的方法就是系统主页html代码中有特定的字符串,比如特定版本对应的hash在主页的html代…...

linux下编译鸿蒙版boost库

我在上一篇文章中介绍了curl和openssl的编译方式(linux下编译鸿蒙版curl、openssl-CSDN博客),这篇再介绍一下boost库的编译。 未经许可,请勿转载! 一.环境准备 1.鸿蒙NDK 下载安装方式可以参考上篇文章&#xff0c…...

滚雪球学Redis[6.3讲]:Redis分布式锁的实战指南:从基础到Redlock算法

全文目录: 🎉前言🚦Redis分布式锁的概念与应用场景🍃1.1 什么是分布式锁?🍂1.2 应用场景 ⚙️使用Redis实现分布式锁🌼2.1 基本思路🌻2.2 示例代码🥀2.3 代码解析 &#…...

springboot二手汽车交易平台-计算机毕业设计源码82053

目录 1 绪论 1.1研究背景 1.2研究意义 1.3国内外研究现状 2 二手汽车交易平台系统分析 2.1 可行性分析 2.2 系统流程分析 2.3 功能需求分析 2.4 性能需求分析 3 二手汽车交易平台概要设计 3.1 系统体系结构设计 3.2总体功设计 3.3子模块设计设计 3.4 数据库设计 …...

typescript 中的类型推断

在 TypeScript 中,类型推断(Type Inference)是一种编译器自动确定变量或表达式类型的能力。这大大减少了需要显式声明类型的代码量,使得代码更加简洁和易读。TypeScript 的类型推断机制非常强大,可以在很多情况下自动推…...

linux 隐藏文件

在Linux中,隐藏文件以点(.)开头的文件或文件夹被认为是隐藏文件。隐藏文件通常用于存储系统配置文件或敏感文件。 以下是几种不同的方法来隐藏文件或文件夹: 方法1:在文件或文件夹名字前面加上点(.&#…...

【网络协议栈】Tcp协议(上)结构的解析 和 Tcp中的滑动窗口(32位确认序号、32位序号、4位首部长度、6位标记位、16为窗口大小、16位紧急指针)

绪论​ “没有那么多天赋异禀,优秀的人总是努力翻山越岭。”本章主要讲到了再五层网络协议从上到下的第二层传输层中使用非常广泛的Tcp协议他的协议字段结构,通过这些字段去认识其Tcp协议运行的原理底层逻辑和基础。后面将会再写一篇Tcp到底是通过什么调…...

手表玻璃盖板视觉贴合

在手表生产过程中,贴合加工是一个至关重要的环节,它涉及将手表的盖板与LCM模组或各种功能片进行精准贴合。这一过程不仅要求高度的精度,还追求效率与稳定性,以满足现代可穿戴设备日益增长的市场需求。然而,当前行业在这…...

电信和互联网行业数据安全评估师CCRC-DSA人才强基计划

“电信和互联网行业数据安全人才强基计划”(以下简称“强基计划”)自 2022 年 4 月启动伊始,始终秉持以人才需求为导向,以体系化能力建设为重点,扎实铸就数据安全人才培养品牌,力促行业数据安全人才培养工作…...

MQTTnet 4.3.7.1207 (最新版)使用体验,做成在线客服聊天功能,实现Cefsharp的物联的功能(如远程打开新网址)

一、MQTTnet 4.3.x版本客户端 将客户端集成到 cefsharp 定制浏览器中,实现物联网功能 网上很多代码是3.x版本代码,和4.x版本差异性较大,介绍较为简单或不系统 二、部分代码说明 初始化,初始化》连接服务端》发布上线信息(遗嘱)ConnectAsync等 订阅主题:SubscribeAsync 接…...

将java项目jar包打包成exe服务

1.结构展示 2.注意事项 前提: 环境准备:jdk8 和 .net支持 { 1.控制面板》程序和功能》启用和关闭windows功能》.net的勾选》2.jdk8自行百度安装环境3.其他项目必须的软件环境安装等(数据库...) }第一次准备: 1.将打包好的jar包放到premiumServices.exe…...

Django请求响应对象

在 Django 中,请求(request)和响应(response)对象是处理 HTTP 请求和返回 HTTP 响应的核心。它们分别由 Django 的 HttpRequest 和 HttpResponse 类表示。 HttpRequest 对象 HttpRequest 对象包含了客户端发送的所有…...

DevExpress中文教程 - 如何在静态SSR模式下使用Blazor Drawer组件?

Microsoft的 .NET 8 UI框架引入了静态服务器端呈现模式(静态SSR)——组件在服务器端呈现,然后返回到客户端,没有任何交互,DevExpress Blazor Drawer组件需要交互式呈现模式来动态地改变其IsOpen状态。 在本文中&#…...

商汤科技十周年公布新战略,将无缝集成算力、模型及应用

10月18日,恰逢商汤科技十周年庆典,“2024商汤十周年国际论坛:迈向AI 2.0共融新时代”在香港科学园成功举办。 据「TMT星球」了解,来自全球的行业领袖、政府代表、AI专家共聚于此,共同探讨AI行业的未来。 活动上&…...

【如何获取股票数据07】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深A股历史分时MA数据获取实例演示及接口API说明文档

最最近一两年内,股票量化分析逐渐成为热门话题。而从事这一领域工作的第一步,就是获取全面且准确的股票数据。因为无论是实时交易数据、历史交易记录、财务数据还是基本面信息,这些数据都是我们进行量化分析时不可或缺的宝贵资源。我们的主要…...

Rust语法基础

注释 所有的开发者都在努力使他们的代码容易理解,但有时需要额外的解释。在这种情况下,开发者在他们的源码中留下注释,编译器将会忽略掉这些内容,但阅读源码的人可能会发现有用。 和大多数的编程语言一样,主要有一下两种: 单行注释 // 多行注释 /* */ 基本数据类型 Ru…...

AWS WAF实现API安全防护

在当今的互联网环境中,API安全防护变得越来越重要。本文将介绍如何使用AWS WAF(Web Application Firewall)来实现有效的API安全防护策略。 背景 我们有一个API服务,其URL模式如下: https://dev.example.com/bff-app/sec/v1/module-a/feature-a/sub-feature-a我们需要使用AWS…...

vue将table转换为pdf导出

安装依赖&#xff1a; 首先&#xff0c;你需要安装 jspdf 和 html2canvas 这两个库。 npm install jspdf html2canvas创建Vue组件&#xff1a; 创建一个Vue组件&#xff0c;用于显示表格并提供导出PDF的功能。 <template> <div> <div id"table-contain…...

20240818 字节跳动 笔试

文章目录 1、编程题1.11.21.31.4岗位:BSP驱动开发工程师-OS 题型:4 道编程题 1、编程题 1.1 小红的三消游戏: 小红在玩一个三消游戏,游戏中 n 个球排成一排,每个球都有一个颜色。若有 3 个颜色相同的球连在一起,则消除这 3 个球,然后剩下的球会重新连在一起。在没有 …...

在Debian上安装向日葵

说明&#xff1a; 因为之前服务器上安装了 PVE (Proxmox VE)&#xff0c;之前是用 Proxmox VE 进行服务器资源管理的。出于某些原因&#xff0c;现在不再通过 PVE构建的虚拟机来使用计算资源&#xff0c;而是通过 PVE 自带的 Debian 系统直接使用虚拟机资源&#xff08;因为积…...