1995年VAPINK 等人在统计学习理论的基础上提出了一种模式识别的新方法—支持向量机 。它根据有限的样本信息在模型的复杂性和学习能力之间寻求一种最佳折衷。 以期获得最好的泛化能力.支持向量机的理论基础决定了它最终求得的是全局最优值而不是局部极小值,从而也保证了它对未知样本的良好泛化能力。
支持向量机的理论最初来自对两类数据分类问题的处理。SV M 考虑寻找一个超平面, 以使训练集中属于不同分类的点正好位于超平面的不同侧面, 并且,还要使这些点距离该超平面尽可能远。 即寻找一个超平面, 使其两侧的空白区域最大
如上图所示为二维两类线性可分模式 , 图中的圆圈和三角分别表示两类训练样本 , H 为把两类正确分开的分类线 , H 1、 H 2: 分别为各类 样本中离分类线最近的点且平行于分类线的直线 , 那么 , H1 , 和H 2之间的距离即为两类的分类间隔。 所谓最优分类线 , 就是要求分类线不但要将两类训练样本无错误地分开 , 并且,还要使两类的分类间隔最大 。推广到高维空间 , 最优分类线就成为最优超平面.
下面咱们来演示一下使用到的是e1071包,咱们先导入R包和数据
library(e1071)
library(caret)
bc<-read.csv("E:/r/test/demo.csv",sep=',',header=TRUE)
数据不能有缺失,不然会有各种各样的问题
bc <- na.omit(bc)
数据变量很多,我解释几个我等下要用的,HBP:是否发生高血压,结局指标,AGE:年龄,是我们的协变量,BMI肥胖指数,FEV1肺活量指标,WEIGHT体重,“SBP”,“DBP”:收缩压和舒张压。公众号回复:体检数据,可以获得数据。
有些变量用不到,我先精简一下,把结局变量变成因子,这个很重要。
bc<-bc[,c("HBP","BMI","AGE","FEV1","WEIGHT","SBP","DBP")]
bc$HBP<-as.factor(bc$HBP)
进行分析前还需对数据进行预处理,如果你是多分类的,并且数据差异大,可以使用分层抽样,尽量是数据匹配一下,方法详见我既往文章《R语言两种方法实现随机分层抽样》,我这里是二分类,我就不弄了。
接下来就是对数据进行标准化,这样可以消除数据见的差异。
定义一个标准化的小程序
f1<-function(x){return((x-min(x)) / (max(x)-min(x)))
}
接下进行标准化,标准化不要放入结局变量
bc.scale<-as.data.frame(lapply(bc[2:7],f1))
把结局变量加入表转化后数据中,得到新的数据
bc.scale<-cbind(HBP=bc$HBP,bc.scale)
弄好数据之后咱们就可以进行分析了,先把数据分为建模组和验证组
#分成建模和验证组
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%数据集
分析很简单,一句话代码
fit <- svm(HBP~.,data=bc_train)
summary(fit)
上图给出了一些模型的基本参数,默认情况下,gamma为预测变量个数的倒数,cost为1。gamma控制分割超平面的形状,gamma越大通常导致支持向量越多,cost越大意味着模型对误差的惩罚更大,从而将生成一个更复杂的分类边界。
假设想知道在模型划分下的BMI和SBP边界
plot(fit,data = bc_train,BMI~SBP)
上图可以看到,划分还是不是很好,咱们还可以通过slice参数来控制划分范围。
下面咱们预测数据,
pred <- predict(fit,bc_train)
使用混淆矩阵看下分类情况
tab <- table(Predicted = pred,Actual = bc_train$HBP)
tab
上图可以看到0这里有一个算错了,1这里有7个算错了,计算一下准确率
sum(diag(tab))/sum(tab)
使用confusionMatrix函数也是一样的
confusionMatrix(pred,bc_train$HBP)
接下来就是怎么调参,调高模型的准确率了,目前有多个方法调参,我介绍一下我自认为比较简单的,tune函数来调参,需要生成epsilon列表和cost列表,让函数交叉验证出最佳参数
tmodel <- tune(svm,HBP~.,data = bc_train,ranges = list(epsilon = seq(0,1,0.1,),cost = 2^(2:9)))
绘图
plot(tmodel)
在performance数值比较低,就是比较深颜色的地区,精度是比较好的
解析一下模型,可以看到不同参数的情况表达,最好的为0.06131579
summary(tmodel)
接下来咱们可以从tmodel中提取出最佳模型
mymodel <- tmodel$best.model
summary(mymodel)
加下来咱们看下调参数后模型的预测准确率,0和1一个都没有分类错
pred <- predict(mymodel,bc_train)
tab <- table(Predicted = pred,Actual = bc_train$HBP)
tab
看下准确率,达到了100%
sum(diag(tab))/sum(tab)
如果咱们想看预测组的,预测组也分得很准
pred1 <- predict(mymodel,bc_test)
tab1 <- table(Predicted = pred1,Actual = bc_test$HBP)
tab1
sum(diag(tab1))/sum(tab1)
下面咱们来进行ROC曲线绘制
从新生成一下原来的模型和预测值
fit <- svm(HBP~.,data=bc_train)
pred <- predict(fit,bc_train)
pred<-as.numeric(pred)
生成ROC并绘图
roc1 <- roc(bc_train$HBP,as.numeric(pred))
plot(roc1)
此外还可以进行校准曲线和决策曲线的绘制,如果大家有兴趣,我改天再写写。