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的实现

install.packages('e1071')

实现SVM

svm函数的重要参数:

参数意义
formula x1+12+...+xn,确定自变量和因变量
data使用的数据集
type分类:C-classification(default)/nu-classification;文本分类:one-classification;回归:eps-regression(default)/nu-regression
kernellinear/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')

roc_1
此时,AUC值为0.754

如果改变kernel:

roc_2
此时,AUC值为0.726,由此可见改变kernel对数据的分类有很大影响。

SVM是比较常用的分类算法,其核心采用的是线性分类器,如果数据在当前维度下不可分割,可以映射到更高的维度之上。本文将着重介绍SVM算法的R语言实现。使用的是e1071包中的svm函数。数据简介本文数据选择了红酒质量分类数据集,这是一个很经典的数据集,原数据集中“质量”这一变量取值有{3,4,5,6,7,8}。为了实现二分类问题,我们添加一个变量“等级”,并将“质量”为{3,4,5}的观测划...
步骤1. 数据预处理2. 建模1. linear2. polynomial3. radial basis4. sigmoid3. 模型选择4. 特征选择5. 完整代码 本文参考:《精通机器学习:基于R》5.3节 数据集来自R包(MASS),包含了532位女性的信息,存储在两个数据框中,具体变量表述如下: npreg:怀孕次数 glu:血糖浓度, 由口服葡萄糖耐量测试给出 bp:舒张压 skin:三头肌皮褶厚度 bmi:身体质量指数 ped:糖尿病家族影响因素 age:年龄 type:是否患有糖尿病(y
e1071提供了对libsvm的接口。库libsvm包括了常用的核,如线性,多项式,RBF,sigmoid等。多分类通过一对一的投票机制(one-against-one voting scheme)而实现。predict()是训练函数,plot()可视化数据,支持向量,决策边界(如果提供的话)。参数调整tune()。 > library("e1071")
基本操作常用函数及包预测函数:predict() type=”prob”判别该量度的昆虫归类为A、B和C的概率;type=”response”:判别该量度的昆虫的类别; 预测分类的概率的函数predict(…, type)参数type: R语音里面不同模型,参数type取值也不同。例如,可能取值有prob、posterior、raw(朴素贝叶斯)、probability(请参考使用包的帮助文
这段代码是使用OpenCV中的机器学习模块(ml模块)创建了一个支持向量机(SVM)分类器对象。具体来说,代码中使用了SVM::create()函数创建了一个cv::Ptr<cv::ml::SVM>类型的指针对象SVM_params,该指针指向了一个默认参数设置的SVM分类器对象。 我们可以通过SVM_params对象对SVM分类器的参数进行设置,例如设置SVM的核函数类型、核函数参数、惩罚因子等等。设置完成后,我们可以使用该SVM分类器对象进行训练和预测。 需要注意的是,该代码是使用了OpenCV 3.0及以上版本中的ml模块。如果你使用的是OpenCV 2.x版本,则需要使用不同的函数来创建SVM分类器对象。