如何提高支持向量机多分类的分类准确率

说到支持向量机,必须要提到july大神的《支持向量机通俗导论》,个人感觉再怎么写也不可能写得比他更好的了。这也正如青莲居士见到崔颢的黄鹤楼后也只能叹“此处有景道不得”。不过我还是打算写写SVM的基本想法与libSVM中R的接口。一、SVM的想法回到我们最开始讨论的KNN算法,它占用的内存十分的大,而且需要的运算量也非常大。那么我们有没有可能找到几个最有代表性的点(即保留较少的点)达到一个可比的效果呢?要回答这个问题,我们首先必须思考如何确定点的代表性?我想关于代表性至少满足这样一个条件:无论非代表性点存在多少,存在与否都不会影响我们的决策结果。显然如果仍旧使用KNN算法的话,是不会存在训练集的点不是代表点的情况。那么我们应该选择一个怎样的“距离”满足仅依靠代表点就能得到全体点一致的结果?我们先看下面一个例子:假设我们的训练集分为正例与反例两类,分别用红色的圆圈与蓝色的五角星表示,现在出现了两个未知的案例,也就是图中绿色的方块,我们如何去分类这两个例子呢?在KNN算法中我们考虑的是未知样例与已知的训练样例的平均距离,未知样例与正例和反例的“距离”谁更近,那么他就是对应的分类。同样是利用距离,我们可以换一个方式去考虑:假设图中的红线是对正例与反例的分类标准(记为w ? x+b=0),那么我们的未知样例与红线的“距离”就成了一个表示分类信度的标准,而w ? y+b(y为未知样例的数据)的符号则可以看成是分类的标识。但是遗憾的是我们不知道这样的一条分类标准(分类线)是什么,那么我们一个比较自然的想法就是从已知的分类数据(训练集)里找到离分割线最近的点,确保他们离分割面尽可能的远。这样我们的分类器会更稳健一些。从上面的例子来看,虚线穿过的样例便是离分割线最近的点,这样的点可能是不唯一的,因为分割线并不确定,下图中黑线穿过的训练样例也满足这个要求:所以“他们离分割面尽可能的远”这个要求就十分重要了,他告诉我们一个稳健的超平面是红线而不是看上去也能分离数据的黄线。这样就解决了我们一开始提出的如何减少储存量的问题,我们只要存储虚线划过的点即可(因为在w ? x+b=-1左侧,w ? x+b=1右侧的点无论有多少都不会影响决策)。像图中虚线划过的,距离分割直线(比较专业的术语是超平面)最近的点,我们称之为支持向量。这也就是为什么我们这种分类方法叫做支持向量机的原因。至此,我们支持向量机的分类问题转化为了如何寻找最大间隔的优化问题。二、SVM的一些细节支持向量机的实现涉及许多有趣的细节:如何最大化间隔,存在“噪声”的数据集怎么办,对于线性不可分的数据集怎么办等。我这里不打算讨论具体的算法,因为这些东西完全可以参阅july大神的《支持向量机通俗导论》,我们这里只是介绍遇到问题时的想法,以便分析数据时合理调用R中的函数。几乎所有的机器学习问题基本都可以写成这样的数学表达式:给定条件:n个独立同分布观测样本(x1 , y1 ), (x2 , y2 ),……,(xn , yn )目标:求一个最优函数f (x,w* )最理想的要求:最小化期望风险R(w)不同的是我们如何选择f,R。对于支持向量机来说,f(x,w*)=w? x+b,最小化风险就是最大化距离|w ?x|/||w||,即arg max{min(label ?(w ?x+b))/||w||} (也就是对最不confidence 的数据具有了最大的 confidence)这里的推导涉及了对偶问题,拉格朗日乘子法与一堆的求导,我们略去不谈,将结果叙述如下:我们以鸢尾花数据来说说如何利用svm做分类,由于svm是一个2分类的办法,所以我们将鸢尾花数据也分为两类,“setosa”与“versicolor”(将后两类均看做一类),那么数据按照特征:花瓣长度与宽度做分类,有分类:从上图可以看出我们通过最优化原始问题或者对偶问题就可以得到w,b,利用 sign(w.x+b)就可以判断分类了。我们这里取3, 10,56, 68,107, 120号数据作为测试集,其余的作为训练集,我们可以看到:训练集 setosa virginicasetosa 48 0virginica 0 96测试集 setosa virginicasetosa 2 0virginica 0 4也就是完全完成了分类任务。我们来看看鸢尾花后两类的分类versicolor和virginica的分类,我们将数据的散点图描绘如下:(我们把第一类“setosa“看做”versicolor“)不难发现这时无论怎么画一条线都无法将数据分开了,那么这么办呢?我们一个自然的办法就是允许分类有一部分的错误,但是错误不能无限的大。我们使用一个松弛项来分类数据。最优化问题转变为:当我们确定好松弛项C后,就可以得到分类:我们还是先来看看分类的效果:(C=10)训练集 versicolor virginicaversicolor 93 2virginica 3 46测试集 versicolor virginicaversicolor 4 2virginica 0 0虽然分类中有一些错误,但是大部分还是分开了的,也就是说还是不错的,至少完成了分类这个任务。我们再来看看一个更麻烦的例子:假设数据是这样的:这时再用直线作为划分依据就十分的蹩脚了,我们这时需要引入核的方法来解决这个问题。在上图中,我们一眼就能看出用一个S型去做分类就可以把数据成功分类了(当然是在允许一点点错误的情况下),但是计算机能识别的只有分类器的分类结果是-1还是1,这时,我们需要将数据做出某种形式的转换,使得原来不可用直线剖分的变得可分,易分。也就是需要找到一个从一个特征空间到另一个特征空间的映射。我们常用的映射有:线性核:u'*v多项式核:(gamma*u'*v+ coef0)^degree高斯核:exp(-gamma*|u-v|^2)Sigmoid核:tanh(gamma*u'*v + coef0)我们这里使用各种常见的核来看看分类效果:从图中我们可以看到正态核的效果是最好的,用数据说话,我们来看看分类错误率与折10交叉验证的结果(报告平均分类正确率):我们可以看到,无论从存储数据量的多少(支持向量个数)还是分类精确度来看,高斯核都是最优的。所以一般情况,特别是在大样本情况下,优先使用高斯核,至少可以得到一个不太坏的结果(在完全线性可分下,线性函数的支持向量个数还是少一些的)。三、libSVM的R接口有许多介绍SVM的书都有类似的表述“由于理解支持向量机需要掌握一些理论知识,而这对读者来说有一定的难度,建议直接下载LIBSVM使用。”确实,如果不是为了训练一下编程能力,我们没有必要自己用前面提到的做法自己实现一个效率不太高的SVM。R的函数包e1071提供了libSVM的接口,使用e1071的函数SVM()可以得到libSVM相同的结果,write.svm()更是可以把R训练得到的结果写为标准的libSVM格式供其他环境下的libSVM使用。在介绍R中函数的用法时,我们先简要介绍一下SVM的类型,以便我们更好地理解各个参数的设置。对于线性不可分时,加入松弛项,折衷考虑最小错分样本和最大分类间隔。增加了算法的容错性,允许训练集不完全分类,以防出现过拟合。加入的办法有以下3类,写成最优化问题形式总结如上图:上图中e为所有元素都为1的列向量,Qij=yiyjK( xj), K( xj) =phi(xi) ?phi (xj), phi(.)为核函数,K(. ;.)表示对应元素核函数的内积。现在我们来看看svm()函数的用法。## S3 method for class 'formula'svm(formula, data = NULL, ..., subset,na.action =na.omit, scale = TRUE)## Default S3 method: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,class.weights = NULL, cachesize = 40,tolerance = 0.001, epsilon = 0.1,shrinking = TRUE, cross = 0, probability =FALSE, fitted = TRUE, seed = 1L,..., subset, na.action = na.omit)主要参数说明:Formula:分类模型形式,在第二个表达式中使用的的x,y可以理解为y~x。Data:数据集Subset:可以指定数据集的一部分作为训练集Na.action:缺失值处理,默认为删除数据条目Scale:将数据标准化,中心化,使其均值为0,方差为1.默认自动执行。Type:SVM的形式,使用可参见上面的SVMformulation,type的选项有:C-classification,nu-classification,one-classification (for novelty detection),eps-regression,nu-regression。后面两者为利用SVM做回归时用到的,这里暂不介绍。默认为C分类器,使用nu分类器会使决策边界更光滑一些,单一分类适用于所有的训练数据提取自同一个类里,然后SVM建立了一个分界线以分割该类在特征空间中所占区域和其它类在特征空间中所占区域。Kernel:在非线性可分时,我们引入核函数来做非线性可分,R提供的核介绍如下:线性核:u'*v多项式核:(gamma*u'*v + coef0)^degree高斯核:exp(-gamma*|u-v|^2)Sigmoid核:tanh(gamma*u'*v + coef0)默认为高斯核(RBF),libSVM的作者对于核的选择有如下建议:Ingeneral we suggest you to try the RBF kernel first. A recent result by Keerthiand Lin shows that if RBF is used with model selection, then there is no need to consider the linear kernel. The kernel matrix using sigmoid may not be positive definite and in general it's accuracy is not better than RBF. (see thepaper by Lin and Lin. Polynomial kernels are ok but if a high degree is used,numerical difficulties tend to happen (thinking about dth power of (&1) goes to 0 and (&1) goes to infinity).顺带说一句,在kernlab包中,可以自定义核函数。Degree:多项式核的次数,默认为3Gamma:除去线性核外,其他的核的参数,默认为1/数据维数Coef0,:多项式核与sigmoid核的参数,默认为0Cost:C分类的惩罚项C的取值Nu:nu分类,单一分类中nu的取值Cross:做K折交叉验证,计算分类正确性。由于svm的编程确实过于复杂,还涉及到不少最优化的内容,所以在第二部分我的分类都是使用svm函数完成的(偷一下懒),现将部分R代码展示如下:dataSim的函数:[plain] view plaincopyprintsimData=function(radius,width,distance,sample_size)
aa1=runif(sample_size/2)
aa2=runif(sample_size/2)
rad=(radius-width/2)+width*aa1
theta=pi*aa2
x=rad*cos(theta)
y=rad*sin(theta)
label=1*rep(1,length(x))
x1=rad*cos(-theta)+rad
y1=rad*sin(-theta)-distance
label1=-1*rep(1,length(x1))
n_row=length(x)+length(x1)
data=matrix(rep(0,3*n_row),nrow=n_row,ncol=3)
data[,1]=c(x,x1)
data[,2]=c(y,y1)
data[,3]=c(label,label1)
dataSim=simData(radius=10,width=6,distance=-6,sample_size=3000)
colnames(dataSim)&-c(&x&,&y&,&label&)
dataSim&-as.data.frame(dataSim)
Sigmoid核的分类预测:[plain] view plaincopyprintm1 &- svm(label ~x+y, data =dataSim,cross=10,type=&C-classification&,kernel=&sigmoid&)
summary(m1)
pred1&-fitted(m1)
table(pred1,dataSim[,3])
核函数那一小节作图的各种东西:[plain] view plaincopyprintlinear.svm.fit &- svm(label ~ x + y, data = dataSim, kernel ='linear')
with(dataSim, mean(label == ifelse(predict(linear.svm.fit) & 0,1, -1)))
polynomial.svm.fit &- svm(label ~ x + y, data = dataSim, kernel ='polynomial')
with(dataSim, mean(label == ifelse(predict(polynomial.svm.fit) &0, 1, -1)))
radial.svm.fit &- svm(label ~ x + y, data = dataSim, kernel ='radial')
with(dataSim, mean(label == ifelse(predict(radial.svm.fit) & 0,1, -1)))
sigmoid.svm.fit &- svm(label ~ x + y, data = dataSim, kernel ='sigmoid')
with(dataSim, mean(label == ifelse(predict(sigmoid.svm.fit) & 0,1, -1)))
df &- cbind(dataSim,
data.frame(LinearSVM = ifelse(predict(linear.svm.fit) & 0, 1, -1),
PolynomialSVM = ifelse(predict(polynomial.svm.fit) & 0, 1, -1),
RadialSVM = ifelse(predict(radial.svm.fit) & 0, 1, -1),
SigmoidSVM = ifelse(predict(sigmoid.svm.fit) & 0, 1, -1)))
library(&reshape&)
predictions &- melt(df, id.vars = c('x', 'y'))
library('ggplot2')
ggplot(predictions, aes(x = x, y = y, color = factor(value))) +
geom_point() +
facet_grid(variable ~ .)
最后,我们回到最开始的那个手写数字的案例,我们试着利用支持向量机重做这个案例。运行代码:[plain] view plaincopyprintsetwd(&D:/R/data/digits/trainingDigits&)
names&-list.files(&D:/R/data/digits/trainingDigits&)
data&-paste(&train&,1:1934,sep=&&)
for(i in 1:length(names))
assign(data[i],as.vector(as.matrix(read.fwf(names[i],widths=rep(1,32)))))
label&-rep(0:9,c(189,198,195,199,186,187,195,201,180,204))
data1&-get(data[1])
for(i in 2:length(names))
data1&-rbind(data1,get(data[i]))
m &- svm(data1,label,cross=10,type=&C-classification&)
summary(m)
pred&-fitted(m)
table(pred,label)
setwd(&D:/R/data/digits/testDigits&)
names&-list.files(&D:/R/data/digits/testDigits&)
data&-paste(&train&,1:1934,sep=&&)
for(i in 1:length(names))
assign(data[i],as.vector(as.matrix(read.fwf(names[i],widths=rep(1,32)))))
data2&-get(data[1])
for(i in 2:length(names))
data2&-rbind(data2,get(data[i]))
pred&-predict(m,data2)
labeltest&-rep(0:9,c(87,97,92,85,114,108,87,96,91,89))
table(pred,labeltest)
模型摘要:Call:svm.default(x = data1, y = label, type =&C-classification&, cross =10)Parameters:SVM-Type: C-classificationSVM-Kernel: radialcost: 1gamma: 0.Number of Support Vectors: 1139 ( 78 130 101 124 109 122 87 93 135 160 )Number of Classes: 10Levels: 0 1 2 3 4 5 6 7 8 910-fold cross-validation on training data:Total Accuracy: 96.7425Single Accuracies:97.73 91.87 94.52 97.22 98.68当然,我们还可以通过m$SV查看支持向量的情况,m$index查看支持向量的标签,m$rho查看分类时的截距b。训练集分类结果:我们拿测试数据来看:分类正确率为:0.9735729,误差率为2.6%左右,确实达到了开篇提出的可比的目的,而需要储存的支持向量个数仅为1139个,比原来的训练数据1934个要少了近50%,也达到了我们要求的节约存储的目的。当然值得一提的是线性分类的效果在实际中也没有那么糟糕,可以牺牲线性核函数的正确率来换取分类速度与存储空间。另外,支持向量的个数与训练集的出错率也没有特别必然的联系,而是与容错率cost有一定的联系。炼数成金(Dataguru_cn) 
 文章为作者独立观点,不代表微头条立场
的最新文章
十八届三中全会的重大成果之一是成立国家安全委员会。故此,市场人士认为,国家安全高于一切,去“IOE”将被国家一、
电子信息技术二、
生物与新医药技术三、
航空航天技术四、
新材料技术五、给数据科学家提供最好的工作工具是非常困难的。他们的电脑上几乎需要有所有的功能,如极致的性能,最新的软件,以及OpenStack云平台技术是云计算技术中的主流技术,已得到大量主流商业厂商和研究机构的大力支持。在未来的几Apache SINGA 是 Apache 在 2015 年 3 月 17 日接纳的一个孵化项目,是个分布式本文所有文字的HTML文件大约有25000个字节。这小于你从这个网页上下载的任何一个图像文件。因为图像文件通OpenStack云平台技术是云计算技术中的主流技术,已得到大量主流商业厂商和研究机构的大力支持。在未来的几2015年, Spark只用了一年多时间,已实现开源到火爆 ,亦逐渐显露出与通用大数据平台Hadoop的分庭这是一个学物理的理科生,用理性的思维看待生活中的各种谬论,从科学角度解释这些现象的起因。就像文中所写:我们不或许在很多人眼里,数学是一门很枯燥的学问,数学家们则是一群性格乏味的怪人。但实际上,富有智慧的人往往是不会真有这样一个传说,将人工智能和机器学习算法用于服务器农场后,你就可以搬家到夏威夷,在让机器交易的同时你终日躺在MySQL数据库作为世界上最流行的开源数据库,以简单、易用、开源等特点,收到互联网行业的推崇。随着去IOE运对人工智能领域来说,2015年是值得纪念的一年。不仅计算机「学」得更多更快了,我们也懂得了如何改进计算机系统十八届三中全会的重大成果之一是成立国家安全委员会。故此,市场人士认为,国家安全高于一切,去“IOE”将被国家茹志强,数据分析与挖掘老兵,有6年的通讯行业数据分析工作经验。曾因为备考研究生,通过人大经济论坛接触到数据分最近,我加入了Cloudera,在这之前,我在计算生物学/基因组学上已经工作了差不多10年。我的分析工作主要1、朱自清版这几天心里颇不宁静了,眼看上线的日子越来越临近,而项目Bug之多,密密的交叉着,却无从改起,于是每月都有数百万人通过网络给出积极或者消极的医疗反馈。一些人会在论坛上抱怨无效的处方,或者讨论哪种药的治疗效果要论数学平均水平,美国孩子和中国孩子不是一个量级。但这常被国内一些家长质疑“太过简单”的美国数学教育,却更有作者简介祝威廉目前在乐视云数据部门里从事实时计算,数据平台、搜索和推荐等多个方向。曾从事基础框架,搜索研发四最近,我加入了Cloudera,在这之前,我在计算生物学/基因组学上已经工作了差不多10年。我的分析工作主要引言预测模型的准确率可以用2种方法来提高:要么进行特征设计,要么直接使用boosting算法。参加过许多数据1、 引言:不要站在岸上学游泳“机器学习”是一个很实践的过程。就像刚开始学游泳,你在只在岸上比划一堆规定动作在软件开发周期中,测试越来越被人们所重视,经过这些年测试行业的迅猛发展,测试也惭惭的在向技术性测试进行转变,金融数学是一门应用性极强的学科,其特殊之处在于,与许多其他应用学科如生物相比,它的难度更类似于数学物理,而另电影《美丽心灵》的主人公原型约翰·纳什车祸于日去世。你也许听说过他是厉害的数学家、1994茹志强,数据分析与挖掘老兵,有6年的通讯行业数据分析工作经验。曾因为备考研究生,通过人大经济论坛接触到数据分本文从OpenStack架构入手,剖析了IaaS的云平台最核心的主要是这三部分:计算、网络、存储,作者指出O金融数学,又称数理金融学等,是利用数学工具研究金融现象,通过数学模型进行定量分析,以求找到金融活动中潜在的规日,香港科技大学宣布日前与微信联合成立“微信-香港科技大学人工智能联合实验室”(简称WHA作者李志文先生是美国杜兰大学商学院蔻翰讲座教授,浙江大学光彪讲座教授、商学研究院院长,清华大学经管学院特聘教如果机器人能像人一样看见周围的世界,它们的能力将得到极大的提升。那么,究竟什么叫看见?机器人看见世界的方式和谈到大数据,相信大家对 Hadoop 和 Apache Spark 这两个名字并不陌生。但我们往往对它们的理“很多时候,我们面临未来的预测和期望,其实很多答案已经存在在历史中。”改变世界的“箱子”“没有集装箱,就不会数据科学家对优化算法和模型以进一步发掘数据价值的追求永无止境。在这个过程中他们不仅需要总结前人的经验教训,还云计算最近是真火,不光创业公司、中小企业用云计算,越来越多的政府、大型央企也开始采购云计算服务。大家从不知道十八届三中全会的重大成果之一是成立国家安全委员会。故此,市场人士认为,国家安全高于一切,去“IOE”将被国家0x01 背景介绍A 项目采集其它项目生成的数据,数据保存一定时间,并且不需要持久化。故 A 项目使用单点 “大数据”和“数据分析”的人本因素机构和组织一直以来通过分析数据来帮助企业制定战略、经营决策,以及进行风险管12月2号,塞科姆湖发生了枪击案,死14人,伤22人。FBI在获知罪犯将一块可能记录有相关邮件和证据的硬盘丢最近一项研究表明,人类可以使用少于1%的原始信息来分类数据,验证了一种解释人类学习的随机映射算法——这种方法00 缘起之所以有这个话题,是因为周末加班中午吃饭与一个同行朋友聊起了这个话题,之后再细细地结合一些其他接触人类的大脑为何如此之大?目前,科学家已经开始破译出那些让大脑异常活跃的生物诱因。虽然我们痴迷于自己大脑的尺寸老老实实看书!关于SAS学习,目的不同,学习的策略也会有所不同。我们姑且将学习目的分为三种:T1. 点到即止上周,谷歌宣布他们的量子计算机比传统计算机快上1亿倍,有人欢呼雀跃,有人提出质疑。让我们来看看背后的故事吧,本文是D语言联合创始人、架构师Andrei Alexandrescu在问答Quora上关于“在取代C语言的道算法日益影响着我们的生活。但是在它正常运转的大部分时间里我们却没有留意,只有在算法出问题的时候才注意到它的存1960年-2013年深度学习时间线亮点[A] 1962年:来自简单细胞和复杂细胞的神经生物学的启示Hube当完全完成足足三十亿字母长度的人类染色体组测序后,我们也就势不可挡地进入了生物研究中的「组学」纪元。科学家现中国的谚语常说,早睡早起身体好。但牛津大学有一位学者不这么认为。这位学者叫Paul Kelley,他去年的一Dataguru_cn关注炼数成金,学习数据挖掘与分析技巧,了解最新快的数据分析课程信息。更多知识更多优惠,尽在炼数成金!招募天下好汉,一起炼数成金!热门文章最新文章Dataguru_cn关注炼数成金,学习数据挖掘与分析技巧,了解最新快的数据分析课程信息。更多知识更多优惠,尽在炼数成金!招募天下好汉,一起炼数成金!君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
支持向量机多类分类方法
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
支持向量机多类分类方法
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口工具类服务
编辑部专用服务
作者专用服务
基于支持向量机的多分类方法研究
支持向量机是由AT&T BeU实验室的Vapnik等人提出的一种针对分类和回归问题的新型机器学习方法,是借助于最优化方法解决机器学习问题的新工具.支持向量机方法基于统计学习理论与结构风险最小化原理,具有良好的推广性和较高的准确率.它集成了最优分类超平面、核技巧、凸二次规划等多项技术,能有效地解决“过学习”、“维数灾难”和局部极小点等问题.由于出色的学习性能,支持向量机已经成为当前机器学习界的研究热点,并在很多领域得到了广泛的应用,包括模式识别、回归估计等方面.由于支持向量机方法最初是针对二类别的分类问题提出的,如何将二类别分类方法扩展到多类别分类是支持向量机研究的一个重要内容.
本文主要做了以下个方面的工作:
1.对机器学习、统计学习理论以及支持向量机的发展和研究现状进行了介绍.对支持向量机的理论和算法进行了详细的介绍.同时,还对核函数理论、参数选择等热点问题进行了讨论.
2.对支持向量机二分类问题的特征选择进行了研究.提出了提高支持向量机分类性能的特征选择方法,并通过实验验证了所提方法的有效性.
3.总结了目前常用的基于支持向量机的多分类方法,包括一类对余类方法、一类对一类方法、决策二叉树方法、决策导向无环图方法、纠错输出编码方法等.对比讨论了各种方法的优缺点.针对决策二叉树支持向量机多分类方法存在的弊端,综合考虑了类距离与类的分布对类间可分离性的影响,采用层次聚类方法建立新的树结构,以提高多分类器的决策速度与准确率.实验结果验证了所提方法的有效性.
学科专业:
授予学位:
学位授予单位:
导师姓名:
学位年度:
在线出版日期:
本文读者也读过
相关检索词
万方数据知识服务平台--国家科技支撑计划资助项目(编号:2006BAH03B01)(C)北京万方数据股份有限公司
万方数据电子出版社君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
SVM-KNN分类器——一种提高SVM分类精度的新方法
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口掌握机器学习算法不再是天方夜谭的事情。大多数初学者都是从回归模型学起。虽然回归模型简单易学易上手,但是它能解决我们的需求吗?当然不行!因为除了回归模型外我们还可以构建许多模型。
我们可以把机器学习算法看成包含剑、锋刃、弓箭和匕首等武器的兵器库。你拥有各式各样的工具,但是你应该在恰当的时间点使用它们。比如,我们可以把回归模型看做“剑”,它可以非常高效地处理切片数据,但是它却无法应对高度复杂的数据。相反的是,“支持向量机模型”就像一把尖刀,它可以更好地对小数据集进行建模分析。
到目前为止,我希望你已经掌握了随机森林、朴素贝叶斯算法和集成建模方法。不然的话,我建议你应该花一些时间来学习这些方法。本文中,我将会介绍另外一个重要的机器学习算法——支持向量机模型。
什么是支持向量机模型?
支持向量机模型运行原理
如何利用 Python 实现 SVM?
如何调整 SVM 的参数?
SVM 的优缺点
什么是支持向量机模型?
支持向量机(SVM)是一种有监督学习的算法,它可以用来处理分类和回归的问题。然而,实际应用中,SVM 主要用来处理分类问题。在这个算法中,首先我们将所有点画在一个 n 维空间中(其中 n 代表特征个数)。然后我们通过寻找较好区分两类样本的超平面来对数据进行分类处理(如下图所示)。
支持向量是观测值的坐标,支持向量机是隔离两个类别的最佳边界(超平面)。
你可以在这里看到关于支持向量的定义和一些实例。
支持向量机的运行原理
首先,我们已经熟悉了如何利用超平面来区分两个类别的数据。如今急需解决的问题是:“如何找出最佳的超平面?”不要担心,它没有你所想的那么困难!
让我们来看几个例子:
场景一:首先,我们有三个超平面(A、B 和 C)。现在我们需要的是找出区分星星和圆圈的最佳超平面。
你需要记住一个识别最佳超平面的经验法则:“选择能更好区分两个类别的超平面。”在这个例子中,超平面“B”是最佳分割平面。
场景二:首先我们有三个超平面(A、B 和 C),它们都很好地区分两个类别的数据。那么我们要如何选出最佳的超平面呢?
在这里,我们可以通过最大化超平面和其最近的各个类别中数据点的距离来寻找最佳超平面。这个距离我们称之为边际距离。
从上图中你可以看到超平面 C 的边际距离最大。因此,我们称 C 为最佳超平面。选择具有最大边际距离的超平面的做法是稳健的。如果我们选择其他超平面,将存在较高的错分率。
场景三:利用之前章节提到的规则来识别最佳超平面
或许你们会选择具有较大边际距离的超平面 B。但是你们错了,SVM 选择超平面时更看重分类的准确度。在上图中,超平面 B 存在一个错分点而超平面 A 的分类则全部正确。因此,最佳超平面是 A。
场景四:由于存在异常值,我们无法通过一条直线将这两类数据完全区分开来。
正如我之前提到的,另一端的星星可以被视为异常值。SVM 可以忽略异常值并寻找具有最大边际距离的超平面。因此,我们可以说 SVM 模型在处理异常值时具有鲁棒性。
场景五:在这个场景中,我们无法通过线性超平面区分这两类数据,那么 SVM 是如何对这种数据进行分类的呢?
SVM 模型可以非常容易地解决这个问题。通过引入新的变量信息,我们可以很容易地搞定这个问题。比如我们引入新的变量然后我们对 x 和 z 构建散点图:
从上图中我们可以看出:
由于所以变量 z 恒大于零。
原始图中,红圈数据分布在原点附近,它们的 z 值比较小;而星星数据则远离原点区域,它们具有较大的 z 值。
在 SVM 模型中,我们可以很容易地找到分割两类数据的线性超平面。但是另外一个急需解决的问题是:我们应该手动增加变量信息从而获得该线性超平面分割吗?答案是否定的!SVM 模型有一个工具叫做 kernel trick。该函数可以将输入的低维空间信息转化为高维空间信息。在解决非线性分割问题时,我们经常用到这个函数。简单地说,该函数可以转换一些极其复杂的数据,然后根据自己所定义的标签或输出结果寻找区分数据的超平面。
我们可以在原始图中画出最佳超平面:
接下来,我们将学习如何将 SVM 模型应用到实际的数据科学案例中。
如何利用 Python 实现 SVM 模型?
在 Python 中,scikit-learn 是一个被广泛使用的机器学习算法库。我们可以通过 scikit-learn 库来构建 SVM 模型。
如何调整 SVM 模型的参数?
有效地调节机器学习算法的参数可以提高模型的表现力。让我们来看看 SVM 模型的可用参数列表:
接下来我将要讨论 SVM 模型中一些比较重要的参数:“kernel”,“gamma”和“C”。
kernel:我们之前已经讨论过这个问题。Kernel参数中具有多个可选项:“linear”,“rbf”和“poly”等(默认值是“rbf”)。其中 “rbf”和“poly”通常用于拟合非线性超平面。下面是一个例子:我们利用线性核估计-对鸢尾花数据进行分类。
例子:线性核估计
例子:rbf 核估计
我们可以通过下面的代码调用 rbf 核估计,并观察其拟合结果。
当变量个数比较大时(大于1000),我建议你最好使用线性核估计,因为在高维空间中数据大多是线性可分的。当然你也可以利用 rbf 核估计,不过你必须使用交叉验证调整参数从而避免过度拟合。
“gamma”:“rbf”,“poly”和“sigmoid”的核估计系数。gamma的取值越大,越容易出现过度拟合的问题。
例子:比较不同gamma取值下模型的拟合结果
C:误差项的惩罚参数。我们可以通过调节该参数达到平衡分割边界的平滑程度和分类准确率的目的。
我们应该经常关注交叉验证结果从而有效地利用这些参数的组合避免过度拟合情况的问题。
SVM 模型的优缺点
它的分类效果非常好。
它可以有效地处理高维空间数据。
它可以有效地处理变量个数大于样本个数的数据。
它只利用一部分子集来训练模型,所以 SVM 模型不需要太大的内存。
它无法很好地处理大规模数据集,因为此时它需要较长的训练时间。
同时它也无法处理包含太多噪声的数据集。
SVM 模型并没有直接提供概率估计值,而是利用比较耗时的五倍交叉验证估计量。
在本文中,我们详细地介绍了机器学习算法——支持向量机模型。我介绍了它的工作原理,Python 的实现途径,使模型更有效参数调整技巧以及它的优缺点。我建议你使用 SVM 模型并通过调整参数值分析该模型的解释力。同时我还想了解你们使用 SVM 的经验,你在建模过程有通过调整参数来规避过度拟合问题和减少建模训练的时间吗?
原文作者:Sunil Ray
翻译:Fibears
via:数据工匠
相关阅读:
转载请注明来自36大数据(): &
除非特别注明,本站所有文章均不代表本站观点。报道中出现的商标属于其合法持有人。请遵守理性,宽容,换位思考的原则。

我要回帖

更多关于 支持向量机分类算法 的文章

 

随机推荐