一.基本原理
SVM是一种二分类模型
基本思想:在特征空间中寻找间隔最大的分离超平面使数据得到高效的二分类,具体来讲,有三种情况(不加核函数的话就是线性模型,加了之后才会升级为一个非线性模型)
- 当训练样本线性可分时,通过硬间隔最大化,学习一个线性分类器,即线性可分支持向量机
- 当训练样本近似线性可分时,引入松弛变量,通过软间隔最大化,学习一个线性分类器,即线性支持向量机
- 当训练数据线性不可分时,通过使用核技巧及软间隔最大化,学习非线性支持向量机
二.优缺点
优点
- 由于SVM是一个凸优化问题,所以求得的解一定是全局最优而不是局部最优
- 不仅适用于线性问题还适用于非线性问题(核技巧)
- 拥有高维样本空间的数据也能用SVM,这是因为数据集的复杂度只取决于支持向量而不是数据集的维度,这在某种意义上避免了“维数灾难”
- 理论基础比较完善
缺点
- 二次规划问题求解将涉及m阶矩阵的计算(m为样本的个数),因此SVM不适用于超大数据集(SMO算法将可以缓解这个问题)
- 只适用于二分类问题(SVM的推广SVR也适用于回归问题;可以通过多个SVM的组合来解决多分类问题)
- 模型预测时,预测时间与支持向量的个数成正比。当支持向量的数量较大时,预测计算复杂度较高。因此支持向量机目前只适合小批量样本的任务,无法适应百万甚至上亿样本的任务
三.适用场景
- 在很多数据集上都有优秀的表现。相对来说,SVM尽量保持与样本间距离的性质导致它抗攻击的能力更强。和随机森林一样,这也是一个拿到数据就可以先尝试一下的算法
- 小样本,不要求数据分布,主要用于二分类问题
四.常见面试题
1. SVM与感知机的区别?
当训练数据线性可分时,存在无穷个分离超平面可以将两类数据正确分开。感知机利用误分类最小策略,求得分离超平面,不过此时的解有无穷多个。线性可分支持向量机利用间隔最大化求得最优分离超平面,这时,解是唯一的。另一方面,此时的分隔超平面所产生的分类结果是最鲁棒的,对未知实例的泛化能力最强
2.为什么SVM要引入核函数?
当样本在原始空间线性不可分时,可将样本从原始空间映射到一个更高维的特征空间,使得样本在这个特征空间内线性可分
引入这样的映射后,所要求解的对偶问题的求解中,无需求解真正的映射函数,而只需要知道其核函数
3.如何选择核函数?
- 当特征维数超过样本数(文本分类问题通常是这种情况),使用线性核
- 当特征维数比较小,样本数中等时,使用RBF核
- 当特征维数比较小,样本数特别大时,SVM通常不如深度神经网络
- 线性核:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果很理想
- RBF核:主要用于线性不可分的情形。参数多,分类效果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。个人体会是使用libsvm,默认参数,RBF核比线性核效果稍差,通过进行大量参数的尝试,一般能找到比线性核更好的效果
- 到底该采用哪种核,要根据具体问题,有的数据是线性可分的,有的不可分,需要多尝试不同核不同参数。如果特征提取的好,包含的信息量足够大,很多问题都是线性可分的。当然,如果有足够的时间去寻找RBF核参数,应该能达到更好的效果
4.为什么SVM对噪声及缺失数据敏感?
- 当噪声出现的过多的话,或者当噪声出现并成为支持向量的时候,噪声对模型的影响是巨大的
- 这里说的缺失数据是指缺失某些特征数据,向量数据不完整。SVM没有处理确实值得策略。而SVM希望样本在特征空间中线性可分,所以特征空间的好坏对SVM的性能重要,缺失特征数将影响训练结果的好坏
5.SVM目标函数和约束怎么得来的?
6.SVM为什么采用间隔最大化?
- 当训练数据线性可分时,存在无穷个分离超平面可以将两类数据正确分开
- 感知机利用误分类最小策略,求得分离超平面,不过此时的解有无穷多个
- 线性可分支持向量机利用间隔最大化求得最优分离超平面,这时,解是唯一的。另一方面,此时的分隔超平面所产生的分类结果是最鲁棒的,对未知实例的泛化能力最强
- 然后应该借此阐述,几何间隔,函数间隔,及从函数间隔—>求解最小化1/2 ||w||^2 时的w和b。即线性可分支持向量机学习算法—最大间隔法的由来
7.为什么要将求解SVM的原始问题转换为其对偶问题?
- 是对偶问题往往更易求解(当我们寻找约束存在时的最优点的时候,约束的存在虽然减小了需要搜寻的范围,但是却使问题变得更加复杂。为了使问题变得易于处理,我们的方法是把目标函数和约束全部融入一个新的函数,即拉格朗日函数,再通过这个函数来寻找最优点。)
- 自然引入核函数,进而推广到非线性分类问题
8.SVM中参数C的理解
把这个参数C理解为调节优化方向中两个指标(间隔大小,分类准确度)偏好的权重。soft-margin SVM针对hard-margin SVM容易出现的过度拟合问题,适当放宽了margin的大小,容忍一些分类错误(violation),把这些样本当做噪声处理,本质上是间隔大小和噪声容忍度的一种trade-off,至于具体怎么trade-off,对哪个指标要求更高,那就体现在C这个参数上了
9.SVM是否适合大规模数据?
10.kernel在SVM扮演什么角色?
11.SVM属于神经网络的范畴吗?
把这个参数C理解为调节优化方向中两个指标(间隔大小,分类准确度)偏好的权重。soft-margin SVM针对hard-margin SVM容易出现的过度拟合问题,适当放宽了margin的大小,容忍一些分类错误(violation),把这些样本当做噪声处理,本质上是间隔大小和噪声容忍度的一种trade-off,至于具体怎么trade-off,对哪个指标要求更高,那就体现在C这个参数上了
12.不平衡样本会对SVM的结果产生影响吗?怎么解决?
不平衡样本会对结果产生影响,超平面会靠近样本少的类别。原因是:使用的是软间隔分类,而如果所有的类别都使用同样的惩罚系数,则由于优化目标里面最小化惩罚量,所以靠近少数样本时,其惩罚量会小一些
解决方法为:
- 对正例和负例赋予不同的C值,例如正例远少于负例,则正例的C值取得较大,这种方法的缺点是可能会偏离原始数据的概率分布
- 对训练集的数据进行预处理即对数量少的样本以某种策略进行采样,增加其数量或者减少数量多的样本,典型的方法为:随机插入法,缺点是可能出现过拟合,较好的是SMOTE,其缺点是只能应用在具体的特征空间中,不适合处理那些无法用特征向量表示的问题,当然增加样本也意味着训练时间可能增加
- 基于核函数的不平衡数据处理
13.SVM如何处理多分类问题?
直接法:直接在目标函数上修改,将多个分类面的参数求解合并到一个最优化问题里面,看似简单但是计算量却非常大
间接法:对训练器进行组合,其中比较典型的是一对一和一对多
- 一对多:就是对每个类都训练出一个分类器,由于SVM是二分类,所以将此二分类器的两类设定为目标类为一类,其余类为另外一类。这样针对K个类可以训练出K个分类器,当有一个新的样本来的时候,用这K个分类器来测试,哪个分类器的概率高,那么这个样本就属于哪一类。这种方法效果不好,偏差比较高
- 一对一:针对任意两个类训练出一个分类器,如果有K类,一共训练出C(2,K)个分类器,这样当有一个新的样本要来的时候,用这C(2,K)个分类器来测试,每当被判定属于某一类的时候,该类就加一,最后票数最多的类别被认定为该样本的类
14.libSVM和libLinear有什么区别?
- libSVM是一套完整的SVM模型实现。用户可以在libSVM中使用核函数来训练非线性的分类器,当然也能使用更基础的线性SVM。而libLinear是一个针对线性分类场景而设计的工具包,除了支持线性的SVM外,还可以支持线性的逻辑回归等模型,但是无法通过定义核函数方式实现非线性的分类器
- 由于支持核函数的扩展,libSVM理论上具有比libLinear更强的分类能力,能够处理更为复杂的问题。但是很多人因此就只使用libSVM,甚至最简单的线性分类器都使用libSVM来训练和预测,这也是不可取的。因为libLinear设计的初衷就是为了提高线性分类的效率,其优化算法与libSVM中的优化算法有着根本的区别。虽然在进行线性分类时libSVM和libLinear都可以达到类似的结果,但是libLinear无论是在训练上还是预测上,都比libSVM高效的多
- 受限于算法,libSVM往往在样本量过万之后速度就比较慢了,如果样本量再上升一个数量级,那么通常的机器已经无法处理了。但使用libLinear则完全不需要有这方面的担忧,即便是百万千万级别的数据,libLinear也可以轻松搞定,因为libLinear本身就是为了解决较大规模样本的模型训练而设计的