一、SVM算法的介绍
1.什么是SVM算法?
SVM(Support Vector Machine)是一种常见的监督学习算法,用于进行二分类或多分类任务。它的主要思想是找到一个最优的超平面,将不同类别的样本分隔开。
超平面最大间隔介绍:
上左图显示了三种可能的线性分类器的决策边界:
虚线所代表的模型表现非常糟糕,甚至都无法正确实现分类。其余两个模型在这个训练集上表现堪称完美。
但是它们的决策边界与实例过于接近,导致在面对新实例时,表现可能不会太好。
右图中的实线代表SM分类器的决策边界,不仅分离了两个类别,且尽可能远离最近的训练实例。
2.硬间隔和软间隔
-
硬间隔
硬间隔指的是当数据线性可分时,支持向量机通过寻找一个可以完全将不同类别的样本分开的超平面。在硬间隔中,SVM的目标是使所有样本都满足线性约束条件,即样本点距离超平面的距离大于等于一个阈值,通常为1。这意味着所有样本都应该被正确分类,并且没有容忍错误分类的余地。硬间隔适用于数据线性可分的情况,但对于噪声和离群点较多的数据集,可能会导致过拟合。
当有一个异常值的鸢尾花数据:左图的数据根本找不出硬间隔,而右图最终显示的决策边界与我们之前所看到的无异常值时的决策边界也大不相同,可能无法很好地泛化。
-
软间隔
软间隔是为了处理线性不可分的情况而引入的概念。当数据线性不可分时,硬间隔会导致无法找到满足线性约束的超平面。软间隔允许一些样本点出现在超平面的错误一侧,通过引入松弛变量(Slack Variable)来允许一定程度的错误分类。软间隔的目标是在尽量保持数据分离的同时,最小化错误分类和松弛变量的总和。软间隔允许一定程度的容忍错误分类,从而增加模型的鲁棒性和泛化能力。
软间隔的引入使得支持向量机可以处理线性不可分的情况,并且对噪声和离群点具有一定的容错能力。然而,软间隔引入了一个新的调节参数C,用于平衡间隔大小和错误分类的权重。较大的C值将更加关注正确分类,而较小的C值将更加容忍错误分类。合理选择C值可以有效控制模型的偏差和方差。
如下图所示,左边使用了高C值,分类器的错误样本较少,但是间隔也较小;右边使用的低C值,间隔大了很多,但是位于间隔上的实例也更多,看起来右图更加容忍错误分类(泛化效果更好)。
总结起来,硬间隔适用于线性可分的数据,要求没有错误分类;软间隔适用于线性不可分的数据,通过引入松弛变量允许一定程度的错误分类。选择硬间隔还是软间隔要根据数据的线性可分性以及噪声和离群点的情况来决定。
3.SVM的基本原理
- 数据表示:SVM将每个样本表示为特征向量,并将其映射到一个高维特征空间。在特征空间中,样本通过特征向量表示,每个特征表示一个维度。
- 构建超平面:SVM寻找一个最优的超平面,将不同类别的样本分开。超平面是一个维数比样本少一的线性子空间。对于二分类任务,超平面将数据划分为两个类别;对于多分类任务,可以使用多个超平面进行分割。
- 最大化间隔:SVM的目标是找到一个能够最大化不同类别样本之间的间隔(即支持向量)的超平面。间隔是指离超平面最近的样本点到超平面的距离。
- 核函数:当数据不是线性可分时,SVM可以使用核函数将数据映射到更高维的特征空间,从而使数据线性可分。常用的核函数包括线性核、多项式核和高斯核等。
- 模型训练和预测:SVM通过最优化问题来训练模型,通常使用凸优化方法求解。训练完成后,可以用于对新样本进行分类预测。
4.SVM的三种损失函数
左边的二维图像,横标代表y的值,纵标代表误差。
右边的图像是超平面的图像。
- 绿色:0/1损失
- 当正例的点落在y=0这个超平面的下边,说明是分类正确,无论距离超平面多远多近,误差都是0;
- 当这个正例的样本点落在y=0的上方的时候,说明分类错误,无论距离多远多近,误差都是1;
- 图像就是上面绿色线。
- 蓝色:SVM Hinge损失函数
- 当一个正例的点落在y=1的直线上,距离超平面长度1,那么误差就为0;
- 当它落在距离超平面0.5的地方,误差就为0.5;
- 当他落在y=0上的时候,距离超平面为0,误差就为1;
- 当这个点落在了y=0的上方,被误分到了负例中,距离算出来应该是负的,比如距离为-0.5,那么误差就为1.5;
- 以此类推,画在二维坐标上就是上图蓝色的那条线。
- 红色:Logistic损失函数
- 损失函数的公式为:ln(1+e^(-yi));
- 当yi=0时,损失等于ln2,这样的话损失函数的图像有点丑,所以我们给损失函数再除以ln2;
- 这样当yi=0时,损失为1,即损失函数的图像过(0,1)点;
- 对应的损失函数图像是上面红色的线。
SVM Hinge 损失函数是比较常用的损失函数。
5.什么是核函数?
在支持向量机(SVM)算法中,核函数是一种用于处理非线性问题的技术。它通过将原始特征映射到一个高维特征空间,从而使数据在高维空间中线性可分。
核函数的作用是将原始数据从低维空间映射到高维空间,通过非线性映射使得数据在高维空间中呈现线性可分的特性。在高维空间中,支持向量机可以找到一个超平面来分割不同类别的样本。
比如左上面这张图,在二维空间中,无法找到一个超平面来分割红色和蓝色样本。但如果把这些数据映射到三维空间中,如右上图所示,此时就可以找到一个超平面来分割这两种数据。
核函数的一般形式为:
K
(
x
,
y
)
=
φ
(
x
)
⋅
φ
(
y
)
K(x, y) = φ(x)·φ(y)
K(x,y)=φ(x)⋅φ(y)
其中,K(x, y) 表示核函数的计算结果,x 和 y 是原始特征空间中的样本点,φ(·) 表示映射函数。
核函数的选择非常重要,不同的核函数会对数据的映射效果和最终的分类结果产生影响。常用的核函数有以下几种:
- 线性核函数(Linear Kernel):线性核函数是最简单的核函数,它只进行内积计算,不进行任何映射操作。适用于线性可分问题。
- 多项式核函数(Polynomial Kernel):多项式核函数将数据映射到高维空间,并使用多项式函数进行计算。它在原始特征的基础上引入了高次项,可以处理一些非线性问题。
- 高斯核函数(Gaussian Kernel):高斯核函数也称为径向基函数(Radial Basis Function,RBF核函数),它是常用的核函数之一。高斯核函数通过计算样本点与支持向量之间的距离,构建一个类似于高斯分布的权重。它能够有效处理复杂的非线性问题。
- Sigmoid核函数(Sigmoid Kernel):Sigmoid核函数使用了一个sigmoid函数,可以将数据映射到一个S形曲线上。它可以处理一些非线性可分问题,但在实际中使用较少。
选择适当的核函数取决于数据的特性和问题的性质,一般有如下规则:
- 如果特征数量很大,甚至和样本数量差不多时,往往线性可分,这时选用逻辑回归(LR)或者线性核函数;
- 如果特征数量很小,样本数量正常,不多也不少,可以选用高斯核函数(RBF);
- 如果特征数量很小,而样本数量很大,这是可以手动添加一些特征,使得线性可分,然后选用逻辑回归或者线性核函数;
- 多项式核函数一般很少用,效率不高,结果也不优于高斯核函数;
- 线性核函数参数少,速度快;高斯核函数参数多,分类结果非常依赖于参数,需要交叉验证或者网格搜索最佳参数,比较耗时;
- 高斯核函数的应用非常广,无论是小样本还是大样本,高维还是低维等情况,高斯核函数均适用。
6.SVM算法的优缺点
- 优点:
- 在高维空间中处理非线性问题:通过使用核函数,SVM可以将数据映射到高维特征空间中,从而处理非线性问题。
- 有效处理小样本数据集:SVM在小样本数据集上表现出色,并且对于样本维度较高的问题也适用。
- 泛化能力强:SVM通过最大化间隔来选择最优超平面,可以有效地避免过拟合。
- 缺点:
- 对于大规模数据集计算复杂度高:SVM在处理大规模数据集时,需要较高的计算资源和时间。
- 参数选择敏感:SVM的性能受到参数选择的影响,如选择核函数和正则化参数等。
- 对于噪声和缺失数据敏感:SVM对于噪声和缺失数据比较敏感,需要进行适当的数据预处理。
综上所述,SVM是一种强大的分类算法,尤其适用于小样本数据集和高维特征空间。它在许多领域都有广泛的应用,包括图像分类、文本分类、生物信息学等。
二、SVM算法的API介绍
1.SVM算法API综述
-
SVM算法既可以用于分类问题,也可以用于回归和异常值检测问题。
-
SVM具有良好的鲁棒性,对未知数据拥有较强的泛化能力,特别是在数据量较少的情况下,相较于其他传统机器学习算法具有更优的性能。
sklearn中支持向量分类主要有三种方法:SVC、NuSVC、LinearSVC,扩展为三个支持向量回归的方法为:SVR、NuSVR、LinearSVR。
- SVC和NuSVC方法基本一致,唯一区别就是损失函数的度量方式不同。
- NuSVC中的nu参数和SVC中的C参数
- LinearSVC是实现线性核函数的支持向量分类,没有kernel参数。
2.使用SVM模型时,通常采用以下流程:
- 对样本数据进行归一化处理;
- 应用核函数对样本进行映射(样本线性可分时,采用线性核函数;样本线性不可分时,采用高斯核函数(RBF));
- 若采用高斯核函数的话,需要用交叉验证和网格搜索选择最佳参数;
- 用最优参数训练得到模型;
- 模型评估。
3.SVC
class sklearn.svm.SVC(C=1.0, kernel=“rbf”, degree=3, coef0=0.0, random_state=None)
-
C:惩罚系数,用来控制损失函数的惩罚系数,类似于线性回归中的正则化系数。
- C值大,惩罚力度大,趋向于对训练集全分对的情况。这样会出现训练集测试时的准确率很高,但泛化能力弱,容易导致过拟合。
- C值小,惩罚力度小,容错能力增强,泛化能力较强,但也可能欠拟合。
-
kernel:算法中采用的核函数类型,核函数是用来将非线性问题转化为线性问题的一种方法。
- 默认值是“RBF”,高斯核函数
- Linear指的是线性核函数
- Poly指的是多项式核函数
- Sigmoid指的是双曲正切函数tanh核函数
-
degree:
- 当指定kernel为“Poly”时,表示选择的多项式的最高次数,默认为三次多项式。
- 当指定kernel不是“Poly”时,则忽略该参数。
-
coef0:核函数常数值(y=kx+b中的b值,即偏置)
- 只有Poly和Sigmoid核函数中有,默认值为0
4.NuSVC
class sklearn.svm.NuSVC(nu=0.5)
- nu:训练误差部分的上限和支持向量部分的下限,取值在(0,1)之间,默认值为0.5。
5.LinearSVC
class sklearn.svm.LinearSVC(penalty=“l2”, loss=“squared_hinge”, dual=True, C=1.0)
- penalty:正则化参数
- L1和L2两种参数值
- loss:损失函数
- 有hinge和squared_hinge两种值,前者又称L1损失,后者称为L2损失,默认值是squared_hinge。
- 其中hinge是SVM的标准损失,squared_hinge是hinge的平方
- dual:是否转化为对偶问题求解,默认值为True。
- C:惩罚系数。
- 用来控制损失函数的惩罚系数。