支持向量机的详细说明

塔瓦什·阿格瓦尔

有很多算法可用于解决分类问题,例如逻辑回归,朴素贝叶斯(Naive Bayes)等。尽管这些算法在整个行业中都很流行和使用,但是它们无法对复杂的分类任务进行分类,例如图像分类,语音检测等。

支持向量机也称为SVM,能够处理相当复杂的问题,其中逻辑回归等模型大多会失败。 SVM算法的属性和用例很少是:

  1. SVM主要用于分类任务,但也可以用于回归。 
  2. 它具有处理计算量大的数据集,对非线性可分离数据进行分类等的能力。
  3. SVM也属于线性模型,因为它们属于线性机器学习模型的一类(逻辑回归也是线性模型)。
  4. SVM需要数字形式的属性。如果数据集中的特征不是数字,则需要先将其转换为数字。

在本文中,我们将学习SVM算法作为分类算法。在开始理解支持向量机之前,让我们花一些时间来了解超平面的概念。

超飞机

在数据的上下文中,超平面是将数据分为两个不同部分的边界。我们可以在2维,3维中有超平面,或者也可以说n维平面,这超出了我们的想象。

在二维中,超平面或直线将由以下形式表示:

轴+ + c = 0

在3维中,超平面将表示为:

轴+ + + cz + d = 0

或者,通常在n维中,超平面将表示为:

$$ \ sum_ {i = 1} ^ d(W_i。X_i)+ W_0 = 0 $$

上面给出的表达式表示的模型称为线性鉴别器。

线性鉴别器指出,我们需要找到这样的系数\(w_1 \)到\(w_d \)包括\(w_o \)的方式使得每个数据点都满足以下条件:

如果\(l_i = 1 \),则:$$ \ sum_ {i = 1} ^ d(W_i。X_i + W_0)> 0$$

如果\(l_i = -1 \),则:$$ \ sum_ {i = 1} ^ d(W_i。X_i + W_0)< 0$$

上述条件表明,我们需要以一种方式找到超平面的系数,使得一类的所有数据点都保留在超平面的一侧,而另一类的所有其他数据点仍保留在超平面的另一侧。

2d_hyperplane

很好,到现在为止。但是有一个问题:可能有多个可能满足线性鉴别器的平面。那么如何找出最好的超平面呢?

multiple_hyperplanes

最大保证金分类器

最大边际分类器可确保安全边际。它以与两个类等距的方式划分数据集。因此,它与两个类别的距离保持相等,从而使模型对训练数据的偏见降低。而且,减少了训练错误。

最好的线是与两个类别的最近点保持最大可能的相等距离​​的线。靠近平面的点称为支持向量。这些是构造超平面的唯一要点。

margins_SVM

目标: 我们正在尝试找到模型的权重,以使距超平面最近的点的边距最大。

先决条件:

在这里,我假设您以上述概念而闻名:

  1. 两个向量的点积
  2. 超平面的距离公式

为了找到最大余量,要考虑的点是支持向量。我们的任务是找到距支持向量最大距离的平面。因此,我们的问题被简化为我们需要找到与具有最大可能余量的超平面相对应的权重的地方。

数学上要找到超平面的最大余量,我们将计算点到超平面的距离。数学公式化需要两个主要限制条件,同时要使余量最大化:

  1. 系数的标准化,以使所有属性的系数平方之和等于1.即:\(\ sum_ {i = 1} ^ d(W_i ^ 2)= 1 \)
  2. 最大余量超平面也应遵循以下约束:\((l_i *(W_i.Y_i))\ geq M \) 

最大边距分类器通过添加边距来解决超平面的限制。但是在现实世界中,数据并不是对称的,只有很少的点位于飞机的错误一侧。

在这种情况下,最大保证金分类器将不起作用,我们需要考虑一个替代方法,即软保证金分类器或支持向量分类器。

软边际分类器或支持向量分类器

在大多数情况下,在现实世界的数据集中,不可能绘制将两个类分开的超平面。在这种情况下,我们将使用“软保证金分类器”。

允许对某些点进行故意错误分类的超平面也称为支持向量分类器。 

当数据部分混合时,支持向量分类器可以很好地工作(即大多数数据可以通过一些错误分类正确分类)。

与最大边距分类器类似,支持向量分类器也使边距最大化。但也会使某些点被错误分类。

松弛变量有助于控制支持向量分类器中的错误分类。让我们详细了解松弛变量。

松弛变量

松弛是我们允许的每个数据点的公差。它告诉我们观测值相对于边缘和超平面的位置。正如我们在“最大保证金分类器”中所看到的,最大化保证金约束的条件是:

$$ l_i *(W_i.Y_i)\ geq M $$

对于支持向量分类器,约束条件几乎保持不变。唯一的区别是添加了松弛变量。

$$ l_i *(W_i.Y_i)\ geq M(1- \ epsilon_i)$$

其中\(\ epsilon_i \)代表松弛变量。

以下是slack变量的属性:

  • 对于距离大于M的点(即距超平面的安全距离),松弛变量的值为0。 
  • 如果数据点已正确分类但落在边缘内(或超出边缘),则其松弛ϵ的值在0到1之间。
  • 如果数据点分类不正确(即违反超平面),则epsilon的值(ϵ)> 1.

因此,每个数据点都会有一个与之关联的松弛变量。松弛变量的总和表示为模型的成本(C)。

$$ \ sum \ epsilon_i \ leq C $$

该模型的成本越高,表明存在许多错误分类的点。而且该模型是通用的,不太可能过拟合。换句话说,该模型具有较高的偏差。

并且模型成本越低,表示错误分类的点数越少。而且该模型的泛化程度较低,更有可能过度拟合。换句话说,该模型具有较高的方差。

因此,到目前为止,您可能已经猜到C是SVM模型的超参数,需要进行调整以控制模型的错误分类。

到目前为止,我们已经了解了最大余量分类器和支持向量分类器的概念。它们都倾向于适合超平面来分离类别。

但是,借助线性边界,大多数现实世界的数据集都是不可分割的。那么我们应该如何对非线性数据集进行分类呢?考虑一个显示非线性数据集的示例:

from sklearn.datasets import make_circles
import matplotlib.pyplot as plt
from pandas import DataFrame

# generate 2d classification dataset
X, y = make_circles(n_samples=100, noise=0.02)

# scatter plot, dots colored by class value
df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue'}
fig, ax = pyplot.subplots()
grouped = df.groupby('label')

for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])
pyplot.show()

输出:

linear_seprable_dataset

核仁

内核使SVM模型可以用于对非线性数据集进行分类的目的。内核致力于将非线性数据映射到线性数据的算法。想知道如何?接下来让我们看看。

将非线性数据转换为线性数据

让我们回到基础。我们知道2D中的每个点都绘制在X和Y平面/空间中。

现在考虑一个在X和Y空间中是非线性的数据集。现在,如果我们找到一个函数并将其应用于X和Y空间中的数据集以使其在新空间X'和Y'中线性化,该怎么办?

惊人的把戏!你们有什么感想?

注意: 原始空间(X,Y)称为原始属性空间,而转换后的空间(X’,Y’)称为要素空间。将原始属性转换为新特征空间的过程称为特征转换。

让我们考虑一个前面看到的同心圆的例子。并将特征空间中的非线性函数转换为线性函数。

from sklearn.datasets import make_circles
import matplotlib.pyplot as plt
from pandas import DataFrame

# generate 2d classification dataset
X, y = make_circles(n_samples=100, noise=0.02)

X[:,0] = pow((X[:,0] - 0.01), 2)
X[:,1] = pow((X[:,1] - 0.01), 2)

# scatter plot, dots colored by class value
df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y))
colors = {0:'red', 1:'blue'}
fig, ax = pyplot.subplots()
grouped = df.groupby('label')
for key, group in grouped:
    group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key])
pyplot.show()

输出:

non_linear_data_transformation

正如我们在上面看到的,我们可以形象地看到正在发生的转换。但是在现实世界的数据集中,我们具有很多功能并且几乎不可能转换数据。

考虑一个场景,在二维空间中我的数据集接近圆形。所以我知道我想转换到2级。因此,我的功能集将是:

$$ ax ^ 2 + by ^ 2 + cxy + dx + ey + fc = 0 $$

我的特征空间从2维增加到6维。如果我具有100多个功能并且需要将它们转换为2度或更高的程度怎么办?计算上,这是一项昂贵的操作。

让我们看看内核如何解决这些问题:

  1. 将非线性数据转换为线性数据。
  2. 非线性变换需要计算能力。

内核是一个黑盒子,其中输入是原始属性,输出是高维空间中的转换属性。 

我们可以将内核视为帮助我们隐式转换非线性数据的函数。然后SVM算法使用从内核生成的转换属性照常生成分类器。

注意 :这里内核还负责将转换后的特征空间映射到实际特征空间。

揭示了内核技巧

内核不会明确执行转换,而是使用数学技巧执行转换。

假设有一个函数ϕ将高维非线性数据转换为线性空间。我们计算特征向量\(\ phi(X_i ^ T)。\ phi(X_j)\)的成对内积,使用该学习算法可以在线性特征空间中建立模型。

下一个难题是我们需要找出可以帮助我们进行转型的地方。这就是内核技巧的来源。 

在这里我们没有找到特征向量\(\ phi(X_i ^ T)。\ phi(X_j)\)的点积,而是定义了一个函数K,其值等于特征向量的点积。

$$ K(\ vec x_i,\ vec x_j)\ equiv \ phi(X_i ^ T)。\ phi(X_j)$$

其中k通常被称为内核函数。内核函数有多种类型。接下来让我们了解它们。

内核类型

既然我们对内核以及为什么需要它有了详细的了解,就让我们进一步研究并探索可用的不同类型的内核函数:

  1. 线性核
  2. 多项式核
  3. 径向基函数(RBF)内核

让我们详细了解它们。

线性核

这与支持向量分类器或超平面相同,完全没有任何变换。当我们可以绘制线性平面以分隔两个类而无需执行任何变换时使用它。 

$$(\ vec x_i ^ T。\ vec x_j)$$

在线性内核的情况下,sklearn包具有一个tunning参数,即Cost(C)。

多项式核

它能够创建非线性多项式决策边界。内核函数表示为

$$(\ vec x_i ^ T。\ vec x_j + \ theta)^ d $$

其中d表示多项式的次数。此外,θ和d是超参数。

径向基函数(RBF)内核

这是最复杂的一个,它能够将高度非线性的特征空间转换为线性特征空间。它甚至能够创建封闭的决策边界。内核函数表示为

$$ e ^ {-\ alpha || \ vec x_i。 -\ vec x_j || ^ 2} $$

对于RBF内核,sklearn软件包有两个tunning参数:

  • 成本: 模型的成本
  • 伽玛:它控制模型中的非线性程度-随着伽玛值的增加,模型变得更加非线性,因此模型的复杂性也随之增加。

RBF是流行的内核功能之一。

注意: 

  • 请注意,选择正确的内核并正确调整超参数非常重要。不这样做会导致过拟合或幼稚的模型。
  • 我们通常使用交叉验证来调整超参数(Cost和Gamma),然后点击并尝试在多项式和RBF内核之间进行选择。

除了提到的内核函数外,还有其他类型,例如高斯内核,Sigmoid内核,字符串的频谱内核等。

概要

在这里,我们讨论了为什么需要SVM算法。我们还讨论了有关Hyperplanes,最大边距分类器,软边距分类器。我们介绍了松弛变量,并讨论了它如何有助于对现实世界数据进行分类。

我们了解了内核技巧的工作原理,得出的结论是,使内核技巧成为可能的关键事实是找到最佳拟合模型,学习算法只需要观测值\(X_i ^ T.X_j \)的内积即可。 。

作者信息

塔瓦什·阿格瓦尔

网站: http://tavishaggarwal.com

塔瓦什·阿格瓦尔是一名数据科学家 在海得拉巴工作,在解决电子商务,金融,医疗保健等不同领域的实际业务问题方面拥有丰富的经验。 他对技术充满热情,并且热爱团队合作。