异常检测系列:单类支持向量机(OCSVM)

img
分类问题通常使用监督学习算法解决,例如随机森林、支持向量机、逻辑回归器等。监督学习算法需要已知目标来构建模型。然而,通常情况下我们只看到正常数据模式而不是罕见事件。罕见事件的目标数据要么不可用,要么数量不足以进行模型训练。大多数时候,我们只观察到正常类而不是罕见类。一类支持向量机(OCSVM)解决了只有一个类可用的问题。它对正常类的属性进行建模。当将模型应用于可能包含异常数据的未知数据时,模型将能够检测到它们。

在本章中,我将解释支持向量机(SVM)的思想,以及如何将其发展成为一类支持向量机(OCSVM)。您将了解它如何定义异常值分数。

(A) 支持向量机(SVM)

支持向量机(SVM)是一种监督学习算法,可用于分类和回归问题。在1992-1995年期间,由AT&T贝尔实验室的Vladimir Vapnik和同事开发([1][2]),SVM已广泛应用于分类问题。

SVM具有非常好的特性。它可以创建非线性决策边界来分离两个类。它在高维空间中找到分离的方式非常优雅。不能通过直线分离的数据点首先投影到更高维的空间中,然后可以有一个“直”的超平面将一个类的数据点与另一个类的数据点分开。当超平面投影回原始空间时,它将成为一个非线性曲线。这可以在图(B)中理解。左侧的图显示蓝色和红色点不能使用任何直线分离。但是,如果将所有点投影到3D空间中,则结果变得线性可分。当数据投影回原始空间时,边界是一个非线性曲线。为什么在高维空间中分离成分变得更容易?这必须回到Vapnik-Chervonenkis(VC)理论[1]。它说将映射到更高维空间通常提供更大的分类能力。
img
图(B):(作者提供的图片)

在更高的空间中,支持向量机(SVM)通过虚线超平面找到支持向量,如图(B)所示。它被称为支持,因为它在特征空间中每个类的边缘上。它通过上述超平面的最大厚度找到两个类的最大分离。SVM允许一些软边界,使一些点位于支持向量之间的区域中,以避免过度拟合。

(B) 从SVM到单类SVM

由于只有一个类,如何构建算法来将一个类与另一个类分开?Schölkopf等人的单类SVM [4]将所有数据点从更高维度的空间中与原点分离,并最大化从该超平面到原点的距离。换句话说,原点是算法试图从正常类分离出来的类。图(B)展示了这个想法。在这里提到两种方法很有趣。Schölkopf等人[4]使用超平面进行分离,而Tax&Duin [5]应用球体进行分离。
img
(B)OVSVM

OVSVM是一种基于支持向量机的异常检测算法,它使用一个超平面来分离正常数据和异常数据。正常数据在超平面的一侧,而异常数据在另一侧。OVSVM的目标是找到一个最优的超平面,使得正常数据离超平面最远,而异常数据则尽可能靠近超平面。

© OCSVM如何定义异常得分?

OCSVM的异常得分是数据点到超平面的距离,如图(B)所示。这个距离也被称为相似度度量。相似度度量是通过N维相似度矩阵计算得出的(参见Aggarwal(2016)[6])。它是通过核函数计算得出的,例如径向基函数、线性函数、多项式函数或Sigmoid函数。径向基函数简单地计算输入x与固定点c之间的距离,例如ϕ(x)=f(‖x−c‖)

(D) OCSVM对RBF和超参数的选择敏感

OCSVM对核函数和一些超参数的选择非常敏感,性能可能会因选择而大幅变化。这种敏感性在[6]和[7]中有所记录。一个重要的超参数叫做nu,它是训练数据中数据点是异常点的概率。它是一个介于0和1之间的值。10%的nu意味着10%的数据可以被错误地分类为异常点,而支持边界上也有10%的数据。具体而言,nu是异常点比例和支持向量数量之间的权衡。

由于OCSVM对超参数非常敏感,解决方法是建立多个模型,并对预测结果进行平均,以获得稳定的结果。在后面的章节中,我将使用一系列nu值来生成模型,然后聚合预测结果。

(E) 建模过程

在本书中,我采用以下建模过程进行模型开发、评估和结果解释。

  1. 模型开发

  2. 阈值确定

  3. 正常组和异常组的描述性统计信息
    img
    (E.1) 第一步 — 构建模型

我们将使用数据生成过程(DGP)来模拟500个观测值和六个变量。我将异常值的百分比设置为5%。模拟数据有目标变量Y。我们将只使用X数据进行无监督模型OCSVM。


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from pyod.utils.data import generate_data
contamination = 0.05 # percentage of outliers
n_train = 500       # number of training points
n_test = 500        # number of testing points
n_features = 6      # number of features
X_train, X_test, y_train, y_test = generate_data(
    n_train=n_train, 
    n_test=n_test, 
    n_features= n_features, 
    contamination=contamination, 
    random_state=123)

X_train_pd = pd.DataFrame(X_train)
X_train_pd.head()

前几个观测值如下所示:
img
图(E.1)以散点图的形式绘制了前两个变量。黄色点是异常值,紫色点是正常数据点。


# Plot
plt.scatter(X_train_pd[0], X_train_pd[1], c=y_train, alpha=0.8)
plt.title('Scatter plot')
plt.xlabel('x0')
plt.ylabel('x1')
plt.show()

img
图(D.1)

下面的代码指定并拟合了模型"ocsvm"。参数contamination=0.05声明了异常值的百分比为5%。这个参数不影响异常值得分的计算。如果没有指定,默认值为PyOD的10%。函数decision_function()计算观测值的异常值得分。函数predict()根据污染率分配"1"或"0"。语法.threshold_显示了分配的污染率的阈值。

from pyod.models.ocsvm import OCSVM
ocsvm
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数智笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值