支持向量机(Support Vector Machine,SVM)是Cortes和Vapnik于1995年首先提出的,它在解决小样本、非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数拟合等其他机器学习问题中。支持向量机方法是建立在统计学习理论的VC维理论和结构风险最小原理基础上的,根据有限的样本信息在模型的复杂性(即对特定训练样本的学习精度,Accuracy)和学习能力(即无错误地识别任意样本的能力)之间寻求最佳折衷,以期获得最好的推广能力。目前使用广泛的SVM实现工具是libsvm,其不仅集成在很多统计软件例如R,PYTHON等,还可以直接在Linux以及Windows下运行。
官网:https://www.csie.ntu.edu.tw/~cjlin/libsvm/
今天我们介绍一下在R语言中SVM的实现以及参数的优化。
1.首先安装SVM的R包e1071,同时安装数据的R包mlbench
2.载入R包,并载入相关的测试数据。
3.我们看下我们主要用到的几个函数以及相关的参数
a.svm()模型构建函数
此函数主要是构建SVM模型,其中主要的参数:
formaula设置所要训练的属性值以及结果例如Type ~ .:代表Type是结果并选取所有的属性值。
type可取的值有C-classification、nu-classification、one-classification、eps-regression和nu-regression这五种类型中。其中,前三种是针对于字符型结果变量的分类方式,其中第三种方式是逻辑判别,即判别结果输出所需判别的样本是否属于该类别;而后两种则是针对数值型结果变量的分类方式。
degree是仅用于多项式核函数中的参数,代表多项式核函数的次数,在本例中,经过实践发现degree为奇数时,degree越大模型表现越好,为偶数时,degree越大,模型越差,当degree足够大时,模型准确率趋于稳定。另外,当degree高于15时,R出现警告信息,而且当样本数据量较大时,设置过高的degree将非常危险。
cost是惩罚因子,可与任意核函数搭配,在本例中,分别取了1 2 3 4,发现cost越大越好。此外,cost与degree通常配合使用,在研究他们时,使用交叉验证法会得到更精确的结果。
gamma是选择径向基核函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
Kernel指的是支持向量机的类型,实质上是一种映射函数,将低维空间非线性问题映射到高维空间编程线性问题进行处理。它可能是线性SVM(linear)、多项式SVM (polynomial)、径向SVM (radial)或Sigmoid SVM (sigmoid)。默认是径向SVM。其中性能最好是径向基核函数,其次是多项式核函数,最差的是神经网络核函数。
模型构建好后,可以通过summary函数获取模型的详细信息。
b.predict()模型预测函数.
c.table()函数,获取预测结果的频数。
主要参数pred和true也就是同一个数据的两列值,进行合并并统计出对应的因子的频数
通过table函数我们可以得到预测的真实结果的分布。如果觉得这样展示形式不友好,还可以变换:
d.plot()绘制SVM的可视化展示
此函数主要是绘制散点图可视化分类情况。
样例程序
library(e1071)
data(Glass,package="mlbench")
index
testindex
testset
trainset
svm.model
svm.pred
4.参数优化
a.tune.svm()寻求最优模型
此函数可以进行模型的优化,并获取相关的参数值。
b.自定义编程实现参数优化
a
for(i in 1:10){
for(j in 1:10){
for(k in 1:10){
svm.fit
svm.pre0,1,0)
n
result
a
}}}
a[which(a[,4]==max(a[,4])),]
总结,我们所涉及的是多分类问题。那么准确率,召回率以及F1-measure的计算公式如下图:
准确率和召回率是互相影响的,理想情况下肯定是做到两者都高,但是一般情况下准确率高、召回率就低,召回率低、准确率高,当然如果两者都低,那是什么地方出问题了。
欢迎大家学习交流:
领取专属 10元无门槛券
私享最新 技术干货