支持向量机

支持向量机,第1张

支持向量机是一个功能请打并且全面的机器学习模型,它能够执行线性或非线性、回归,甚至是异常值检测任务。它是机器学习领域最受欢迎的模型之一。SVM特别适用于中小型复杂数据集的分类。

一、线性SVM分类

可以将SVM分类器视为在类别之间拟合可能的最宽的街道,因此也可以叫做大间隔分类。

注意,在街道意外的地方增加更多训练实例,不会对决策边界产生影响,也就是说它完全由街道边缘的实例所决定。SVM对特征的缩放非常敏感。

二、软间隔分类

1、硬间隔分类:如果严格地让所有实例都不在街道上,并且位于正确的一边

2、硬间隔分类的两个问题:(1)它只在数据是线性可分离的时候才有效

                                                  (2)它对于异常值非常敏感

3.软间隔分类:避免这些问题,最好使用更灵活的模型。目标是尽可能在保持街道宽度和限制间隔违例(即位于街道之上,升值在错误一边的实例)之间找到良好的平衡。

4.Scikit-Learn 的SVM类中,可以通过超参数C来控制这个平衡:C值越小,则街道越宽,但是间隔违例也会越多。

5.三种分类器的比较

(1)LinearSVC(C=1,loss="hinge")

(2)SVM(kernel = "linear",C = 1),但是这个要慢得多,特别是对于大型训练集而言

(3)SGDClassifier(loss="hinge",alpha=1/(m*C)),适用于常规梯度下降来训练线性SVM分类器。,不会像LinearSVC那样快速收敛,但是对于内存处理不了的大型数据集或是线性分类任务,它非常有效。

三、非线性SVM

在许多情况下,线性SVM分类器是有效的,并且通常出人意料的好,但是,有很多数据集远不是线性课分离的。处理非线性数据集的方法之一是添加更多特征,比如多项式特征,在某些情况下,这可能导致数据集变得线性可分离。

1.多项式核——添加多项式

添加多项式特征实现起来非常简单,并且对所有的机器学习算法有效。但是,如果多项式太低阶,处理不了费换成那个复杂的数据集,而高阶则会创造出戴昂的特征,导致模型太慢。

使用SVM时,可以运用数学技巧——核技巧

它产生的结果就跟添加了许多多项式特征,甚至是非常高阶的多项式特征一样,但实际上并不需要真的添加。

2.添加相似特征——用相似特征替代

(1)解决非线性问题的另一种技术是添加相似特征。这些特征经过相似函数计算得出,相似函数可以测量每个实例与一个特定地标之间的相似程度。

例:

在x1 =-2和x2 = 1处添加两个地标。接下来,采用高斯径向基函数(RBF)作为相似函数:

这是一个从0到1变化的钟形函数。实例x1=-1:它与第一个地标的距离为1,与第二个地标的距离为2.因此它的新特征为0.74,0.30

(2)怎么选择地标:

最简单的方法时在数据集里面一个实例的位置上创建一个地标。缺点是:一个有m个实例n个特征的训练集会被转换成一个m个实例

3.如何选择核函数

有那么多的核函数,该如何决定使用哪一个?有一个经验法则是,永远先从现行核函数开始尝试(LinearSVC 比 SVC(kernel =“linear”)快得多),特别是训练集非常大或特征非常多的时候。如果训练集不太大,你可以试试高斯RBF核, 大多数情况下它都非常好用。

4.计算复杂度

(1)liblinear库为线性SVM实现了一个优化算法,LinearSVC正是基于该库的。这个算法不支持核技巧,不过它与训练实例的数量和特征数量几乎线性相关:其训练时间复杂度大致为O(m x n)

(2)SVC是基于libsvm库的,这个库的算法支持核技巧。训练时间复杂度通常在 和 之间,这意味着如果训练实例的数量变大,它会慢得可怕,所以这个算法完美适用于复杂但是中小型的训练集。但是,它还是可以良好适应地特征数量的增加,特别是应对稀疏特征。

四、SVM回归

SVM回归要做的是让尽可能多的实例位于街道上,在同时街道的同时还限制间隔违例,SVM回归要让尽可能多的实例位于街道上,同时限制间隔为例。街道的宽度由超参数 控制。

五、工作原理

线性SVM是通过简单地计算决策函数 来预测新实例x的分类。如果结果为正,则预测类别 是正类(1),否则为负类(0)

训练线性SVM分类器即意味着找到W和b的值,从而使这个间隔尽可能宽的同时,避免(硬间隔)或是限制(软间隔)间隔违例

(1)训练目标

要最小化||w||来得到尽可能大的间隔。但是,如果我们想要避免任何间隔违例(硬间隔),那么就要使所有正类训练集的决策函数大于1,负类训练集的决策函数小于-1。因此,我们可以将硬间隔线性SVM分类器的目标,看做一个约束优化问题,对所有实例:

公式:硬间隔线性SVM分类器的目标

使得

虽然 最小化和 结果相同,但是 有一个简单好用的导数。而 在W =0 时,是不可微的。优化算法在可微函数上的工作效果要好得多。

(2)软间隔

要达到软间隔的目标,需要引入一个松弛变量 , 衡量的是第i个实例多大程度上允许间隔违例。现在有两个相互冲突的目标:使松弛变量越小越好从而减少间隔违例,同时还要使  最小化以增大间隔。这正是超参数C的用武之地:允许我们在两个目标之间权衡。

今天费了好大的劲终于将SVM_SteveGunn添加至我的matlab工具箱内,并且已能成功运行,现在把在添加以及运行中出现的各种问题罗列如下,并一一解决:

1、将下载的svm工具箱添加至matlab安装目录下

1、单独下载的工具箱

2、把新的工具箱拷贝到某个目录(我的是D:\soft\matlab2011b\toolbox)。

注意:你要是添加的很多个m文件,那就把这些m文件直接拷到再下一层你想要的工具箱的文件夹里

例如,我要添加的是支持向量机工具箱,在刚才的文件夹下我已经有svm(支持向量机工具箱)文件夹了,但有的m文件还没有,我就把新的m文件统统拷到D:\soft\matlab2011b\toolbox \svm目录下了。如果你连某工具箱(你打算添加的)的文件夹都没有,那就把文件夹和文件一起拷到D:\soft\matlab2011b\toolbox 下。

先把工具箱保存到MATLAB安装目录的根目录下面,然后运行matlab---->file---->set path---->add folder 然后把你的工具箱文件夹添加进去就可以了

3、在matlab的菜单file下面的set path把它( D:\soft\matlab2011b\toolbox \svm )加上。

4、 把路径加进去后在file→Preferences→General的Toolbox Path Caching里点击update Toolbox Path Cache更新一下。

记得一定要更新!我就是没更新,所以添加了路径,一运行还是不行。后来更新了才行。

2、在对svm工具箱进行使用时,发现了'qp.dll 不是有效的 Win32 应用程序 '

问题描述:

mex在不同windows OS下编译的结果,所以我们需要重新编译一下qp.dll

解决方案:

steve gunn 的包下面有一个optimiser 文件夹,把current Diretory目录改为optimiser目录,例如E:\matlabProgram\SVM_SteveGunn\Optimiser,然后运行命令

>>mex -v qp.c pr_loqo.c

命令运行完毕后,你会发现原先的qp.dll变为qp.dll.old,还出现了qp.mexw32,我们把该文件改为qp.dll 复制到工具箱文件夹下。原先的工具箱文件qp.dll可以先改一下名字...

3、我在运行第二步时发现了‘D:\SOFT\MATLAB~3\BIN\MEX.PL: Error: Compile of 'qp.c' failed.                                             Error using mex (line 206)

Unable to complete successfully.

这个是因为编译器设置的问题,这里需要重新选择设置编译器,设置编译器的方法:

mex -setup(mex和-setup之间要有空格),然后我选择的VS2010,然后再继续运行步骤2就成功了。

支持向量机 是一类按监督学习方式对数据进行 二元分类 的广义线性分类器,它的目的是寻找一个 超平面 来对样本进行分割,分割的原则是 间隔最大化 ,最终转化为一个 凸二次规划 问题来求解。

优点:

1.有严格的数学理论支持,可解释性强

2.能找出对任务至关重要的关键样本(即支持向量)

3.采用核技巧后,可以处理非线性分类/回归任务

4.最终决策函数只由少数的支持向量所确定,计算的复杂度取决于支持向量的数目,而不是样本空间的维数,在某种意义上避免了“维数灾难”

缺点:

1.训练时间长

2.当采用核技巧时,如果需要存储核矩阵,空间复杂度大

3.模型预测时,支持向量数目较大,预测计算复杂度高

本文重点对基于硬间隔的线性可分支持向量机、基于核函数的非线性支持向量机、基于软间隔的线性支持向量机这三类进行介绍。

给定训练样本集D={( , ),( , ),...,( , )},{-1,+1},分类学习基于训练集D在样本空间中找到一个划分超平面将不同类别的样本分开,但能将训练样本分开的划分超平面有很多,而我们要努力找到位于两类训练样本“ 正中间 ”的划分超平面(如图中的粗线),它对训练样本局部扰动的“容忍”性最好,即它产生的分类效果是 最鲁棒 的,对未见示例的 泛化能力最强 。

在样本空间中,划分超平面可通过线性方程来描述:

样本空间任意点x到超平面(w,b)的距离为

假设超平面(w,b)能将训练样本正确分类,则 约束 条件为:

使式子等号成立的训练样本点被称为“ 支持向量 ”(如图带圈圈的标记)。

两个异类支持向量到超平面的距离之和( 间隔 )为:

“ 最大间隔 ”的划分超平面条件:满足式(6.3)中对参数w和b,使得 最大,即:

可改写为(支持向量机 SVM的基本型 ):

对 凸二次规划 问题使用 拉格朗日乘子法 可得到对偶问题,具体是对每条约束 添加拉格朗日乘子 0, 从而得出拉格朗日函数后,令对w和b的偏导为零,将得出的式子带入拉格朗日函数后可得到原式对应的 对偶问题 ,用 SMO算法 对对偶问题求解后,即可得到最大间隔划分超平面所对应的模型(上述过程需满足 KKT条件 )。

在线性可分的假设下,希望得到的最大间隔划分超平面所对应的 模型 为:

由KKT条件,对任意训练样本( , ),总有 = 0  或 = 0 。

若 = 0,则该样本将不会在式(6.12)的求和中出现,也就不会对模型有任何影响;

若 >0 ,则必有 = 0,所对应的样本点位于最大间隔边界上,是一个支持向量。

这显示出支持向量机的一个重要性质: 训练完成后,大部分的训练样本都不需保留,最终模型仅与支持向量有关。

在现实任务中,原始样本空间内也许并不存在一个能正确划分为两类样本的超平面。这时,可 将样本从原始空间映射到一个更高维的特征空间 ,使得样本 在这个特征空间内线性可分 。

那么,在特征空间中划分超平面所对应的 模型 表示为:

类似式(6.6),有原始 目标函数 :

用拉格朗日乘子法得到其对偶问题为:

为避开计算困难,可以通过设想一个 核函数 :

核函数的作用 :核函数可以用 原始样本空间上的点内积 的方式,经过运算转化为高维空间点内积,而不必完全由高维空间上的点进行内积计算,这样达到了降低运算复杂度的作用。即从先升维度再算内积变成了 先算内积再升维度 。

在低纬空间(原始样本空间)中对于内积的运算则被定义为“ 核函数 ”, 在原始样本空间经过核函数计算的内积会等于高维空间的内积。

由此,原始目标函数经过改写求解出特征空间中划分超平面所对应的模型:

几种常用的核函数:

核函数的引入一方面减少了计算量,另一方面减少了存储数据的内存使用量。

在现实任务中往往难确定合适的核函数使得训练样本在特征空间中线性可分,即使恰好找到了也很难断定这个 貌似线性可分 的结果不是由于过拟合所造成的。为缓解这一问题是 允许支持向量机在一些样本上出错 。

软间隔 :数据样本不是实际的线性可分,而是 近似线性可分 ,即 允许某些样本不满足约束 :

由此,原始目标函数中增加了一个 损失函数 可写为:

三种常用的替代损失函数:

若采用hinge损失,则目标函数变成:

为度量这个间隔软到何种程度,引入“松弛变量” (即用以表示该样本不满足约束的程度),将上式改写得到“ 软间隔支持向量机 ”:

通过拉格朗日乘子法得到目标函数的拉格朗日函数并得到其对偶问题过程如下:

上述过程需满足 KKT条件 要求:

对于任意训练样本( , ),总有 或 .

若 ,则样本不会对模型有任何影响;

若 ,   则必有 , 即该样本是支持向量:

由式(6.39)可知, 

    若 ,则 ,进而有 ,即该样本恰在最大间隔边界上,

    若 ,则 ,此时若 ,则该样本落在最大间隔内部,

                                                        若 ,则该样本被错误分类。

由此可看出: 软间隔支持向量机的最终模型仅与支持向量有关。

把目标函数中的0/1损失函数换成别的替代损失函数可得到其他学习模型,这些模型具有一个 共性 :优化目标中的第一项用来描述划分超平面的间隔大小( 结构风险 ),另一项用来表述训练集上的误差( 经验风险 ),所以加了损失函数的线性支持向量机优化目标的 一般形式 为:

正则化 :对不希望得到的结果施以惩罚,从而使得优化过程趋向于希望目标。

上式是“正则化”问题, 称为正则化项,C称为正则化常数, 范数是常用的正则化项。

SVR与SVM的区别:

 SVM是要使到超平面 最近 的样本点的“距离” 最大 ;

 SVR则是要使到超平面 最远 的样本点的“距离” 最小 。

传统回归模型与支持向量回归计算损失的区别 :

传统回归模型直接基于模型输出 与真实输出 之间的差别来计算损失,当且仅当 与 完全相同时,损失才为零。

支持向量回归假设 能容忍 与 之间最多有 的偏差 ,仅当 与 之间的差别绝对值 大于 时 才计算损失,这相当于以 为中心,构建了一个 宽度为 的间隔带 ,若训练样本落入此间隔带,则以为是被预测正确的。

于是, SVR问题的目标函数 为:

加入 松弛变量 和 ,改写为:

再用拉格朗日乘子法得到 SVR的对偶问题 :

求解后得到 SVR模型 :

能使式(6.53)中的 的样本即为 SVR的支持向量 ,它们 必落在间隔带之外 。

上述过程需满足 KKT条件 :

若考虑 特征映射形 式, SVR模型 为:

核函数定理 :令 为输入空间, 是定义在 上的 对称函数 ,则 是核函数当且仅当对于任意数据D={ },“ 核矩阵 ”总是 半正定 的:

表示定理 :令H为核函数 对应的再生核希尔伯特空间, 表示H空间中关于h的范数,对于任意单调递增函数 和任意非负损失函数 ,优化问题

表示定理对损失函数 没有限制 ,对正则化项 仅要求 单调递增 ,即对于一般的损失函数和正则化项,优化问题的最优解 都可以表示为核函数 的线性组合。

引入核函数能将线性学习器扩展为非线性学习器。

这里我们使用sklearn的 乳腺癌数据 对以下5种模型的准确度进行预测,重点放在SVC上。

SVC主要调节的参数有: C (正则化参数)、 kernel (核函数)、 degree (多项式维度)、 gamma (核函数参数)、 coef0 (核函数的常数项)。

第一次我用SVC的默认参数,此时的核函数是 高斯核函数(kernel=‘rbf’) ,结果测试集的准确度为62.9%,太低了!说明存在严重的 过拟合 情况。

第二次我选择 改变核函数

用维度为2的 多项式核函数(kernel=‘poly’degree=2) 试试,测试集准确度变为95.1%,感觉比高斯核函数好多了!

线性核函数(kernel=‘linear’) 也来试试,多项式核函数当维度为1时 (kernel=‘poly’,degree=1) 退化为线性核。咦,测试集的准确度提升到了95.8%,但是测试集和训练集的准确度太过于接近,可能会有 欠拟合 的情况。

sigmoid核函数(kernel=‘sigmoid’) 也来试试,真的是太太太低了吧,算了果断抛弃。

第三次,对于常用的 高斯核函数 ,就这么被PK下去了感觉不太好,我决定试试 改变正则化参数 C 看看能不能挽救它,默认下的是C=1.0. 乳腺癌数据集的特征具有完全不同的数量级,这对SVC模型影响比较大,所以先进行 归一化处理 ,对每 个特征进行缩放 ,使其缩放到 0 和 1 之间 。归一化处理后,默认参数下的SVC模型测试集的准确率已经高达96.5%了。

改变C值 试试,当C值为1000时,测试集准确度又提高了,达到了97.4%,说明 增大C值可以优化模型。

第一次我先用了决策树里面默认的参数,其中 max_depth=None ,即树的深度是无穷的,此时出现了训练集的准确度为100%,说明出现了 过拟合 情况。

对于上述过拟合情况我采取的是 限制树的深度 。限制树的深度可以 减少过拟合 。这会 降低训练集的精度,但可以提高测试集的精度。

从 max_depth=3 开始,发现训练集的准确率下降了,但是测试集的准确度从93%提高到了94.4%,明显泛化性能提高了。

再用 max_depth=4 试试,测试集准确度为95.1%,泛化性能又提高了。可!


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11508735.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存