支持向量机(SVM)常见问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支持向量机(SVM)常见问题相关的知识,希望对你有一定的参考价值。
参考技术A SVM是一种二分类模型。它的基本模型是在特征空间中寻找间隔最大化的分离超平面的线性分类器。(间隔最大化是它的独特之处),通过该超平面实现对未知样本集的分类。意义:原始样本空间中可能不存在这样可以将样本正确分为两类的超平面,但是我们知道如果原始空间的维数是有限的,也就是说属性数是有限的,则一定存在一个高维特征空间能够将样本划分。SVM通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身无法线性可分的数据分开。核函数的真正意义是做到了没有真正映射到高维空间却达到了映射的作用,即减少了大量的映射计算。
选择:
利用专家先验知识选定核函数,例如已经知道问题是线性可分的,就可以使用线性核,不必选用非线性核。
如果特征的数量大到和样本数量差不多,则选用线性核函数SVM或LR。
如果特征的数量小,样本的数量正常,则选用高斯核函数SVM。
如果特征的数量小,样本数量很多,由于求解最优化问题的时候,目标函数涉及两两样本计算内积,使用高斯核明显计算量会大于线性核,所以手动添加一些特征,使得线性可分,然后可以用LR或者线性核的SVM;
利用交叉验证,试用不同的核函数,误差最小的即为效果最好的核函数。
混合核函数方法,将不同的核函数结合起来。
当训练数据线性可分时,存在无穷个分离超平面可以将两类数据正确分开。感知机或神经网络等利用误分类最小策略,求得分离超平面,不过此时的解有无穷多个。线性可分支持向量机利用间隔最大化求得最优分离超平面,这时,解是唯一的。另一方面,此时的分隔超平面所产生的分类结果是最鲁棒的,对未知实例的泛化能力最强。
增、删非支持向量样本对模型没有影响;
支持向量样本集具有一定的鲁棒性;
有些成功的应用中,SVM 方法对核的选取不敏感
噪声数量太多
噪声以新的分布形式出现,与原先样本集的噪声分布表现的相当不同。此时噪声也有大概率落在最大分类间隔中间,从而成为支持向量,大大影响模型。
所以我们常说的鲁棒性其实是主要是体现在对Outlier(异常点、离群点)上。
这里说的缺失数据是指缺失某些特征数据,向量数据不完整。SVM没有处理缺失值的策略(决策树有)。而SVM希望样本在特征空间中线性可分,若存在缺失值它们在该特征维度很难正确的分类(例如SVM要度量距离(distance measurement),高斯核,那么缺失值处理不当就会导致效果很差),所以特征空间的好坏对SVM的性能很重要。缺失特征数据将影响训练结果的好坏。
SVM的空间消耗主要是在存储训练样本和核矩阵,由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的内存和运算时间。如果数据量很大,SVM的训练时间就会比较长,所以SVM在大数据的使用中比较受限。
过拟合是什么就不再解释了。SVM其实是一个自带L2正则项的分类器。SVM防止过拟合的主要技巧就在于调整软间隔松弛变量的惩罚因子C。C越大表明越不能容忍错分,当无穷大时则退化为硬间隔分类器。合适的C大小可以照顾到整体数据而不是被一个Outlier给带偏整个判决平面。至于C大小的具体调参通常可以采用交叉验证来获得。每个松弛变量对应的惩罚因子可以不一样。
一般情况下,低偏差,高方差,即遇到过拟合时,减小C;高偏差,低方差,即遇到欠拟合时,增大C。
样本偏斜是指数据集中正负类样本数量不均,比如正类样本有10000个,负类样本只有100个,这就可能使得超平面被“推向”负类(因为负类数量少,分布得不够广),影响结果的准确性。
对于样本偏斜(样本不平衡)的情况,在各种机器学习方法中,我们有针对样本的通用处理办法:如上(下)采样,数据合成,加权等。
仅在SVM中,我们可以通过为正负类样本设置不同的惩罚因子来解决样本偏斜的问题。具体做法是为负类设置大一点的惩罚因子,因为负类本来就少,不能再分错了,然后正负类的惩罚因子遵循一定的比例,比如正负类数量比为100:1,则惩罚因子的比例直接就定为1:100,具体值要通过实验确定。
优点:
非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射;
对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;
支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量;
SVM 的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
小样本集上分类效果通常比较好。
少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单,而且具有较好的“鲁棒”性。这种“鲁棒”性主要体现在:
①增、删非支持向量样本对模型没有影响;
②支持向量样本集具有一定的鲁棒性;
③有些成功的应用中,SVM 方法对核的选取不敏感
SVM 是一种有坚实理论基础的新颖的小样本学习方法。它基本上不涉及概率测度及大数定律等,因此不同于现有的统计方法。从本质上看,它避开了从归纳到演绎的传统过程,实现了高效的从训练样本到预报样本的“转导推理”,大大简化了通常的分类和回归等问题。
缺点:
SVM算法对大规模训练样本难以实施。由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间(上面有讲)。
用SVM解决多分类问题存在困难。传统的SVM就是解决二分类问题的,上面有介绍不少解决多分类问题的SVM技巧,不过各种方法都一定程度上的缺陷。
对缺失值敏感,核函数的选择与调参比较复杂。
答:使用ROC曲线。Roc曲线下的面积,介于0.1和1之间。AUC值是一个概率值,当你随机挑选一个正样本以及负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值,AUC值越大,当前分类算法越有可能将正样本排在负样本前面。Auc作为数值可以直观的评价分类器的好坏,值越大越好,随机情况大概是0.5,所以一般不错的分类器AUC至少要大于0.5。
选择ROC和ROC下曲线面积是因为分类问题经常会碰到正负样本不均衡的问题,此时准确率和召回率不能有效评价分类器的性能,而ROC曲线有个很好的特性:当测试集中的正负样本的分布变换的时候,ROC曲线能够保持不变。
答:大值特征会掩盖小值特征(内积计算)。高斯核会计算向量间的距离,也会产生同样的问题;多项式核会引起数值问题。影响求解的速度。数据规范化后,会丢失一些信息。预测的时候,也要进行规范化
答:1)训练速度:线性核只需要调节惩罚因子一个参数,所以速度快;多项式核参数多,难调;径向基核函数还需要调节γ,需要计算e的幂,所以训练速度变慢。【调参一般使用交叉验证,所以速度会慢】
2)训练结果:线性核的得到的权重w可以反映出特征的重要性,从而进行特征选择;多项式核的结果更加直观,解释性强;径向基核得到权重是无法解释的。
3)适应的数据:线性核:样本数量远小于特征数量(n<<m)【此时不需要映射到高维】,或者样本数量与特征数量都很大【此时主要考虑训练速度】;径向基核:样本数量远大于特征数量(n>>m)
答:如果σ选得很大的话,高次特征上的权重实际上衰减得非常快,使用泰勒展开就可以发现,当很大的时候,泰勒展开的高次项的系数会变小得很快,所以实际上相当于一个低维的子空间;
如果σ选得很小,则可以将任意的数据映射为线性可分——当然,这并不一定是好事,因为随之而来的可能是非常严重的过拟合问题,因为此时泰勒展开式中有效的项将变得非常多,甚至无穷多,那么就相当于映射到了一个无穷维的空间,任意数据都将变得线性可分。
相同
第一,LR和SVM都是分类算法。
第二,如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的。
第三,LR和SVM都是监督学习算法。
第四,LR和SVM都是判别模型。
第五,LR和SVM都有很好的数学理论支撑。
不同
第一,loss function不同。
第二,支持向量机只考虑局部的边界线附近的点,而逻辑回归考虑全局(远离的点对边界线的确定也起作用)。
第三,在解决非线性问题时,支持向量机采用核函数的机制,而LR通常不采用核函数的方法。在计算决策面时,SVM算法里只有少数几个代表支持向量的样本参与了计算,也就是只有少数几个样本需要参与核计算(即kernal machine解的系数是稀疏的)。然而,LR算法里,每个样本点都必须参与决策面的计算过程,也就是说,假设我们在LR里也运用核函数的原理,那么每个样本点都必须参与核计算,这带来的计算复杂度是相当高的。所以,在具体应用时,LR很少运用核函数机制。
第四,线性SVM依赖数据表达的距离测度,所以需要对数据先做normalization,LR不受其影响。一个计算概率,一个计算距离!
第五,SVM的损失函数就自带正则!!!(损失函数中的1/2||w||^2项),这就是为什么SVM是结构风险最小化算法的原因!!!而LR必须另外在损失函数上添加正则项!!!所谓结构风险最小化,意思就是在训练误差和模型复杂度之间寻求平衡,防止过拟合,从而达到真实误差的最小化。未达到结构风险最小化的目的,最常用的方法就是添加正则项,SVM的目标函数里居然自带正则项!!!再看一下上面提到过的SVM目标函数:
我们再来看看,所谓out lier,是怎么产生的,无非有两种情况,一种就是这个样本的标签y搞错了,一种就是没搞错,但这个样本是一个个例,不具备统计特性。
不论对于哪一种情况,svm会在f将这个out lier预测的比较正确时,就停止,不会一直优化对out lier的预测,因为没有什么太大意义了。而lr则不同,它会继续要求f对这个out lier的预测进行优化,并且永不停止,显然,这样的优化很可能会削弱f的泛化性能,因为没有必要死磕out lier 。
答案就是SVM!!!
支持向量机
参考技术A 支持向量机(support vector machines,SVM)是一种二分类模型,它的基本模型是定义在特征空间上的 间隔最大的线性分类器 ,间隔最大使它有别于感知机;SVM还包括 核技巧 ,这使它成为实质上的非线性分类器。 SVM的学习策略就是间隔最大化 ,可形式化为一个求解凸二次规划的问题,也等价于正则化的损失函数最小值问题。SVM的学习算法就是求解凸二次规划的最优算法。它在手写识别数字和人脸识别中应用广泛,在文本和超文本的分类中举足轻重,因为SVM可以大量减少标准归纳和转换设置中对标记训练实例的需求。同时, SVM也被用来执行图像的分类,并用于图像分割系统 。实验结果表明,在仅仅三到四轮相关反馈之后,SVM就能实现比传统的查询细化方案高出一大截的搜索精度。除此之外,生物学和许多其他学科都是SVM的青睐者,SVM现在已经广泛用于 蛋白质分类 ,现在化合物分类的业界平均水平可以达到90%以上的准确率。在生物科学的尖端研究中,人们还使用支持向量机来识别用于模型预测的各种特征,以找出各种基因表现结果的影响因素。
SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面 。如下图所示, 即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机), 但是几何间隔最大的分离超平面却是唯一的。
超平面与最近数据点之间的距离成为边距。可以将两个类分开的最佳或最佳超平面是具有最大边距的线。只有这些点与定义超平面和分类器的构造有关。这些点称为支持向量。他们支持或定义超平面。实际上,优化算法用于找到使裕度最大化的系数的值。
SVM的三层理解:
(1)线性可分支持向量机、硬间隔
(2)线性支持向量机、软间隔
(3)非线性支持向量机、Kernel SVM
支持向量机模型存在三宝:
(1)间隔:是指样本点到超平面的距离。 硬间隔 是指对给定的样本数据集中所以的样本都能正确分类。对于线性不可分的样本集,无法满足线性可分支持向量机的不等式约束,也就是不存在对所有样本都能正确分类的超平面。这种情况可能是因为问题本身是非线性的,也可能问题是线性可分的,但个别样本点标记错误或存在误差而导致样本集线性不可分。
因此,我们可以允许对少量的样本分类错误, 容忍特异点的存在,而对于去除特异点的样本集是线性可分的,这时称为软间隔 。
(2)对偶
(3)核技巧
支持向量机和感知机在某些方面很相似,其相同点 :
(1)都是二分类模型
(2)都是通过一个分离超平民啊对特征进行分类
不同点:
(1)SVM是特殊的感知机
(2)感知机是用误分类最小的策略,求得分离超平面,这时存在无穷个解,感知机利用间隔最大化求得最优分离超平面。如下图所示。
图中的蓝色和黄色圆点分别表示正负样本,对于这个二分类,从图中我们可知,在最上面的黄线和最下面的绿线之间的线条都是可以把训练样本集完全分开的,这就是感知机的原理,通过这些分离超平面把训练集分开,这样的分离超平面存在很多条,比如图中的虚线,从视觉上中间那条实线应该是众多线条中最优的一条,感知机对于学习的分离超平面由于优化算法、学习率等不同因素,会随机地学习到这众多分离超平面的一条,当学习到的是靠近上下边缘的分离超平面是,对于一个未知样本,当这个样本稍微浮动一下,模型就很可能对他进行误分类了,因此鲁棒性很低,而支持向量机的目标是找到图中中间那条最优的分离超平面。
为求解支持向量机的最优化问题,我们将公式10作为原始问题,应用拉格朗日对偶性,通过求解对偶问题得到原始问题的最优解,这就是支持向量机的对偶算法。 在约束最优化问题中,常常利用拉格朗日对偶性将原始问题转换为对偶问题,通过解对偶问题而得到原始问题的解(最优解是反的,值是一样的 ) 。这是因为:
1)对偶问题的对偶是原问题
2)无论原始问题与约束条件是否是凸的,对偶问题都是凹问题,加个负号就变成凸问题了,凸问题容易优化。
3)对偶问题可以给出原始问题一个下界
4)当满足一定条件时,原始问题与对偶问题的解是完全等价的
LinearSVC()类的主要参数:
(1)C: float, default=1.0, 惩罚系数,必须大于0,默认值1.0。用于设置对错误分类的惩罚强度,对于设置对错误分类的惩罚强度,对于完全线性可分的硬间隔问题不需要设置。
(2)fit_intercept: boolean, optional(default=True):是否计算截距,默认为True。如果数据均值为0,则可以选择False不计算截距。
(3)multi_class: string,”ovr“ or "crammer_singer"(default='ovr'):多类别分类策略开关。对于多元分类问题,选择'ovr'将使用多类别策略(one-vs-set)直接对多个类别进行分类(默认方法);选择"crammer_singer"将主次进行二值分类。
(4)class_weight:dict or "balanced", default=None,特征变量的加权系数。用于为某个特征变量设置权重,默认所有特征变量的权重相同。
结论:1)线性核,尤其是多项式核函数在高次项时计算非常缓慢。
2)rbf和多项式核函数都不擅长处理量纲不统一的数据集
这两个缺点都可以由数据无量纲化来解决。因此,SVM执行之前,非常推荐先进行数据的无量纲化!
svc.score(): 返回给定测试数据和标签的平均准确度。
首先,分类模型天生会倾向于多数的类,让多数类更容易被判断正确,少数类被牺牲掉 。因为对于模型而言,样本量越大的标签可以学习的信息越多,算法就会更加依赖于从多数类中学到的信息来进行判断。如果我们希望捕获少数类,模型就会失败。 其次,模型评估指标会失去意义 。这种分类状况下,即便模型什么也不做,全把所有人都当成不会犯罪的人,准确率也能非常高,这使得模型评估指标accuracy变得毫无意义,根本无法达到我们的“要识别出会犯罪的人”的建模目的。
所以现在,我们首先要让算法意识到数据的标签是不均衡的,通过施加一些惩罚或者改变样本本身,来让模型向着捕获少数类的方向建模。然后,我们要改进我们的模型评估指标,使用更加针对于少数类的指标来优化模型。 要解决第一个问题,我们在逻辑回归中已经介绍了一些基本方法,比如上采样下采样 。但这些采样方法会增加样本的总数,对于支持向量机这个样本总是对计算速度影响巨大的算法来说,我们完全不想轻易地增加样本数量。况且,支持向量机中的决策仅仅受到决策边界的影响,而决策边界仅仅受到参数C和支持向量的影响,单纯地增加样本数量不仅会增加计算时间,可能还会增加无数对决策边界无影响的样本点。因此在支持向量机中,我们要大力依赖我们调节样本均衡的参数:SVC类的class_weight和接口fit可以设定的sample_weight。
混淆矩阵是二分类问题的多维衡量指标体系,在样本不平衡时极其有用。在混淆矩阵中,我们将少数类认为是正例,多数类认为是负例。在决策树,随机森林这些普通的分类算法里,即是说少数类是1,多数类是0。在SVM里,就是说少数类是1,多数类是-1。普通的混淆矩阵,一般使用0,1来表示。混淆矩阵中,永远是真实值在前,预测值在后。
ROC曲线及相关问题
基于混淆矩阵,总共有六个指标:准确率Accuracy,精确度Precision,召回率Recall,精确度和召回度的平衡指标F measure, 特异度Specificity,以及假正率FPR。
其中,假正率有一个非常重要的应用:我们在追求较高的Recall的时候,Precision会下降,就是说随着更多的少数类被捕捉出来,会有更多的多数类被判断错误,但我们很好奇,随着Recall的逐渐增加,模型将多数类判断错误的能力如何变化呢?我们希望理解,我每判断正确一个少数类,就有多少个多数类会被判断错误。假正率正好可以帮助我们衡量这个变化。相对的,Precision无法判断这些判断错误的多数类在全部多数类中究竟占多大的比例,所以无法在提升Recall的过程中也顾及到模型整体的Accuracy。因此, 我们可以使用Recall和FPR之间的平衡,来替代Recall和Precision之间的平衡,让我们衡量模型在尽量捕捉少数类的时候,误伤多数类的情况如何变化,这就是我们的ROC曲线衡量的平衡 。
ROC曲线,全称The Receiver Operating Characteristic Curve。这是一条以下不同阈值下的假正率FPR为横坐标,不同阈值下的召回率Recall为纵坐标的曲线。
优点:
(1)有严格的数学理论支持,可解释性强,不依靠统计方法,从而简化了通常的分类和回归问题
(2)解决小样本下机器学习问题;
(3)能找出对任务至关重要的关键样本(即:支持向量)
(4)采用核技巧之后,可以处理非线性分类/回归任务;可以解决高维问题,即大型特征空间;
(5)最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了”维数灾难“。
缺点:
(1)训练时间长。当采用SMO算法时,由于每次都需要挑选一对参数,因此时间复杂度 ,其中N为训练样本的数量;
(2)当采用核技巧时,如果需要存储核矩阵,则空间复杂度为 。对非线性问题没有通用解决方案,有时候很难找到一个合适的核函数;
(3)对于核函数的高维映射解释力不强,尤其是径向基函数;
(4)模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。
(5) 对缺失数据敏感;
因此支持向量机目前只适合小批量样本的任务,无法适应百万条甚至上亿样本的任务 。
SVM主要用于分类问题,主要的应用场景有字符识别、面部识别、行人检测、文本分类等领域。 在机器学习领域,SVM是有监督的学习模型,通常用来进行模式识别、分类(异常值检测)以及回归分析 。
以上是关于支持向量机(SVM)常见问题的主要内容,如果未能解决你的问题,请参考以下文章