支持向量机SVM(Support Vector Machine)
概念介绍
一个有监督的学习模型,通常用来进行模式识别、分类、回归分析等。
SVM在很多诸如文本分类,图像分类,生物序列分析和生物数据挖掘,手写字符识别等领域有很多的应用。
通俗来说,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略是间隔最大化,最终可以转化为一个凸二次规划问题的求解。
分类标准的起源,是逻辑回归,需要找到一个合适的线性分类器,目标是在N维数据空间中找到一个超平面。
线性分类:原始问题通过满足KKT条件(首先已经满足Slater条件,再者f和gi也都是可微的,即L对w和b都可导),已经转化成了对偶问题。而求解这个对偶学习问题,分为3个步骤:首先要让L(w,b,a) 关于 w 和 b 最小化,然后求对α的极大,最后利用SMO算法求解对偶问题中的拉格朗日乘子。
求解对偶问题的序列最小最优化SMO算法。
非线性分类,SVM 的处理方法是选择一个核函数 κ(⋅,⋅) ,通过将数据映射到高维空间,来解决在原始空间中线性不可分的问题。
具体来说,在线性不可分的情况下,支持向量机首先在低维空间中完成计算,然后通过核函数将输入空间映射到高维特征空间,最终在高维特征空间中构造出最优分离超平面,从而把平面上本身不好分的非线性数据分开。如图所示,一堆数据在二维空间无法划分,从而映射到三维空间里划分。
建立非线性学习器分为两步:首先使用一个非线性映射将数据变换到一个特征空间F,然后在特征空间使用线性学习器分类。
远离正常位置的点,通过建立松弛变量来允许在一定程度上偏离超平面。
不准确的说,SVM它本质上即是一个分类方法,用w^T+b定义分类函数,于是求w、b,为寻最大间隔,引出1/2||w||^2,继而引入拉格朗日因子,化为对拉格朗日乘子a的求解(求解过程中会涉及到一系列最优化或凸二次规划等问题),如此,求w.b与求a等价,而a的求解可以用一种快速学习算法SMO,至于核函数,是为处理非线性情况,若直接映射到高维计算恐维度爆炸,故在低维计算,等效高维表现。
SMO算法的基本思想是将Vapnik在1982年提出的Chunking方法推到极致,SMO算法每次迭代只选出两个分量ai和aj进行调整,其它分量则保持固定不变,在得到解ai和aj之后,再用ai和aj改进其它分量。与通常的分解算法比较,尽管它可能需要更多的迭代次数,但每次迭代的计算量比较小,所以该算法表现出较好的快速收敛性,且不需要存储核矩阵,也没有矩阵运算。
在面试时,考察SVM可考察机器学习各方面能力:目标函数,优化过程,并行方法,算法收敛性,样本复杂度,适用场景,调参经验,不过个人认为考察boosting和LR也还不错啊。此外,随着统计机器学习不断进步,SVM只被当成使用了一个替代01损失hinge研究,更通用的方法被提出,损失函数研究替代损失与贝叶斯损失关系,算法稳定性研究替代损失与推广性能关系,凸优化研究如何求解凸目标函数,SVM,boosting等算法只是这些通用方法的一个具体组建而已。
R语言的SVM建模
使用SVM需要安装e1071包,两种建模方法:
1、svm(formula, data= NULL, subset, na.action = na.omit , scale= TRUE)
formula:函数模型的形式
data:模型中包含的有变量的一组可选格式数据。
索引向量subset用于指定那些将被来训练模型的采样数据。
参数na.action用于指定当样本数据中存在无效的空数据时系统应该进行的处理。默认值na.omit表明程序会忽略那些数据缺失的样本。另外一个可选的赋值是na.fail,它指示系统在遇到空数据时给出一条错误信息。
参数scale为一个逻辑向量,指定特征数据是否需要标准化(默认标准化为均值0,方差1)。
2、svm(x, y = NULL, scale = TRUE, type = NULL, kernel = "radial",degree = 3, gamma = if (is.vector(x)) 1 else 1 / ncol(x),coef0 = 0, cost = 1, nu = 0.5, subset, na.action = na.omit)
x可以是一个数据矩阵,也可以是一个数据向量,同时也可以是一个稀疏矩阵。
y是对于x数据的结果标签,它既可以是字符向量也可以为数值向量。
x和y共同指定了将要用来建模的训练数据以及模型的基本形式。
参数type用于指定建立模型的类别。支持向量机模型通常可以用作分类模型、回归模型或者异常检测模型。根据用途的差异,在svm()函数中的type可取的值有C-classification、nu-classification、one-classification、eps-regression和nu-regression这五种类型中。其中,前三种是针对于字符型结果变量的分类方式,其中第三种方式是逻辑判别,即判别结果输出所需判别的样本是否属于该类别;而后两种则是针对数值型结果变量的分类方式。
此外,kernel是指在模型建立过程中使用的核函数。针对线性不可分的问题,为了提高模型预测精度,通常会使用核函数对原始特征进行变换,提高原始特征维度,解决支持向量机模型线性不可分问题。svm()函数中的kernel参数有四个可选核函数,分别为线性核函数、多项式核函数、高斯核函数及神经网络核函数。其中,高斯核函数与多项式核函数被认为是性能最好、也最常用的核函数。
核函数有两种主要类型:局部性核函数和全局性核函数,高斯核函数是一个典型的局部性核函数,而多项式核函数则是一个典型的全局性核函数。局部性核函数仅仅在测试点附近小领域内对数据点有影响,其学习能力强、泛化性能较弱;而全局性核函数则相对来说泛化性能较强、学习能力较弱。
对于选定的核函数,degree参数是指核函数多项式内积函数中的参数,其默认值为3。gamma参数给出了核函数中除线性内积函数以外的所有函数的参数,默认值为l。coef0参数是指核函数中多项式内积函数与sigmoid内积函数中的参数,默认值为0。
另外,参数cost就是软间隔模型中的离群点权重。最后,参数nu是用于nu-regression、nu-classification和one-classification类型中的参数。
一个经验性的结论是,在利用svm()函数建立支持向量机模型时,使用标准化后的数据建立的模型效果更好。
#通过summary函数可以得到关于模型的相关信息。其中,SVM-Type项目说明本模型的类别为C分类器模型;SVM-Kernel项目说明本模型所使用的核函数为高斯内积函数且核函数中参数gamma的取值为0.11;cost项目说明本模型确定的约束违反成本为l。
通过案例发现,
1.支持向量机虽然在训练集拟合度不如随机森林和神经网络,但是测试集准确率较高;
2.随机森林明显过拟合;
3.对比发现神经网络不管训练集还是测试集效果都最好。
该对比只是简单的对比,不能直接说明哪种算法最好。
原因:
1.数据样本过少;
2.实际使用算法中还要考虑到算法运行的时间,当面对海量数据时,准确复杂的算法往往运行过慢。
3.算法得出的模型“好坏”,不仅仅只看准确率,还要看其他指标比如:recall、percision、F1-score等。比如地震预测更看重recall指标
4.实际中还是要结合具体情况,选择合适的算法。
关于SVM的几个疑问
1、支持向量机的优缺点及适用数据类型:
优点:泛化错误率低,计算开销不大,结果易于解释。
缺点:对参数调节和核函数的选择敏感,原始分类器不加修改仅适用于处理二类问题。
适用数据类型:数值型和标称型数据。
SVM的优点:
1) 不需要很多样本,不需要有很多样本并不意味着训练样本的绝对量很少,而是说相对于其他训练分类算法比起来,同样的问题复杂度下,SVM需求的样本相对是较少的。并且由于SVM引入了核函数,所以对于高维的样本,SVM也能轻松应对。
2) 结构风险最小。这种风险是指分类器对问题真实模型的逼近与问题真实解之间的累积误差。
3) 非线性,是指SVM擅长应付样本数据线性不可分的情况,主要通过松弛变量(也叫惩罚变量)和核函数技术来实现,这一部分也正是SVM的精髓所在。
2、为什么叫做超平面?这是个让人尴尬的问题!!!!
如果数据点都在二维平面上,那么分隔超平面就是一条直线,如果所给的数据点集是三维的,那么分隔数据的就是一个平面,更高维的以此类推,如果数据集是1024维的,那么需要一个1023维的某某对象来对数据进行分隔,而这个1023维的某某对象被称为超平面。
3、SVM的一般流程:
收集数据:可以使用任意方法。
准备数据:需要数值型数据。
分析数据:有助于可视化分隔超平面
训练算法:SVM的大部分时间都源自训练,该过程主要实现两个参数的调优。
测试算法:十分简单的计算过程就可以实现。
使用算法:几乎所有分类问题都可以使用SVM,值得一提的是,SVM本身是一个二类分类器,对多类问题应用SVM需要对代码做一些修改。
4、基于SVM的数字识别:
a)收集数据:提供的文本文件。
b)准备数据:基于二值图像构造向量。
c)分析数据:对图像向量进行目测。
d)训练算法:采用两种不同的核函数,并对径向基核函数采用不同的设置来运行SMO算法。
e)测试算法:编写一个函数来测试不同的核函数并计算错误率。
f)使用算法。
5、关于核函数
核函数的作用其实很简单就是把低维映射到高维中,便于分类。核函数有高斯核等,下面就直接上图看参数对模型的影响,从下图可以了解,当C变化时候,容错变小,泛化能力变小;当选择高斯核函数的时候,随时R参数调大,准确高提高,最终有过拟合风险;
6、松弛变量的引入,解决容错性,即加入损失函数;
再加入惩罚因子C(cost),代表了对离群点带来的损失的重视程度,它的值越大,对目标函数的损失越大,意味着你非常不愿意放弃这些点。它是由使用者指定的一个值(libsvm中的参数C),是参数调优的重点所在。
引入松弛变量后,就允许某些样本点的函数间隔小于1,即在最大间隔区间里面,或者函数间隔是负数,即样本点在对方的区域中。C是离群点的权重,值越大说明离群点对目标函数影响越大,这时候间隔就会很小。
7、为什么要转为对偶问题?(阿里面试)
(a) 目前处理的模型严重依赖于数据集的维度d,如果维度d太高就会严重提升运算时间;
(b) 对偶问题事实上把SVM从依赖d个维度转变到依赖N个数据点,考虑到在最后计算时只有支持向量才有意义,所以这个计算量实际上比N小很多。
8、SMO算法实现SVM
基本思想:将大优化的问题分解成多个小优化问题,这些小问题往往比较容易求解,并且对他们进行顺序求解的结果与他们作为整体来求解的结果完全一致。
9、如何选取核函数?
1.当样本的特征很多时,特征的维数很高,这是往往样本线性可分,可考虑用线性核函数的SVM或LR(如果不考虑核函数,LR和SVM都是线性分类算法,也就是说他们的分类决策面都是线性的)。
2.当样本的数量很多,但特征较少时,可以手动添加一些特征,使样本线性可分,再考虑用线性核函数的SVM或LR。
3.当样特征维度不高时,样本数量也不多时,考虑用高斯核函数(RBF核函数的一种,指数核函数和拉普拉斯核函数也属于RBF核函数)。
LR和SVM都是判别模型,判别模型会生成一个表示P(Y|X)的判别函数(或预测模型),而生成模型先计算联合概率p(Y,X)然后通过贝叶斯公式转化为条件概率。简单来说,在计算判别模型时,不会计算联合概率,而在计算生成模型时,必须先计算联合概率。或者这样理解:生成算法尝试去找到底这个数据是怎么生成的(产生的),然后再对一个信号进行分类。基于你的生成假设,那么那个类别最有可能产生这个信号,这个信号就属于那个类别。判别模型不关心数据是怎么生成的,它只关心信号之间的差别,然后用差别来简单对给定的一个信号进行分类。常见的判别模型有:KNN、SVM、LR,常见的生成模型有:朴素贝叶斯,隐马尔可夫模型
常用核函数的公式:
如果如果特征数远远大于样本数的情况下,使用线性核就可以了.
如果特征数和样本数都很大,例如文档分类,一般使用线性核, LIBLINEAR比LIBSVM速度要快很多.
如果特征数远小于样本数,这种情况一般使用RBF.但是如果一定要用线性核,则选择LIBLINEAR较好,而且使用-s 2选项。
选择核函数的方法:
如果特征的数量大到和样本数量差不多,则选用LR或者线性核的SVM;
如果特征的数量小,样本的数量正常,则选用SVM+高斯核函数;
如果特征的数量小,而样本的数量很大,则需要手工添加一些特征从而变成第一种情况。
一般选择线性核和高斯核,也就是Linear核与RBF核。
Linear核:主要用于线性可分的情形。参数少,速度快,对于一般数据,分类效果已经很理想了。
RBF核:主要用于线性不可分的情形。参数多,分类结果非常依赖于参数。有很多人是通过训练数据的交叉验证来寻找合适的参数,不过这个过程比较耗时。
如果Feature的数量很大,跟样本数量差不多,这时候选用LR或者是Linear Kernel的SVM。
如果Feature的数量比较小,样本数量一般,不算大也不算小,选用SVM+Gaussian Kernel。
10、为什么SVM对缺失数据敏感?
这里说的缺失数据是指缺失某些特征数据,向量数据不完整。SVM没有处理缺失值的策略(决策树有)。而SVM希望样本在特征空间中线性可分,所以特征空间的好坏对SVM的性能很重要。缺失特征数据将影响训练结果的好坏。
LR和SVM的异同点
逻辑回归和支持向量机的共同点
1、都是分类算法
2、本质上都是线性分类算法,只是SVM考虑了核函数的转换
3、都是监督学习算法
4、都是判别模型
常见的判别模型有:KNN、SVM、LR,常见的生成模型有:朴素贝叶斯,隐马尔可夫模型。
逻辑回归和支持向量机的区别
1、损失函数不同
逻辑回归方法基于概率理论,假设样本为1的概率可以用sigmoid函数来表示,然后通过极大似然估计的方法估计出参数的值。
支持向量机基于几何间隔最大化原理,认为存在最大几何间隔的分类面为最优分类面。
通常在lr的推倒的时候,我们是直接用 最大似然估计的,然后只有当 误差的分布满足高斯分布的时候,最大似然的结果才会和最小二乘相同(loss function 为均方误差)。
lr 和 svm本质不同在于loss function的不同,不过想想这几乎对所有的单层模型都使用,lr的损失函数是 cross entropy loss, adaboost的损失函数是 expotional loss ,svm是hinge loss,常见的回归模型通常用 均方误差 loss。
为什么LR要用似然估计来求概率最大?
似然函数求解概率最大(被问到:为什么可以用似然函数。答:因为目标是要让预测为正的的概率最大,且预测为负的概率也最大,即每一个样本预测都要得到最大的概率,将所有的样本预测后的概率进行相乘都最大,这就能到似然函数了。)
2、SVM只考虑局部边界线附近的点,而LR考虑全局的点
线性SVM不直接依赖于数据分布,分类平面不受一类点影响;LR则受所有数据点的影响,如果数据不同类别strongly unbalance,一般需要先对数据做balancing。
3、处理非线性的方法不同
SVM采用核函数解决非线性的问题;计算决策面时,SVM算法里只有少数几个代表支持向量的样本参与了计算,也就是只有少数几个样本需要参与核计算(即kernal machine解的系数是稀疏的)。
LR算法里,每个样本点都必须参与决策面的计算过程,也就是说,假设我们在LR里也运用核函数的原理,那么每个样本点都必须参与核计算,这带来的计算复杂度是相当高的。所以,在具体应用时,LR很少运用核函数机制。
LR解决非线性问题,通常采用特征工程的办法,如特征离散化。很少直接将连续值作为特征喂给逻辑回归模型,而是将连续特征离散化为一系列0、1特征交给逻辑回归模型。
特征离散化的好处:稀疏向量内积乘法运算速度快,计算结果方便存储,容易scalable(扩展);离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问。“海量离散特征+简单模型” 同 “少量连续特征+复杂模型”的权衡
4、线性SVM依赖数据表达的距离测度,所以需要对数据先做normalization,LR不受其影响。
5、SVM的损失函数自带L2正则表达式,LR需要另外添加正则
在训练误差和模型复杂度之间寻求平衡,防止过拟合,从而达到真实误差的最小化。
对于SVM来说,有两个常用的损失算法max(1-yiwTxi,0)和max(1-yiwTxi,0)2,分别指的是L1-SVM和L2-SVM。