支持向量机是可对类别进行分类的有监督的学习算法。其在样本的特征空间中找出间隔最大的超平面对样本进行分类。SVM根据其学习算法不同可划分为线性可分SVM、线性近似可分SVM与非线性SVM。实现上述三种SVM主要依靠核函数—线性核函数、高斯核函数、多项式核函数与Sigmoid核函数,后三种核函数为非线性,一般建议使用高斯核函数。
如上图,对于二分类,SVM需要确定一条最优直线使两类样本分开,在图1-4中A可以看到有多条直线可将两组分开,但最优的是图1-4中B的wx+b=0直线。对于最优直线的确定,需要使最优直线到最近点的距离最大,最近点被称为支持向量(如图1-4中B的红点/圈),这里的距离是求出点到直线的距离最大,这是在二维空间,当在三维及其以上的空间时,直线变为超平面,距离则需要求点到超平面的几何距离(Westreich et al 2010)。
SVM的优点:(1)适用各种形式的数据,如文本、图像等;(2)泛化能力较好,即其过拟合的风险小;(3)相对较好地处理高维度数据;(4)核函数的应用使其能很好的适应各种情况。其缺点:(1)对大规模数据难以处理;(2)只依靠少数支持向量决定最终结果,如有异常值,则结果容易出现较大偏差;(3)对缺失值敏感(Westreich et al 2010)。
K最近邻算法是通过计算样本特征之间的距离,根据距离k进行分类,属于无参数分类和回归方法(Altman 1992)。距离k的度量可以使用闵可夫斯基距离、欧氏距离与曼哈顿距离等距离公式进行计算,一般其取20以内的正整数,较大的k取值会降低噪音对分析的影响,且一般对于二分类问题,取k为奇数将有利于判别。
闵可夫斯基距离公式为:
上述公式中,当p=2时,变为欧氏距离,当p=1时,变为曼哈顿距离(Hechenbichler and Schliep 2004)。
KNN属于“懒惰学习”,即只是将训练集数据储存起来,再来新样本时进行距离计算,根据投票结果判别新样本属于哪一类。例如图1-6,蓝色方框与红色三角为已知的训练集,当有绿色圆圈新样本进行判别时,假设k为1,则有两个红色三角与一个为蓝色方框参与判别,这样投票结果为2:1,故绿色圆圈属于红色三角形一类;假如k为2,则有两个红色三角与三个为蓝色方框参与判别,这样投票结果为2:3,故绿色圆圈属于蓝色方框。所以k值需要选择,一般是根据经验进行设置,并且每个样本(如红三角)对判别决策所占的比重也可以进行设定即为权重KNN(Hechenbichler and Schliep 2004)。
逻辑回归是一种有监督的学习方法,其函数基本的公式:
上述公式为Sigmoid函数,图为1-7,其输出值在[0, 1]之间,需要选择一个阈值,通常是05,当p(x) > 05时,x为A类,如果p(x) < 05时,x为B类。阈值可以调整,其代表对于这个事情的把握度,如上述的阈值为05,如计算的p(x1)=03,则有50%的把握认为x1属于B类(Press 2013)。
LR的运算基本过程:(1)假设p(x)=1,构造sigmoid函数,即利用最大似然取对数作为误差函数,用梯度下降求最小的误差函数值,求出a与b;(2)根据训练数据集多组数据,重复循环(1)n次,计算数据集梯度,更新sigmoid参数,确定最终的sigmoid函数;(3)输入预测集数据;(4)运用最终sigmoid函数求解分类(Dreiseitl and Ohno-Machado 2002)。
LR的优点:(1)容易接收新数据,对模型更新;(2)能够容易解决变量间的共线性问题;(3)运算速度快,适合二分类问题。其缺点:(1)适用的数据和具体场景较少;(2)不适用于样本具有很大的特征值(即变量过多);(3)容易欠拟合,分类准确性较低;(4)使用前提是应变量和自变量有线性关系,只是广义线性模型,不能处理非线性问题。
随机森林是将多个决策树集合在一起的一种算法,基本单元为决策树,并且可以用于回归和分类(Breiman 2001, Liaw and Wiener 2002)。其名字由“随机”与“森林”组成,“随机”有两个含义,一指在训练集中随机且有放回的抽取n个样本进行建模,二指每个节点在特征值M中随机抽取k(k<M)个进行建模,且每个节点处的k应相同,这两个随机使该算法不容易过拟合(Ho 1998)。“森林”即为多个决策树组成,其要求基本同上述的决策树,但这里的决策树没有剪枝的过程,让其尽量生长(Cutler et al 2012)。其将多个决策树组合在一起是采用集成学习方法,该算法的中心思想是让每个决策树产生一个结果,再对这些结果进行统计,哪种结果数量最多,即为最终结果。
RF实现的过程(1)随机有放回的从样本N中选出n个子样本;(2)每个节点在特征值M中随机选出k个特征值;(3)重复第一与第二步s次,创建s个决策树;(4)对s个决策树结果分析,哪一类决策树最多,则最终判别为哪一类。
RF算法主要有两个参数,第一个为抽取每个样本的特征值k,第二个为决策树的数量。特征值k一般建议为全部特征值的开方(Geurts et al 2006)。在确定较优的k后,一般取决策树数为500进行尝试,查看随着决策树的数量增多,袋外错误率是否会稳定在一个定值,取能达到这个定值的最小决策树数的数量。
随机森林算法优点:(1)能够有效处理大数据;(2)能处理高维度变量的样本,不需要降维;(3)能较好处理缺失值问题。其缺点:(1)不能直观进行解释(2)过度拟合某些具有噪声分类。
上述的八种算法,一般多用于二分类问题,如“有或无”与“好或坏”等,但在实际应用中也有较多的多分类问题,如彩虹可以划分7种颜色,当判别一个新的颜色属于这7种颜色的哪一种时,这就需要解决一个七分类问题。多分类是二分类的一个拓展,解决办法有两种,第一种是一对多,即先从K类中选出一种,剩余K-1类归为一种,这样需要建立K个判别模型,当有新数据进行判别时,新样本需在K个判别模型中,同时进行判别,看被判别为哪一类的可能性最大,就判别为哪类;java转大数据是非常有优势的,如果想转入大数据开发领域,选择数仓开发是个捷径。千锋教育拥有线上免费Java线上公开课。如果特别想做更底层的开发,也可以选择从数仓开发切入,先接触,再曲线救国。那么数仓开发需要学啥? 1、会一门基础语言:java/python/scala:如果是java相关开发转大数据,那实在是太容易了,这一项就可以略过了。2、分布式存储及调度理论:hdfs、yarn的理论要理解且熟记,这些对于学习spark 或者hive 以及sql的优化是最最基础的知识。
3、sql 框架要会一个:spark sql/hive sql :如果对hive和spark都不懂的话,那就选择学spark,现在离线数仓越来越多的公司切spark了。Spark 相关主要学习spark core 和spark sql;要求sql要写的熟练,调优参数及原理,能懂一些源码就更好了。4、数仓建模、分层理论:这个是数仓的方法论,是一定要掌握的,理论都在《维度建模权威指南-kimball》这本书里,好书是好书,看起来比较枯燥,在看的时候多思考,结合自己正在做的业务,想象一下如果要为现在的业务划分主题该怎么划、业务矩阵该怎么设计等等,大胆想象就ok。5、其它需要了解:大数据相关的架构理论、olap、数据湖等等,知道越多越好,不需要太深入,主要作用是帮助理解大数据的那一套东西;网上的其它公司数仓的架构是啥样子,要知道架构里每个组件的作用是啥。还有一些其它的框架组件:kafka、presto、druid、flink 等了解,写个demo跑跑,知道流程就可。如果想了解更多相关知识,建议到千锋教育了解一下。千锋教育目前在18个城市拥有22个校区,年培养优质人才20000余人,与国内20000余家企业建立人才输送合作关系,院校合作超600所。支持向量机 是一类按监督学习方式对数据进行 二元分类 的广义线性分类器,它的目的是寻找一个 超平面 来对样本进行分割,分割的原则是 间隔最大化 ,最终转化为一个 凸二次规划 问题来求解。
优点:
1有严格的数学理论支持,可解释性强
2能找出对任务至关重要的关键样本(即支持向量)
3采用核技巧后,可以处理非线性分类/回归任务
4最终决策函数只由少数的支持向量所确定,计算的复杂度取决于支持向量的数目,而不是样本空间的维数,在某种意义上避免了“维数灾难”
缺点:
1训练时间长
2当采用核技巧时,如果需要存储核矩阵,空间复杂度大
3模型预测时,支持向量数目较大,预测计算复杂度高
本文重点对基于硬间隔的线性可分支持向量机、基于核函数的非线性支持向量机、基于软间隔的线性支持向量机这三类进行介绍。
给定训练样本集D={( , ),( , ),,( , )}, {-1,+1},分类学习基于训练集D在样本空间中找到一个划分超平面将不同类别的样本分开,但能将训练样本分开的划分超平面有很多,而我们要努力找到位于两类训练样本“ 正中间 ”的划分超平面(如图中的粗线),它对训练样本局部扰动的“容忍”性最好,即它产生的分类效果是 最鲁棒 的,对未见示例的 泛化能力最强 。
在样本空间中,划分超平面可通过线性方程来描述:
样本空间任意点x到超平面(w,b)的距离为
假设超平面(w,b)能将训练样本正确分类,则 约束 条件为:
使式子等号成立的训练样本点被称为“ 支持向量 ”(如图带圈圈的标记)。
两个异类支持向量到超平面的距离之和( 间隔 )为:
“ 最大间隔 ”的划分超平面条件:满足式(63)中对参数w和b,使得 最大,即:
可改写为(支持向量机 SVM的基本型 ):
对 凸二次规划 问题使用 拉格朗日乘子法 可得到对偶问题,具体是对每条约束 添加拉格朗日乘子 0, 从而得出拉格朗日函数后,令对w和b的偏导为零,将得出的式子带入拉格朗日函数后可得到原式对应的 对偶问题 ,用 SMO算法 对对偶问题求解后,即可得到最大间隔划分超平面所对应的模型(上述过程需满足 KKT条件 )。
在线性可分的假设下,希望得到的最大间隔划分超平面所对应的 模型 为:
由KKT条件,对任意训练样本( , ),总有 = 0 或 = 0 。
若 = 0,则该样本将不会在式(612)的求和中出现,也就不会对模型有任何影响;
若 > 0 ,则必有 = 0,所对应的样本点位于最大间隔边界上,是一个支持向量。
这显示出支持向量机的一个重要性质: 训练完成后,大部分的训练样本都不需保留,最终模型仅与支持向量有关。
在现实任务中,原始样本空间内也许并不存在一个能正确划分为两类样本的超平面。这时,可 将样本从原始空间映射到一个更高维的特征空间 ,使得样本 在这个特征空间内线性可分 。
那么,在特征空间中划分超平面所对应的 模型 表示为:
类似式(66),有原始 目标函数 :
用拉格朗日乘子法得到其对偶问题为:
为避开计算困难,可以通过设想一个 核函数 :
核函数的作用 :核函数可以用 原始样本空间上的点内积 的方式,经过运算转化为高维空间点内积,而不必完全由高维空间上的点进行内积计算,这样达到了降低运算复杂度的作用。即从先升维度再算内积变成了 先算内积再升维度 。
在低纬空间(原始样本空间)中对于内积的运算则被定义为“ 核函数 ”, 在原始样本空间经过核函数计算的内积会等于高维空间的内积。
由此,原始目标函数经过改写求解出特征空间中划分超平面所对应的模型:
几种常用的核函数:
核函数的引入一方面减少了计算量,另一方面减少了存储数据的内存使用量。
在现实任务中往往难确定合适的核函数使得训练样本在特征空间中线性可分,即使恰好找到了也很难断定这个 貌似线性可分 的结果不是由于过拟合所造成的。为缓解这一问题是 允许支持向量机在一些样本上出错 。
软间隔 :数据样本不是实际的线性可分,而是 近似线性可分 ,即 允许某些样本不满足约束 :
由此,原始目标函数中增加了一个 损失函数 可写为:
三种常用的替代损失函数:
若采用hinge损失,则目标函数变成:
为度量这个间隔软到何种程度,引入“松弛变量” (即用以表示该样本不满足约束的程度),将上式改写得到“ 软间隔支持向量机 ”:
通过拉格朗日乘子法得到目标函数的拉格朗日函数并得到其对偶问题过程如下:
上述过程需满足 KKT条件 要求:
对于任意训练样本( , ),总有 或
若 ,则样本不会对模型有任何影响;
若 , 则必有 , 即该样本是支持向量:
由式(639)可知,
若 ,则 ,进而有 ,即该样本恰在最大间隔边界上,
若 ,则 ,此时若 ,则该样本落在最大间隔内部,
若 ,则该样本被错误分类。
由此可看出: 软间隔支持向量机的最终模型仅与支持向量有关。
把目标函数中的0/1损失函数换成别的替代损失函数可得到其他学习模型,这些模型具有一个 共性 :优化目标中的第一项用来描述划分超平面的间隔大小( 结构风险 ),另一项用来表述训练集上的误差( 经验风险 ),所以加了损失函数的线性支持向量机优化目标的 一般形式 为:
正则化 :对不希望得到的结果施以惩罚,从而使得优化过程趋向于希望目标。
上式是“正则化”问题, 称为正则化项,C称为正则化常数, 范数是常用的正则化项。
SVR与SVM的区别:
SVM是要使到超平面 最近 的样本点的“距离” 最大 ;
SVR则是要使到超平面 最远 的样本点的“距离” 最小 。
传统回归模型与支持向量回归计算损失的区别 :
传统回归模型直接基于模型输出 与真实输出 之间的差别来计算损失,当且仅当 与 完全相同时,损失才为零。
支持向量回归假设 能容忍 与 之间最多有 的偏差 ,仅当 与 之间的差别绝对值 大于 时 才计算损失,这相当于以 为中心,构建了一个 宽度为 的间隔带 ,若训练样本落入此间隔带,则以为是被预测正确的。
于是, SVR问题的目标函数 为:
加入 松弛变量 和 ,改写为:
再用拉格朗日乘子法得到 SVR的对偶问题 :
求解后得到 SVR模型 :
能使式(653)中的 的样本即为 SVR的支持向量 ,它们 必落在间隔带之外 。
上述过程需满足 KKT条件 :
若考虑 特征映射形 式, SVR模型 为:
核函数定理 :令 为输入空间, 是定义在 上的 对称函数 ,则 是核函数当且仅当对于任意数据D={ },“ 核矩阵 ”总是 半正定 的:
表示定理 :令H为核函数 对应的再生核希尔伯特空间, 表示H空间中关于h的范数,对于任意单调递增函数 和任意非负损失函数 ,优化问题
表示定理对损失函数 没有限制 ,对正则化项 仅要求 单调递增 ,即对于一般的损失函数和正则化项,优化问题的最优解 都可以表示为核函数 的线性组合。
引入核函数能将线性学习器扩展为非线性学习器。
这里我们使用sklearn的 乳腺癌数据 对以下5种模型的准确度进行预测,重点放在SVC上。
SVC主要调节的参数有: C (正则化参数)、 kernel (核函数)、 degree (多项式维度)、 gamma (核函数参数)、 coef0 (核函数的常数项)。
第一次我用SVC的默认参数,此时的核函数是 高斯核函数(kernel=‘rbf’) ,结果测试集的准确度为629%,太低了!说明存在严重的 过拟合 情况。
第二次我选择 改变核函数
用维度为2的 多项式核函数(kernel=‘poly’degree=2) 试试,测试集准确度变为951%,感觉比高斯核函数好多了!
线性核函数(kernel=‘linear’) 也来试试,多项式核函数当维度为1时 (kernel=‘poly’,degree=1) 退化为线性核。咦,测试集的准确度提升到了958%,但是测试集和训练集的准确度太过于接近,可能会有 欠拟合 的情况。
sigmoid核函数(kernel=‘sigmoid’) 也来试试,真的是太太太低了吧,算了果断抛弃。
第三次,对于常用的 高斯核函数 ,就这么被PK下去了感觉不太好,我决定试试 改变正则化参数 C 看看能不能挽救它,默认下的是C=10 乳腺癌数据集的特征具有完全不同的数量级,这对SVC模型影响比较大,所以先进行 归一化处理 ,对每 个特征进行缩放 ,使其缩放到 0 和 1 之间 。归一化处理后,默认参数下的SVC模型测试集的准确率已经高达965%了。
改变C值 试试,当C值为1000时,测试集准确度又提高了,达到了974%,说明 增大C值可以优化模型。
第一次我先用了决策树里面默认的参数,其中 max_depth=None ,即树的深度是无穷的,此时出现了训练集的准确度为100%,说明出现了 过拟合 情况。
对于上述过拟合情况我采取的是 限制树的深度 。限制树的深度可以 减少过拟合 。这会 降低训练集的精度,但可以提高测试集的精度。
从 max_depth=3 开始,发现训练集的准确率下降了,但是测试集的准确度从93%提高到了944%,明显泛化性能提高了。
再用 max_depth=4 试试,测试集准确度为951%,泛化性能又提高了。可!向量机、深度学习是机器学习中的两种大牛的算法。
机器学习关注如何通过依靠数据构建模型或识别模型中的参数,从而使模型的输入和输出与关注的问题域输入输出近似相匹配。
大数据中的一些问题需要机器学习方法支撑。对于SVM来说,数据点被视为p维向量,而我们试图用(p-1)维超平面分开这些点,即创造所谓的“线性分割器”。为此,我们要选择能够让到每边最近的数据点的距离最大化的超平面。如果存在这样的超平面,则称为最大间隔超平面,而其定义的线性分类器被称为最大间隔分类器,或者叫做最佳稳定性感知器。SVM的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。
(A Support Vector Machine (SVM) is a discriminative classifier formally defined by a separating hyperplane In other words, given labeled training data ( supervised learning ), the algorithm outputs an optimal hyperplane which categorizes new examples)
遇到线性不可分的情况时,需要使用Kernal投射到高维。其实Kernal函数和SVM可以理解为两个不同的东西,SVM只不过是用到了kernel trick把有些线性不可分的情况变得在高维线性可分(理想上),任何可以用内积计算距离的分类器或者其他的都可以用kernel trick。Kernal函数的好处是把低维空间投影到高维,有些核函数投影到有限维,比如多项式核,有些投影到无穷维,比如RBF。但这只是增大的线性可分的可能性,并不能保证。所以还要进入松弛系数(slash coefficients) 如果形象的理解,就是如果你有N个点,如果N个点分布在N维空间里,那他们肯定是线性可分的(比如2个点在平面上)。所以SVM用kenel的目的就在于此。
参考资料:
>
大数据是我的主要研究方向之一,同时也出版过Java编程方面的书籍,所以我来回答一下这个问题。
对于JavaWeb程序员来说,在当前的大数据时代背景下,转向大数据开发是不错的选择。随着大数据技术逐渐普及到传统行业,未来大数据开发领域将释放出更多的就业岗位,薪资待遇上也会有所提升。
对于JavaWeb程序员来说,如果要转向大数据领域,需要做好以下几个方面的准备:
第一:学习大数据平台知识。目前大数据开发岗位集中在四个领域,分别是大数据平台开发、大数据应用开发、大数据分析和大数据运维,对于JavaWeb程序员来说,选择大数据应用开发和大数据分析是比较现实的选择,在积累一定开发知识之后,可以考虑向大数据平台研发方向发展。目前学习大数据平台知识可以从Hadoop开始,Hadoop平台经过多年的发展已经构建了一个较为完善的生态体系,而且Hadoop平台自身就是采用Java语言开发的,所以在Hadoop平台下采用Java语言比较方便。
第二:学习算法和统计学相关知识。不论从事大数据应用开发还是大数据分析,都应该掌握一定的算法知识和统计学知识。常见的算法包括决策时、朴素贝叶斯、支持向量机、k近邻、Apriori等,这些算法在大数据领域有广泛的应用,也是初学者应该掌握的算法。
第三:学习行业知识。大数据应用通常与行业有较为紧密的联系,大数据场景分析是目前大数据主要的落地应用项目,所以需要从业者掌握一定的行业知识。随着大数据逐渐落地到广大的传统行业,行业知识对于大数据从业者越来越重要。
最后,大数据知识体系结构内容比较多,最好能够边用边学,如果能跟目前的岗位任务相结合是不错的学习方式。
支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器。在python中使用SVM处理大数据时可能会遇到内存不足的情况,新我们就来看一下如何解决内存不足的问题:
我们可以使用python分块读取大数据来避免内存不足,实现代码如下:import pandas as pd
def read_data(file_name):
'''
file_name:文件地址
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)