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)

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

相关推荐
电饭叔24 分钟前
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
开发语言·python
Eternal-Student25 分钟前
everyday_question dq20240731
开发语言·arm开发·php
卑微求AC41 分钟前
(C语言贪吃蛇)11.贪吃蛇方向移动和刷新界面一起实现面临的问题
c语言·开发语言
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
Yvemil71 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
潘多编程1 小时前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring
冷静 包容2 小时前
C语言学习之 没有重复项数字的全排列
c语言·开发语言·学习
碳苯2 小时前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
结衣结衣.2 小时前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
学习使我变快乐2 小时前
C++:静态成员
开发语言·c++