R语言手把手教你进行支持向量机分析

1995年VAPINK 等人在统计学习理论的基础上提出了一种模式识别的新方法---支持向量机 。它根据有限的样本信息在模型的复杂性和学习能力之间寻求一种最佳折衷。 以期获得最好的泛化能力.支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部极小值,从而也保证了它对未知样本的良好泛化能力。

支持向量机的理论最初来自对两类数据分类问题的处理。SV M 考虑寻找一个超平面, 以使训练集中属于不同分类的点正好位于超平面的不同侧面, 并且,还要使这些点距离该超平面尽可能远。 即寻找一个超平面, 使其两侧的空白区域最大

如上图所示为二维两类线性可分模式 , 图中的圆圈和三角分别表示两类训练样本 , H 为把两类正确分开的分类线 , H 1、 H 2: 分别为各类 样本中离分类线最近的点且平行于分类线的直线 , 那么 , H1 , 和H 2之间的距离即为两类的分类间隔。 所谓最优分类线 , 就是要求分类线不但要将两类训练样本无错误地分开 , 并且,还要使两类的分类间隔最大 。推广到高维空间 , 最优分类线就成为最优超平面.

下面咱们来演示一下使用到的是e1071包,咱们先导入R包和数据

r 复制代码
library(e1071)
library(caret)
bc<-read.csv("E:/r/test/demo.csv",sep=',',header=TRUE)

数据不能有缺失,不然会有各种各样的问题

r 复制代码
bc <- na.omit(bc)

数据变量很多,我解释几个我等下要用的,HBP:是否发生高血压,结局指标,AGE:年龄,是我们的协变量,BMI肥胖指数,FEV1肺活量指标,WEIGHT体重,"SBP","DBP":收缩压和舒张压。公众号回复:体检数据,可以获得数据。

有些变量用不到,我先精简一下,把结局变量变成因子,这个很重要。

r 复制代码
bc<-bc[,c("HBP","BMI","AGE","FEV1","WEIGHT","SBP","DBP")]
bc$HBP<-as.factor(bc$HBP)

进行分析前还需对数据进行预处理,如果你是多分类的,并且数据差异大,可以使用分层抽样,尽量是数据匹配一下,方法详见我既往文章《R语言两种方法实现随机分层抽样》,我这里是二分类,我就不弄了。

接下来就是对数据进行标准化,这样可以消除数据见的差异。

定义一个标准化的小程序

r 复制代码
f1<-function(x){
  return((x-min(x)) / (max(x)-min(x)))
}

接下进行标准化,标准化不要放入结局变量

r 复制代码
bc.scale<-as.data.frame(lapply(bc[2:7],f1))

把结局变量加入表转化后数据中,得到新的数据

r 复制代码
bc.scale<-cbind(HBP=bc$HBP,bc.scale)

弄好数据之后咱们就可以进行分析了,先把数据分为建模组和验证组

r 复制代码
#分成建模和验证组
set.seed(12345)
tr1<- sample(nrow(bc.scale),0.7*nrow(bc.scale))##随机无放抽取
bc_train <- bc.scale[tr1,]#70%数据集
bc_test<- bc.scale[-tr1,]#30%数据集

分析很简单,一句话代码

r 复制代码
fit <- svm(HBP~.,data=bc_train)
summary(fit)

上图给出了一些模型的基本参数,默认情况下,gamma为预测变量个数的倒数,cost为1。gamma控制分割超平面的形状,gamma越大通常导致支持向量越多,cost越大意味着模型对误差的惩罚更大,从而将生成一个更复杂的分类边界。

假设想知道在模型划分下的BMI和SBP边界

r 复制代码
plot(fit,data = bc_train,BMI~SBP)

上图可以看到,划分还是不是很好,咱们还可以通过slice参数来控制划分范围。

下面咱们预测数据,

r 复制代码
pred <- predict(fit,bc_train)

使用混淆矩阵看下分类情况

r 复制代码
tab <- table(Predicted = pred,Actual = bc_train$HBP)
tab

上图可以看到0这里有一个算错了,1这里有7个算错了,计算一下准确率

r 复制代码
sum(diag(tab))/sum(tab)

使用confusionMatrix函数也是一样的

r 复制代码
confusionMatrix(pred,bc_train$HBP)

接下来就是怎么调参,调高模型的准确率了,目前有多个方法调参,我介绍一下我自认为比较简单的,tune函数来调参,需要生成epsilon列表和cost列表,让函数交叉验证出最佳参数

r 复制代码
tmodel <- tune(svm,HBP~.,data = bc_train,
               ranges = list(epsilon = seq(0,1,0.1,),
                             cost = 2^(2:9)))

绘图

r 复制代码
plot(tmodel)

在performance数值比较低,就是比较深颜色的地区,精度是比较好的

解析一下模型,可以看到不同参数的情况表达,最好的为0.06131579

r 复制代码
summary(tmodel)

接下来咱们可以从tmodel中提取出最佳模型

r 复制代码
mymodel <- tmodel$best.model
summary(mymodel)

加下来咱们看下调参数后模型的预测准确率,0和1一个都没有分类错

r 复制代码
pred <- predict(mymodel,bc_train)
tab <- table(Predicted = pred,Actual = bc_train$HBP)
tab

看下准确率,达到了100%

r 复制代码
sum(diag(tab))/sum(tab)

如果咱们想看预测组的,预测组也分得很准

r 复制代码
pred1 <- predict(mymodel,bc_test)
tab1 <- table(Predicted = pred1,Actual = bc_test$HBP)
tab1
sum(diag(tab1))/sum(tab1)

下面咱们来进行ROC曲线绘制

从新生成一下原来的模型和预测值

r 复制代码
fit <- svm(HBP~.,data=bc_train)
pred <- predict(fit,bc_train)
pred<-as.numeric(pred)

生成ROC并绘图

r 复制代码
roc1 <- roc(bc_train$HBP,as.numeric(pred))
plot(roc1)

此外还可以进行校准曲线和决策曲线的绘制,如果大家有兴趣,我改天再写写。

相关推荐
秃头佛爷37 分钟前
Python学习大纲总结及注意事项
开发语言·python·学习
待磨的钝刨38 分钟前
【格式化查看JSON文件】coco的json文件内容都在一行如何按照json格式查看
开发语言·javascript·json
浮生如梦_2 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
XiaoLeisj3 小时前
【JavaEE初阶 — 多线程】单例模式 & 指令重排序问题
java·开发语言·java-ee
励志成为嵌入式工程师4 小时前
c语言简单编程练习9
c语言·开发语言·算法·vim
捕鲸叉4 小时前
创建线程时传递参数给线程
开发语言·c++·算法
A charmer4 小时前
【C++】vector 类深度解析:探索动态数组的奥秘
开发语言·c++·算法
Peter_chq4 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
记录成长java6 小时前
ServletContext,Cookie,HttpSession的使用
java·开发语言·servlet
前端青山6 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js