前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言实现支持向量机(SVM)

R语言实现支持向量机(SVM)

作者头像
一粒沙
发布2019-07-31 10:01:05
8.9K0
发布2019-07-31 10:01:05
举报
文章被收录于专栏:R语言交流中心R语言交流中心

支持向量机(Support Vector Machine,SVM)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。支持向量机方法是建立在统计学习理论的VC 维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力。目前使用广泛的SVM实现工具是libsvm,其不仅集成在很多统计软件例如R,PYTHON等,还可以直接在Linux以及Windows下运行。

官网:https://www.csie.ntu.edu.tw/~cjlin/libsvm/

今天我们介绍一下在R语言中SVM的实现以及参数的优化。

1. 首先安装SVM的R包e1071,同时安装数据的R包mlbench

2. 载入R包,并载入相关的测试数据。

3. 我们看下我们主要用到的几个函数以及相关的参数

a. svm() 模型构建函数

此函数主要是构建SVM模型,其中主要的参数:

formaula 设置所要训练的属性值以及结果例如Type ~ .:代表Type是结果并选取所有的属性值。

type可取的值有C-classification、nu-classification、one-classification、eps-regression和nu-regression这五种类型中。其中,前三种是针对于字符型结果变量的分类方式,其中第三种方式是逻辑判别,即判别结果输出所需判别的样本是否属于该类别;而后两种则是针对数值型结果变量的分类方式。

degree是仅用于多项式核函数中的参数,代表多项式核函数的次数,在本例中,经过实践发现degree为奇数时,degree越大模型表现越好,为偶数时,degree越大,模型越差,当degree足够大时,模型准确率趋于稳定。另外,当degree高于15时,R出现警告信息,而且当样本数据量较大时,设置过高的degree将非常危险。

cost是惩罚因子,可与任意核函数搭配,在本例中,分别取了1 2 3 4,发现cost越大越好。此外,cost与degree通常配合使用,在研究他们时,使用交叉验证法会得到更精确的结果。

gamma是选择径向基核函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。

Kernel指的是支持向量机的类型,实质上是一种映射函数,将低维空间非线性问题映射到高维空间编程线性问题进行处理。它可能是线性SVM (linear)、多项式SVM (polynomial)、径向SVM (radial)或Sigmoid SVM (sigmoid)。默认是径向SVM。其中性能最好是径向基核函数,其次是多项式核函数,最差的是神经网络核函数。

模型构建好后,可以通过summary函数获取模型的详细信息。

b. predict() 模型预测函数.

c. table()函数,获取预测结果的频数。

主要参数pred和true也就是同一个数据的两列值,进行合并并统计出对应的因子的频数

通过table函数我们可以得到预测的真实结果的分布。如果觉得这样展示形式不友好,还可以变换:

d. plot() 绘制SVM的可视化展示

此函数主要是绘制散点图可视化分类情况。

  1. 样例程序

library(e1071)

data(Glass,package="mlbench")

index<- 1:nrow(Glass)

testindex<- sample(index, trunc(length(index)/3))

testset<- Glass[testindex,]

trainset<- Glass[-testindex,]

svm.model<- svm(Type ~ ., data = trainset, cost = 100, gamma = 1)

svm.pred <- predict(svm.model,testset[,-10])

4. 参数优化

a. tune.svm() 寻求最优模型

此函数可以进行模型的优化,并获取相关的参数值。

b. 自定义编程实现参数优化

a<-c() for(i in 1:10){ for(j in 1:10){ for(k in 1:10){ svm.fit<- svm(Type ~ .,data = trainset, cost = 100, gamma = 1)

svm.pre<-ifelse(predict(svm.fit)>0,1,0) n<-ifelse(svm.pre==z,1,0) result<-c(i,j,k,sum(n)) a<-rbind(a,result) }}} a[which(a[,4]==max(a[,4])),]

总结,我们所涉及的是多分类问题。那么准确率,召回率以及F1-measure的计算公式如下图:

准确率和召回率是互相影响的,理想情况下肯定是做到两者都高,但是一般情况下准确率高、召回率就低,召回率低、准确率高,当然如果两者都低,那是什么地方出问题了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 R语言交流中心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
灰盒安全测试
腾讯知识图谱(Tencent Knowledge Graph,TKG)是一个集成图数据库、图计算引擎和图可视化分析的一站式平台。支持抽取和融合异构数据,支持千亿级节点关系的存储和计算,支持规则匹配、机器学习、图嵌入等图数据挖掘算法,拥有丰富的图数据渲染和展现的可视化方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档