
分类问题通常使用监督学习算法解决,例如随机森林、支持向量机、逻辑回归器等。监督学习算法需要已知目标来构建模型。然而,通常情况下我们只看到正常数据模式而不是罕见事件。罕见事件的目标数据要么不可用,要么数量不足以进行模型训练。大多数时候,我们只观察到正常类而不是罕见类。一类支持向量机(OCSVM)解决了只有一个类可用的问题。它对正常类的属性进行建模。当将模型应用于可能包含异常数据的未知数据时,模型将能够检测到它们。
在本章中,我将解释支持向量机(SVM)的思想,以及如何将其发展成为一类支持向量机(OCSVM)。您将了解它如何定义异常值分数。
(A) 支持向量机(SVM)
支持向量机(SVM)是一种监督学习算法,可用于分类和回归问题。在1992-1995年期间,由AT&T贝尔实验室的Vladimir Vapnik和同事开发([1][2]),SVM已广泛应用于分类问题。
SVM具有非常好的特性。它可以创建非线性决策边界来分离两个类。它在高维空间中找到分离的方式非常优雅。不能通过直线分离的数据点首先投影到更高维的空间中,然后可以有一个“直”的超平面将一个类的数据点与另一个类的数据点分开。当超平面投影回原始空间时,它将成为一个非线性曲线。这可以在图(B)中理解。左侧的图显示蓝色和红色点不能使用任何直线分离。但是,如果将所有点投影到3D空间中,则结果变得线性可分。当数据投影回原始空间时,边界是一个非线性曲线。为什么在高维空间中分离成分变得更容易?这必须回到Vapnik-Chervonenkis(VC)理论[1]。它说将映射到更高维空间通常提供更大的分类能力。

图(B):(作者提供的图片)
在更高的空间中,支持向量机(SVM)通过虚线超平面找到支持向量,如图(B)所示。它被称为支持,因为它在特征空间中每个类的边缘上。它通过上述超平面的最大厚度找到两个类的最大分离。SVM允许一些软边界,使一些点位于支持向量之间的区域中,以避免过度拟合。
(B) 从SVM到单类SVM
由于只有一个类,如何构建算法来将一个类与另一个类分开?Schölkopf等人的单类SVM [4]将所有数据点从更高维度的空间中与原点分离,并最大化从该超平面到原点的距离。换句话说,原点是算法试图从正常类分离出来的类。图(B)展示了这个想法。在这里提到两种方法很有趣。Schölkopf等人[4]使用超平面进行分离,而Tax&Duin [5]应用球体进行分离。

(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) 建模过程
在本书中,我采用以下建模过程进行模型开发、评估和结果解释。
-
模型开发
-
阈值确定
-
正常组和异常组的描述性统计信息

(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()
前几个观测值如下所示:

图(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()

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

最低0.47元/天 解锁文章
69

被折叠的 条评论
为什么被折叠?



