SVM是比较常用的分类算法,其核心采用的是线性分类器,如果数据在当前维度下不可分割,可以映射到更高的维度之上。本文将着重介绍SVM算法的R语言实现。
使用的是e1071包中的svm函数。
数据简介
本文数据选择了红酒质量分类数据集,这是一个很经典的数据集,原数据集中“质量”这一变量取值有{3,4,5,6,7,8}。为了实现二分类问题,我们添加一个变量“等级”,并将“质量”为{3,4,5}的观测划分在等级0中,“质量”为{6,7,8}的观测划分在等级1中。
因变量:等级
自变量:非挥发性酸性、挥发性酸性、柠檬酸、剩余糖分、氯化物、游离二氧化硫、二氧化硫总量、浓度、pH、硫酸盐、酒精
library(openxlsx)
wine = read.xlsx("C:/Users/Mr.Reliable/Desktop/classification/winequality-red.xlsx")
#将数据集分为训练集和测试集,比例为7:3
train_sub = sample(nrow(wine),7/10*nrow(wine))
train_data = wine[train_sub,]
test_data = wine[-train_sub,]
SVM的实现
R包下载
install.packages('e1071')
实现SVM
svm函数的重要参数:
| 参数 | 意义 |
|---|---|
| formula | y yy~x 1 + 1 2 + . . . + x n x_1+1_2+...+x_nx1+12+...+xn,确定自变量和因变量 |
| data | 使用的数据集 |
| type | 分类:C-classification(default)/nu-classification;文本分类:one-classification;回归:eps-regression(default)/nu-regression |
| kernel | linear/polynomial/radial/sigmoid |
SVM算法有很多参数可以选择,而且当type和kernel的选择不同时,其他的参数才有意义,如果没有特别的要求,剩下的参数其实可以不使用或者使用默认值。具体详见SVM算法的参数详解
library(pROC) #绘制ROC曲线
library(e1071)
#数据预处理
train_data$等级 = as.factor(train_data$等级)
test_data$等级 = as.factor(test_data$等级)
#svm:由于是分类问题,此处我们选择C-classification
wine_svm<- svm(等级 ~ 非挥发性酸性+挥发性酸性+柠檬酸+剩余糖分+氯化物
+游离二氧化硫+二氧化硫总量+浓度+pH+硫酸盐+酒精,
data = train_data,
type = 'C',kernel = 'radial' )
这样我们就实现了SVM算法
ROC曲线和AUC值
#测试集
pre_svm <- predict(wine_svm,newdata = test_data)
obs_p_svm = data.frame(prob=pre_svm,obs=test_data$等级)
###输出混淆矩阵
table(test_data$等级,pre_svm,dnn=c("真实值","预测值"))
###绘制ROC曲线
svm_roc <- roc(test_data$等级,as.numeric(pre_svm))
plot(svm_roc, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),grid.col=c("green", "red"), max.auc.polygon=TRUE,auc.polygon.col="skyblue", print.thres=TRUE,main='SVM模型ROC曲线 kernel = radial')

此时,AUC值为0.754
如果改变kernel:

此时,AUC值为0.726,由此可见改变kernel对数据的分类有很大影响。
版权声明:本文为weixin_43216017原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。