无监督︱异常、离群点检测 一分类——OneClassSVM
OneClassSVM两个功能:异常值检测、解决极度不平衡数据
因为之前一直在做非平衡样本分类的问题,其中如果有一类比例严重失调,就可以直接用这个方式来做:OneClassSVM;OneClassSVM还有一个功能就是异常值检测。
其他我的相关博客:
1、机器学习︱非平衡数据处理方式与评估
2、RFM模型+SOM聚类︱离群值筛选问题
3、R语言︱异常值检验、离群点分析、异常值处理
台湾大学林智仁所设计和实现的库LibSVM(地址:http://www.csie.ntu.edu.tw/~cjlin/libsvm/),里面包含很多种语言的版本。 R语言的在e1071包中。
sklearn之中有该算法,叫OneClassSVM
来看图,一分类就是左图中一大堆点的区域,当有超过这一堆的就会分到另外一类。
来源知乎:什么是一类支持向量机(one class SVM),是指分两类的支持向量机吗?
.
一、数据结构
主要参考官网的该案例:One-class SVM with non-linear kernel (RBF)
训练数据集:X_train—— 2*2
array([[ 1.99965086, 2.15923383],[ 1.50571424, 2.12918697],[ 1.93707554, 2.14992192],...[-1.76587184, -2.50357511]])
跟我们之前的数据集有出入的地方在于,我们不用喂给分类器label,而是无监督的。
验证数据集:X_test—— 2*2
array([[ 1.80383853, 1.58672939],
[ 2.01768496, 2.06326541],
[ 2.17193985, 1.97028432],
[ 2.24551427, 2.1166712 ],
[ 2.28101497, 2.33716323],
[ 1.71641595, 1.78091046],
[ 1.61257108, 1.7564344 ],
[ 2.38147731, 1.97159579],
[ 1.77266618, 2.04611541],
[ 2.32454414, 2.79806359],
[ 1.73709171, 2.36242084],
….
[-1.76587184, -2.50357511]])
离群值X_outliers—— 2*2
array([[-2.60871078, -1.94353134],[-3.25360609, 2.66247128],[-3.86062278, -3.29186255],[ 0.12889109, -0.14897511],[ 0.04729524, 3.62353636],[-1.1672252 , 2.63097474],[-1.13875221, 1.71308978],[ 1.75003901, 3.65887014],[-2.97229004, -0.83006677]])
预测的结果y_pred_train:
array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., -1., -1., 1., 1.,1., 1., 1., 1., 1., 1., 1., 1., -1., 1., 1., 1., 1.,1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,1., 1., 1., 1., -1., 1., -1., -1., 1., 1., 1., 1., 1.,
...1., 1., 1., 1., -1., 1., 1., 1., 1., 1., 1., -1., 1.,1., 1., 1., 1., 1., 1., -1., 1., 1., 1., 1., 1., 1.,1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,1., 1., 1., 1., 1.])
预测的结果为-1 或 1 ,在这个群落中为1,不在为-1。
.
二、sklearn实现:OneClassSVM
.
主要参考官网的该案例:One-class SVM with non-linear kernel (RBF)
整个案例的code:
print(__doc__)import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager
from sklearn import svmxx, yy = np.meshgrid(np.linspace(-5, 5, 500), np.linspace(-5, 5, 500))
# Generate train data
X = 0.3 * np.random.randn(100, 2)
X_train = np.r_[X + 2, X - 2]
# Generate some regular novel observations
X = 0.3 * np.random.randn(20, 2)
X_test = np.r_[X + 2, X - 2]
# Generate some abnormal novel observations
X_outliers = np.random.uniform(low=-4, high=4, size=(20, 2))# fit the model
clf = svm.OneClassSVM(nu=0.1, kernel="rbf", gamma=0.1)
clf.fit(X_train)
y_pred_train = clf.predict(X_train)
y_pred_test = clf.predict(X_test)
y_pred_outliers = clf.predict(X_outliers)
n_error_train = y_pred_train[y_pred_train == -1].size
n_error_test = y_pred_test[y_pred_test == -1].size
n_error_outliers = y_pred_outliers[y_pred_outliers == 1].size# plot the line, the points, and the nearest vectors to the plane
Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)plt.title("Novelty Detection")
plt.contourf(xx, yy, Z, levels=np.linspace(Z.min(), 0, 7), cmap=plt.cm.PuBu)
a = plt.contour(xx, yy, Z, levels=[0], linewidths=2, colors='darkred')
plt.contourf(xx, yy, Z, levels=[0, Z.max()], colors='palevioletred')s = 40
b1 = plt.scatter(X_train[:, 0], X_train[:, 1], c='white', s=s)
b2 = plt.scatter(X_test[:, 0], X_test[:, 1], c='blueviolet', s=s)
c = plt.scatter(X_outliers[:, 0], X_outliers[:, 1], c='gold', s=s)
plt.axis('tight')
plt.xlim((-5, 5))
plt.ylim((-5, 5))
plt.legend([a.collections[0], b1, b2, c],["learned frontier", "training observations","new regular observations", "new abnormal observations"],loc="upper left",prop=matplotlib.font_manager.FontProperties(size=11))
plt.xlabel("error train: %d/200 ; errors novel regular: %d/40 ; ""errors novel abnormal: %d/40"% (n_error_train, n_error_test, n_error_outliers))
plt.show()
直接输入的结果为:
.
三、其他的离群检验方法
主要参考官网的:Outlier detection with several methods
classifiers = {"One-Class SVM": svm.OneClassSVM(nu=0.95 * outliers_fraction + 0.05,kernel="rbf", gamma=0.1),"Robust covariance": EllipticEnvelope(contamination=outliers_fraction),"Isolation Forest": IsolationForest(max_samples=n_samples,contamination=outliers_fraction,random_state=rng)}
其中三种方法的介绍:
Robust covariance:
基于协方差的稳健估计,假设数据是高斯分布的,那么在这样的案例中执行效果将优于One-Class SVM;
One-Class SVM:
利用One-Class SVM,它有能力捕获数据集的形状,因此对于强非高斯数据有更加优秀的效果,例如两个截然分开的数据集。严格来说,一分类的SVM并不是一个异常点监测算法,而是一个奇异点检测算法:它的训练集不能包含异常样本,否则的话,可能在训练时影响边界的选取。但是,对于高维空间中的样本数据集,如果它们做不出有关分布特点的假设,One-class SVM将是一大利器。
Isolation Forest:
孤立森林是一个高效的异常点监测算法。SKLEARN提供了ensemble.IsolationForest模块。该模块在进行检测时,会随机选取一个特征,然后在所选特征的最大值和最小值随机选择一个分切面。该算法下整个训练集的训练就像一颗树一样,递归的划分。划分的次数等于根节点到叶子节点的路径距离d。所有随机树(为了增强鲁棒性,会随机选取很多树形成森林)的d的平均值,就是我们检测函数的最终结果。
那些路径d比较小的,都是因为距离主要的样本点分布中心比较远的。也就是说可以通过寻找最短路径的叶子节点来寻找异常点。它的例子也放在后面。
.
公众号“素质云笔记”定期更新博客内容:
参考文献:
One-class SVM with non-linear kernel (RBF)
什么是一类支持向量机(one class SVM),是指分两类的支持向量机吗?
异常检测用几种方法
sklearn中的异常检测方法
无监督︱异常、离群点检测 一分类——OneClassSVM相关推荐
- 解读ICDE‘22论文:基于鲁棒和可解释自编码器的无监督时间序列离群点检测算法
摘要:本文提出了两个用于无监督的具备可解释性和鲁棒性时间序列离群点检测的自动编码器框架. 本文分享自华为云社区<解读ICDE'22论文:基于鲁棒和可解释自编码器的无监督时间序列离群点检测算法&g ...
- 异常检测 | 用于无监督异常检测的自监督学习适应性记忆网络
关于<Adaptive Memory Networks with Self-supervised Learning for Unsupervised Anomaly Detection> ...
- 《异常检测——从经典算法到深度学习》18 USAD:多元时间序列的无监督异常检测
<异常检测--从经典算法到深度学习> 0 概论 1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法 3 基于One-Class SVM的异常检测算法 4 基于高斯概率密度异常检测 ...
- (Unsupervised Anomaly Detection)无监督异常检测领域最新研究进展 - Part 0 异常检测简述
文章目录 1. 简介 2. 相关数据集与评价指标 3. 研究进展 参考 1. 简介 异常检测,简单地说就是让学习到的模型能够区分开正常样本和异常样本.比如在医学领域,根据CT影像学习的癌症检测模型也可 ...
- OpenI启智社区开源算法框架推荐——新一代工业视觉无监督异常检测框架“READ”
工业缺陷检测是工业届非常重要且不可或缺的一项任务,由于工业场景异常缺陷多种多样,传统的机器视觉算法很难实现对缺陷特征完整的建模和迁移,算法复用相对困难,同时要求区分工况,从而造成大量的人力成本的浪费. ...
- 《异常检测——从经典算法到深度学习》8 Donut: 基于 VAE 的 Web 应用周期性 KPI 无监督异常检测
<异常检测--从经典算法到深度学习> 0 概论 1 基于隔离森林的异常检测算法 2 基于LOF的异常检测算法 3 基于One-Class SVM的异常检测算法 4 基于高斯概率密度异常检测 ...
- DFR: Deep Feature Reconstruction for Unsupervised Anomaly Segmentation 用于无监督异常分割的深度特征重建
DFR: Deep Feature Reconstruction for Unsupervised Anomaly Segmentation DFR:用于无监督异常分割的深度特征重建 类型:公开 ...
- 异常检测时间序列_时间序列的无监督异常检测
异常检测时间序列 To understand the normal behaviour of any flow on time axis and detect anomaly situations i ...
- 机器学习:无监督异常检测算法
文章目录 应用场景 特征值选取 多元正态分布 总感觉不像机器学习算法...像个概率论的高级计算器. 应用场景 异常检测问题指,给定数据集,假定他们都是正常or异常的,当出现一个新样本时,判断该新样本是 ...
最新文章
- 杨桃32开发版最小核心板和底板接口定义以及各io口功能
- Harbor镜像仓库部署
- 大剑无锋之TCP和UDP区别【面试推荐】
- 如何看懂源代码–(分析源代码方法)
- axis2开发webservice之编写Axis2模块(Module)
- 斗地主AI算法——第七章の被动出牌(1)
- Python批量检查网页是否被注入其他页面
- sql server死锁_如何解决SQL Server中的死锁
- Java基础篇:如何使用 break 退出循环
- mysql十三期_《叶问》第13期
- Java Excel转图片
- 安卓应用市场互相抓取app包
- 不属于多媒体计算机应用实例,河北职称计算机应用能力考试试题(九)
- 反编译exe软件_Winnti组织:利用ShadowPad和Winnti恶意软件针对高校发动攻击
- uploader什么意思_webuploader
- telegram 常见问题
- POJ1061青蛙的约会(拓展欧几里得)
- 2020-03-05-stm32 学习--Stm32F407 SPI1 全双工DMA 收发数据
- AD9361 官方例程详解(一)
- logcat命令使用方法和查看android系统日志缓冲区内容的方法
热门文章
- MarkDown 的两种页内跳转方法!!!!!
- PHP指定字段的多维数组排序方法
- SpringBoot使用H2内嵌数据库
- The log scan number (620023:3702:1) passed to log scan in database 'xxxx' is not valid
- RHEL7及CentOS7的语言、字符编码、键盘映射、X11布局设置(localectl)-系统管理(1)...
- [转]mysql慢查询日志
- 没有做数据备份 网站随时毁于一旦
- ctype.h(c标准库)
- [C++] Vector对象的合法定义
- Q132:PBRT-V3,BSSRDF(双向散射表面反射分布函数)(5.6.2章节、11.4章节)