机器学习——异常检测
异常点检测(Outlier detection),⼜称为离群点检测,是找出与预期对象的⾏为差异较⼤的对象的⼀个检测过程。这些被检测出的对象被称为异常点或者离群点。异常点(outlier)是⼀个数据对象,它明显不同于其他的数据对象。异常点检测的应用也十分广泛,例如:信用卡反欺诈、工业损毁检测、广告点击反作弊、刷单检测和羊毛党检测等等。
一般异常检测是无监督学习,因为它不是二分类而是多分类问题。

**问题1:**为什么要用无监督异常检测方法?
很多场景没有标签或者标签很少,不能进行监督训练;而且样本总是在发生变化。
目前主流的异常检测方法的基本原理都是基于样本间的相似度:距离、密度、角度、隔离所需的难度和簇等等。
常见的异常检测有:
- Z-Score检验——统计学方法
- Local Outlier Factor
- 孤立森林
Z-Score检验
通过ZScore将正态分布的数据转化为标准正态分布数据,公式下:
Z s c o r e = ( x − u ) σ Zscore = \frac{(x-u)}{\sigma} Zscore=σ(x−u)

如果符合正态分布,则有68%的数据在± σ \sigma σ之间;95%的数据在±2 σ \sigma σ之间;有99.7%的数据在±3 σ \sigma σ之间。
但大部分场景的数据都不满足正态分布的数据。
Local Outlier Factor(LOF算法)
LOF算法是基于密度的异常检测算法,它会为每个数据点计算一个分数,通过分数的大小来判断数据是否异常。
LOF算法的流程如下:
1)⾸先对样本空间进⾏去重,分别计算每⼀个样本到样本空间内其余点的距离。
2)将步骤1中的距离升序排列。
3)指定近邻样本个数k,对于每个样本点,寻找其k近邻样本,然后计算LOF分数,作为异常分数。

LOF例子
还是以评分卡模型数据为例。
from pyod.models.lof import LOF
import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score,roc_curve,auc,recall_scoredata = pd.read_csv('Bcard.txt')
feature_lst = ['person_info','finance_info','credit_info','act_info']
# 划分数据
train = data[data.obs_mth != '2018-11-30'].reset_index().copy()
val = data[data.obs_mth == '2018-11-30'].reset_index().copy()
x = train[feature_lst]
y = train['bad_ind']
# 使用lof进行异常点检测
lof_clf = LOF(n_neighbors=20,algorithm='auto')
lof_clf.fit(x)
out_pred = lof_clf.predict_proba(x)[:,1]
train['out_pred'] = out_pred
# 确定得分边界值
key = train['out_pred'].quantile(0.95)
lof_x = train[train.out_pred<key][feature_lst]
lof_y = train[train.out_pred<key]['bad_ind']
val_x = val[feature_lst]
val_y = val['bad_ind']# 训练模型
lr_model = LogisticRegression(C=0.1,class_weight='balanced')
lr_model.fit(lof_x,lof_y)# 训练集
print('lof异常检测后训练集的ks值')
y_pred = lr_model.predict_proba(lof_x)[:,1] #取出训练集预测值
fpr_lr_train,tpr_lr_train,_ = roc_curve(lof_y,y_pred) #计算TPR和FPR
train_ks = abs(fpr_lr_train - tpr_lr_train).max() #计算训练集KS
print('train_ks : ',train_ks)#验证集
y_pred = lr_model.predict_proba(val_x)[:,1] #计算验证集预测值
fpr_lr,tpr_lr,_ = roc_curve(val_y,y_pred) #计算验证集预测值
val_ks = abs(fpr_lr - tpr_lr).max() #计算验证集KS值
print('lof异常检测后验证集的ks值')
print('val_ks : ',val_ks)from matplotlib import pyplot as plt
plt.plot(fpr_lr_train,tpr_lr_train,label = 'train LR')
plt.plot(fpr_lr,tpr_lr,label = 'evl LR')
plt.plot([0,1],[0,1],'k--')
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.title('ROC Curve')
plt.legend(loc = 'best')
plt.show()

Isolation Forest(IF算法)
IF是采用二叉树的方法对数据进行切分,数据点在二叉树中的数据深度反应了该条数据的‘疏离’程度。整个过程也是训练跟预测两个步骤:
- 训练:抽取多个样本,构建多棵二叉树
- 预测:综合多棵二叉树的结果,计算每个数据点的异常值
我们以一维数据来进行简单理解IF算法的思想,我们有一个一维数据,想将A和B点切分出来:
(1)现在最大值和最小值之间随机选择一个x值,将大于x值和小于x值的数据分为两组;
(2)在两组数据中重复以上步骤,直到数据不可分,因为B点跟其他数据更远,所以只要比较少次数就能分离
(3)A点由于跟其他数据比较近,所以需要更多的次数才能切分出来。

我们不必了解它的公式,我们直到它最后的分值即可:
- 如果数据x在多个二叉树的平均路径长度都比较短,得分比较接近1,则数据x越异常;
- 如果数据x在多个二叉树的平均路径长度都比较长,则得分更接近0,则数据x越正常;
- 如果数据x在多个二叉树的平均路径长度是平均值,则得分为0.5。
IF例子
同LOF使用一样的数据
from pyod.models.iforest import IForestdata = pd.read_csv('Bcard.txt')
feature_lst = ['person_info','finance_info','credit_info','act_info']
# 划分数据
train = data[data.obs_mth != '2018-11-30'].reset_index().copy()
val = data[data.obs_mth == '2018-11-30'].reset_index().copy()
x = train[feature_lst]
y = train['bad_ind']if_clf = IForest(behaviour='new', n_estimators=500, n_jobs=-1)
if_clf.fit(x)
out_pred = if_clf.predict_proba(x,method='linear')[:,1]
train['out_pred'] = out_predif_x = train[train.out_pred<0.7][feature_lst]
if_y = train[train.out_pred<0.7]['bad_ind']
val_x = val[feature_lst]
val_y = val['bad_ind']# 训练模型
lr_model = LogisticRegression(C=0.1,class_weight='balanced')
lr_model.fit(if_x,if_y)# 训练集
print('参数调整前的ks值')
y_pred = lr_model.predict_proba(if_x)[:,1] #取出训练集预测值
fpr_lr_train,tpr_lr_train,_ = roc_curve(if_y,y_pred) #计算TPR和FPR
train_ks = abs(fpr_lr_train - tpr_lr_train).max() #计算训练集KS
print('train_ks : ',train_ks)#验证集
y_pred = lr_model.predict_proba(val_x)[:,1] #计算验证集预测值
fpr_lr,tpr_lr,_ = roc_curve(val_y,y_pred) #计算验证集预测值
val_ks = abs(fpr_lr - tpr_lr).max() #计算验证集KS值
print('val_ks : ',val_ks)from matplotlib import pyplot as plt
plt.plot(fpr_lr_train,tpr_lr_train,label = 'train LR')
plt.plot(fpr_lr,tpr_lr,label = 'evl LR')
plt.plot([0,1],[0,1],'k--')
plt.xlabel('False positive rate')
plt.ylabel('True positive rate')
plt.title('ROC Curve')
plt.legend(loc = 'best')
plt.show()

验证集的KS值有一定的上升。
原数据的ks值如下:

相关文章:
机器学习——异常检测
异常点检测(Outlier detection),⼜称为离群点检测,是找出与预期对象的⾏为差异较⼤的对象的⼀个检测过程。这些被检测出的对象被称为异常点或者离群点。异常点(outlier)是⼀个数据对象,它明显不同于其他的数据对象。异…...
小研究 - 一种复杂微服务系统异常行为分析与定位算法(一)
针对极端学生化偏差(Extreme Studentized &#…...
代码版本管理工具 git
1. 去B站看视频学习,只看前39集: 01-Git概述(Git历史)_哔哩哔哩_bilibili 2.学习Linux系统文本编辑器的使用 vi编辑器操作指令分享 (baidu.com) (13条消息) nano编辑器的使用_SudekiMing的博客-CSDN博客 windows下载安装Git官…...
【计算机视觉中的 GAN 】如何稳定GAN训练(3)
一、说明 在上一篇文章中,我们达到了理解未配对图像到图像翻译的地步。尽管如此,在实现自己的超酷深度GAN模型之前,您必须了解一些非常重要的概念。如本文所提的GAN模型新成员的引入:Wasserstein distance,boundary eq…...
一文讲清楚地图地理坐标系
前言 我最近在做一个和地图有关的项目,这里本人地图采用的是mapbox,其中涉及一个功能需要根据用户输入的地点直接定位到地图上的对应的位置,本人开始想的是直接调用百度的接口根据地名直接获取坐标,发现在地图上的位置有偏移不够…...
助力青少年科技创新人才培养,猿辅导投资1亿元设立新基金
近日,在日本千叶县举办的2023年第64届国际数学奥林匹克(IMO)竞赛公布比赛结果,中国队连续5年获得团体第一。奖牌榜显示,代表中国参赛的6名队员全部获得金牌。其中,猿辅导学员王淳稷、孙启傲分别以42分、39分…...
代码随想录算法训练营之JAVA|第十八天| 235. 二叉搜索树的最近公共祖先
今天是第 天刷leetcode,立个flag,打卡60天,如果做不到,完成一件评论区点赞最高的挑战。 算法挑战链接 235. 二叉搜索树的最近公共祖先https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/descriptio…...
IO进程线程第五天(8.2)进程函数+XMind(守护进程(幽灵进程),输出一个时钟,终端输入quit时退出时钟)
1.守护进程(幽灵进程) #include<stdio.h> #include<head.h> int main(int argc, const char *argv[]) {pid_t cpid fork();if(0cpid){ //创建新的会话pid_t sidsetsid();printf("sid%d\n",sid);//修改运行目录为不可卸载的文件…...
物联网远程智能控制设备——开关量/正反转百分比控制
如今生产生活的便利性极大程度上得益于控制技术的发展,它改变了传统的工作模式,并将人们从【纯劳力】中解放出来。如今,随着科学技术的进步,控制器的种类及应用领域也越来越多。 物联网远程智能控制设备就是一种新型的、能够用于…...
echarts图表基本使用
折线图 import * as echarts from echarts;const chartDom document.getElementById(main); const myChart echarts.init(chartDom); const option {xAxis: {type: category,data: [Mon, Tue, Wed, Thu, Fri, Sat, Sun]},yAxis: {type: value},series: [{data: [820, 932, …...
排序进行曲-v1.0
排序 排序是将一组数据按照一定的规则进行排列的过程。在计算机科学中,排序是一 种常见的算法问题,通常用于对数据进行整理、查找、统计等操作。概念解读 基本概念 排序算法:排序算法是实现数据排序的具体方法。常见的排序算法包括冒泡排序…...
算法入门篇——用位运算解决一些问题
目录 1.判断一个数是2的次方数 2.统计一个数,它的二进制数中,1的个数 3.在2*(n-1)个数中,找到只出现一次的那个数 1.判断一个数是2的次方数 这个问题有好几种做法,但是最优雅的解法是用’位运算‘来做。…...
腾讯云-宝塔添加MySQL数据库
1. 数据库菜单 2. 添加数据库 3. 数据库添加成功 4. 上传数据库文件 5. 导入数据库文件 6. 开启数据库权限 7. 添加安全组 (宝塔/腾讯云) 8. Navicat 连接成功...
【雕爷学编程】MicroPython动手做(27)——物联网之掌控板小程序
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...
Mysql删除重复数据通用SQL
在日常开发过程中,可能会出现一些 bug,导致 Mysql 数据库数据重复,需要删除重复数据,这里记录下删除重复数据的通用 SQL ,方便以后需要时查阅 1、写法一 DELETE t1 FROMtbl_name t1 INNER JOIN tbl_name t2 WHEREt1.…...
“快速入门Spring Boot:从零开始构建Web应用程序“
标题:快速入门Spring Boot:从零开始构建Web应用程序 摘要:本文将介绍如何使用Spring Boot从零开始构建一个简单的Web应用程序。我们将学习如何配置和启动Spring Boot应用程序,创建控制器和路由,以及如何使用模板引擎来…...
微信小程序tab加列表demo
一、效果 代码复制即可使用,记得把图标替换成个人工程项目图片。 微信小程序开发经常会遇到各种各样的页面组合,本demo为list列表与tab组合,代码如下: 二、json代码 {"usingComponents": {},"navigationStyle&q…...
深入挖掘地核和地幔之间的相互作用
一本新书介绍了我们在理解地核-地幔相互作用和共同进化方面的重大进展,并展示了提高我们对地球深层过程的洞察力的技术发展。 与地核-地幔共同演化相关的地球深层结构和动力学的图示。图片来源:白石千寻 Editors Vox是 AGU 出版部的博客。 地球深层内部很…...
网络:SecureCRT介绍
1. 使用Tab键补全时出现^I,如下操作...
我的512天创作纪念日
眼馋csdn发的虚拟徽章,所以写此文。个人总结,无技术分享。 机缘 写代码的机缘,在于听说这个挣钱多,坐办公室,凤吹不着,雨淋不着。 而写blog的机缘,则在于是自己的技术的总结,经常是…...
「码动四季·开源同行」go语言:统一认证与授权如何保障服务安全
认证与授权对于当前的互联网应用是非常重要的基础功能:认证用于验证当前用户的身份,而授权意味着用户在认证成功后,会被系统授予访问系统资源的权限。只有具备相应身份和权限的人才能访问系统中的相应资源,比如在购物网站中你只能…...
数据库索引原理:B+树与哈希索引的深度对决
数据库索引原理:B树与哈希索引的深度对决在数据库的世界里,索引是提升查询性能的“核武器”。如果把数据库表比作一本厚厚的书,那么索引就是书中的目录。没有目录,想要找到特定的知识点只能一页页翻找(全表扫描&#x…...
从快捷菜单到设置项:Android 11电池功能全移除实战指南
Android 11企业级设备电池功能深度定制指南 在工业平板、自助终端等专用设备场景中,系统界面的精简与定制往往比通用功能更重要。想象一下,一台用于仓库管理的工业平板,电池状态显示不仅毫无意义,还可能引发不必要的用户困惑——…...
从抓包实战到协议栈:深入解析DDS核心报文与通信机制
1. 从HelloWorld抓包开始认识DDS 第一次接触DDS协议时,很多人会被各种专业术语搞得晕头转向。其实最快的学习方式就是从实际案例入手——就像我当初用Fast DDS的HelloWorld示例做实验那样。这个经典案例包含一个发布者和一个订阅者,正好能展示DDS最核心…...
JVS-APS智能排产后如何配置移动端扫码报工
报工是在工厂中,确定人员/产线按照计划执行后,提交生产结果数据,那么在APS 完成计划排产后,如何能便捷的报工,下面我们有JVS快速开发平台做了一个报工的应用,实现 aps-mes 之间 任务下发与任务结果反馈的整…...
告别Node版本混乱!用NVM管理多项目环境(Mac保姆级指南+Zsh配置)
告别Node版本混乱!用NVM管理多项目环境(Mac保姆级指南Zsh配置) 在开发过程中,你是否遇到过这样的场景:接手一个老项目时,发现它依赖Node.js 12.x版本,而新项目却要求使用18.x甚至更高版本&#…...
传统文化与现代AI结合:Guohua Diffusion国风绘画商业应用案例
传统文化与现代AI结合:Guohua Diffusion国风绘画商业应用案例 1. 国风绘画生成工具概述 Guohua Diffusion是一款专为国风绘画设计的本地生成工具,基于原生Guohua-Diffusion模型开发。这款工具完美融合了中国传统绘画艺术与现代AI技术,为艺术…...
GPU算力高效利用:Pixel Language Portal在单卡多实例部署中的资源隔离与负载均衡教程
GPU算力高效利用:Pixel Language Portal在单卡多实例部署中的资源隔离与负载均衡教程 1. 引言:为什么需要单卡多实例部署 在AI应用开发中,GPU资源往往是稀缺且昂贵的。Pixel Language Portal作为一款基于Tencent Hunyuan-MT-7B的高端翻译工…...
Java微服务在Istio中出现“偶发503 no healthy upstream”?7分钟定位Sidecar健康检查盲区与Liveness Probe冲突真相
第一章:Java微服务在Istio中偶发503问题的现象与影响在基于Istio构建的服务网格环境中,Java微服务(尤其是采用Spring Cloud Kubernetes或原生Spring Boot Istio Sidecar部署模式)频繁出现偶发性HTTP 503 Service Unavailable响应…...
MinerU智能文档理解镜像:财务报表自动识别实战体验
MinerU智能文档理解镜像:财务报表自动识别实战体验 1. 引言:财务文档处理的痛点与机遇 在财务工作中,我们经常需要处理各种格式的财务报表——PDF扫描件、Excel截图、纸质文档照片等。传统的手工录入方式不仅效率低下,还容易出错…...
