机器学习:监督学习模型SVM(支持向量机)概述

pandazjd 2018-11-14

理论

该算法的主要任务是找到最正确的线或超平面,它将数据分为两类。SVM是一种接收输入数据并返回这样一条分界线的算法。请考虑以下示例。假设我们有一个数据集,我们想要对蓝色圆圈中的红色方块进行分类和划分(例如,正面和负面)。这项任务的主要目标是找到将两个类分开的“理想”线。

机器学习:监督学习模型SVM(支持向量机)概述

找到将数据集划分为蓝色和红色类的完美线或超平面。

乍一看,这并不困难,对吧?

但是,正如您所看到的,没有一条特定的线可以解决这样的问题。我们可以选择无数个这样的行来划分这两个类。SVM究竟如何找到“理想”线,“理想”在理解中意味着什么?

机器学习:监督学习模型SVM(支持向量机)概述

您认为哪条线最好呢?

如果你选择黄线,我祝贺你:这是算法选择的那条线。在这个例子中,我们可以直观地理解黄线是分开的,因此比绿色更好地分类两个类

在绿线的情况下 - 它太靠近红色类。尽管它正确地对当前数据集中的所有对象进行了分类,但 对于不熟悉的数据集,它不会表现得那么好。解决分类类问题是机器学习的主要任务之一。

SVM如何找到最佳线

SVM算法的设计使得它在图上寻找直接位于最接近的分界线上的点。这些点称为支持向量。然后,算法计算参考矢量和分割平面之间的距离。这个距离称为间隙。该算法的主要目标是最大化间隙距离。最好的超平面是这样的超平面,其间隙尽可能大。

机器学习:监督学习模型SVM(支持向量机)概述

很简单不是吗?

但是让我们考虑以下示例,使用更复杂的数据集,无法线性划分。

机器学习:监督学习模型SVM(支持向量机)概述

显然,这个数据集不能线性划分。我们无法绘制一条直线来对这些数据进行分类。但是,可以通过添加一个额外的维度(我们称之为Z轴)来线性划分此数据集。想象一下,Z轴上的坐标由以下约束控制:

z =x²+y²

因此,纵坐标Z由点到轴的起点的距离的平方表示。

下面是Z轴上相同数据集的可视化。

机器学习:监督学习模型SVM(支持向量机)概述

现在可以线性划分数据。假设品红线分离数据z = k,其中k是常数。如果z =x²+y²,那么k =x²+y²- 圆的公式。通过这种方式,我们可以使用此转换设计我们的线性分离器,返回到原始样本维数。

机器学习:监督学习模型SVM(支持向量机)概述

因此,我们可以通过向其添加额外维度来对非线性数据集进行分类,然后使用数学变换将其恢复为原始形式。但是,不是所有数据集都可以轻松地转换这种转换。幸运的是,在sklearn库中实现此算法为我们解决了这个问题。

超平面

现在我们熟悉了算法的逻辑,让我们继续讨论超平面的正式定义

超平面是n维欧氏空间中的n-1维子平面,其将空间划分为两个独立的部分。

例如,假设我们的线被表示为一维欧几里德空间(即,我们的数据集位于一条直线上)。在这条线中选择一个点。这一点将数据集(在我们的例子中是线)分成两部分。线有一个度量,点有0个度量。

对于我们之前遇到的二维数据集,分界线是相同的超平面。简单地说,对于n维空间,有一个n-1维超平面,将这个空间分成两部分

Python编码

import numpy as np 
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
y = np.array([1, 1, 2, 2])

这些点表示为X的数组,以及它们所属的类作为y的数组。现在我们将用这个样本训练我们的机器学习模型。在本例中,我设置了分类器(kernel)的“kernel”的线性参数。

from sklearn.svm import SVC 
clf = SVC(kernel='linear')
clf = SVC.fit(X, y)

预测新对象的类

prediction = clf.predict([[0,6]])

参数调整

参数是您在创建分类器时传递的参数。下面我列出了一些最重要的可定制SVM选项:

“C”

此参数有助于调整“平滑度”与训练样本对象分类准确度之间的细线。“C”值越高,训练样本的对象就越正确分类。

机器学习:监督学习模型SVM(支持向量机)概述

在此示例中,我们可以为此特定样本确定若干决策阈值。注意线(在图上表示为绿线)决策阈值。它非常简单,因此,几个对象被错误地分类。这些被错误分类的点在数据中称为异常值。

我们还可以调整参数,最终得到一条更弯曲的线(浅蓝色的决策阈值),它将正确地分类训练样本的所有数据。当然,在这种情况下,我们的机器学习模型可以推广的可能性和在新数据显示同样好的结果是灾难性的。因此,如果您试图在训练机器学习模型时达到准确的目标,您还应瞄准更均衡的目标。

C越大,相当于惩罚松弛变量,希望松弛变量接近0,即对误分类的惩罚增大,趋向于对训练集全分对的情况,这样对训练集测试时准确率很高,但泛化能力弱。C值小,对误分类的惩罚减小,允许容错,将他们当成噪声点,泛化能力较强。

gamma

在官方文档中,SciKit Learn库声明gamma确定数据集中每个元素在定义“完美线”时会产生多大影响。伽玛越低,即使是离分界线很远的那些元素,也会参与选择这条线的过程。但是,如果伽马值很高,那么算法将仅“依赖”那些最接近线本身的元素。如果将伽玛级别设置得太高,则只有最接近该线条的元素才会参与确定线条位置的过程。这将有助于忽略数据中的异常值。SVM算法的设计使得在做出决策时相对于彼此最紧密的点具有更大的权重。然而,通过“C”和“gamma”的正确调优,就有可能得到一个最优的结果,这将构建一个忽略离群值的线性超平面,从而更易于泛化。

相关推荐