专栏首页智能算法SVM的R语言实战

SVM的R语言实战

在R中,可以使用e1071软件包所提供的各种函数来完成基于支持向量机的数据分析与挖掘任务。请在使用相关函数之前,安装并正确引用e1071包。该包中最重要的一个函数就是用来建立支持向量机模型的svm()函数。我们将结合后面的例子来演示它的用法。

下面的实战事例依然选用经典的鸢尾花数据(分别标记为setosa、versicolor和virginica)的花萼和花瓣数据。包括花萼的长度和宽度,以及花瓣的长度和宽度。我们将根据这四个特征来建立支持向量机模型从而实现对三种鸢尾花的分类判别任务。 有关数据可以从datasets软件包中的iris数据集里获取,下面我们演示性地列出了前5行数据。成功载入数据后,易见其中共包含了150个样本(被标记为setosa、versicolor和virginica的样本各50个),以及四个样本特征,分别是Sepal.Length、Sepal.Width、Petal.Length和Petal.Width。

在正式建模之前,我们也可以通过一个图型来初步判定一下数据的分布情况,为此在R中使用如下代码来绘制(仅选择Petal.Length和Petal.Width这两个特征时)数据的划分情况。

[plain] view plaincopy

1. > library(lattice)

2. > xyplot(Petal.Length ~ Petal.Width, data = iris, groups = Species,

3. + auto.key=list(corner=c(1,0)))

上述代码的执行结果如图1所示,从中不难发现,标记为setosa的鸢尾花可以很容易地被划分出来。但仅使用Petal.Length和Petal.Width这两个特征时,versicolor和virginica之间尚不是线性可分的。

图1 选用花瓣的长度和宽度特征对数据做分类的结果

函数svm()在建立支持向量机分类模型时有两种方式。第一种是根据既定公式建立模型,此时的函数使用格式为

[plain] view plaincopy

1. svm(formula, data= NULL, subset, na.action = na.omit , scale= TRUE)

其中,formula代表的是函数模型的形式,data代表的是在模型中包含的有变量的一组可选格式数据。参数na.action用于指定当样本数据中存在无效的空数据时系统应该进行的处理。默认值na.omit表明程序会忽略那些数据缺失的样本。另外一个可选的赋值是na.fail,它指示系统在遇到空数据时给出一条错误信息。参数scale为一个逻辑向量,指定特征数据是否需要标准化(默认标准化为均值0,方差1)。索引向量subset用于指定那些将被来训练模型的采样数据。 例如,我们已经知道,仅使用Petal.Length和Petal.Width这两个特征时标记为setosa和的鸢尾花versicolor是线性可分的,所以可以用下面的代码来构建SVM模型。

然后我们可以使用下面的代码来对模型进行图形化展示,其执行结果如图2所示。

[plain] view plaincopy

1. > plot(model1, subdata, Petal.Length ~ Petal.Width)

图2 SVM分类结果

在使用第一种格式建立模型时,若使用数据中的全部特征变量作为模型特征变量时,可以简要地使用“Species~.”中的“.”代替全部的特征变量。例如下面的代码就利用了全部四种特征来对三种鸢尾花进行分类。

[plain] view plaincopy

1. > model2 <- svm(Species ~ ., data = iris)

若要显示模型的构建情况,使用summary()函数是一个不错的选择。来看下面这段示例代码及其输出结果。

通过summary函数可以得到关于模型的相关信息。其中,SVM-Type项目说明本模型的类别为C分类器模型;SVM-Kernel项目说明本模型所使用的核函数为高斯内积函数且核函数中参数gamma的取值为0.25;cost项目说明本模型确定的约束违反成本为l。而且我们还可以看到,模型找到了51个支持向量:第一类包含有8个支持向量,第二类包含有22个支持向量,第三类包含21个支持向量。最后一行说明模型中的三个类别分别为setosa、versicolor和virginica。

第二种使用svm()函数的方式则是根据所给的数据建立模型。这种方式形式要复杂一些,但是它允许我们以一种更加灵活的方式来构建模型。它的函数使用格式如下(注意我们仅列出了其中的主要参数)。

[plain] view plaincopy

1. svm(x, y = NULL, scale = TRUE, type = NULL, kernel = "radial",

2. degree = 3, gamma = if (is.vector(x)) 1 else 1 / ncol(x),

3. coef0 = 0, cost = 1, nu = 0.5, subset, na.action = na.omit)

此处,x可以是一个数据矩阵,也可以是一个数据向量,同时也可以是一个稀疏矩阵。y是对于x数据的结果标签,它既可以是字符向量也可以为数值向量。x和y共同指定了将要用来建模的训练数据以及模型的基本形式。 参数type用于指定建立模型的类别。支持向量机模型通常可以用作分类模型、回归模型或者异常检测模型。根据用途的差异,在svm()函数中的type可取的值有C-classification、nu-classification、one-classification、eps-regression和nu-regression这五种类型中。其中,前三种是针对于字符型结果变量的分类方式,其中第三种方式是逻辑判别,即判别结果输出所需判别的样本是否属于该类别;而后两种则是针对数值型结果变量的分类方式。 此外,kernel是指在模型建立过程中使用的核函数。针对线性不可分的问题,为了提高模型预测精度,通常会使用核函数对原始特征进行变换,提高原始特征维度,解决支持向量机模型线性不可分问题。svm()函数中的kernel参数有四个可选核函数,分别为线性核函数、多项式核函数、高斯核函数及神经网络核函数。其中,高斯核函数与多项式核函数被认为是性能最好、也最常用的核函数。

核函数有两种主要类型:局部性核函数和全局性核函数,高斯核函数是一个典型的局部性核函数,而多项式核函数则是一个典型的全局性核函数。局部性核函数仅仅在测试点附近小领域内对数据点有影响,其学习能力强、泛化性能较弱;而全局性核函数则相对来说泛化性能较强、学习能力较弱。 对于选定的核函数,degree参数是指核函数多项式内积函数中的参数,其默认值为3。gamma参数给出了核函数中除线性内积函数以外的所有函数的参数,默认值为l。coef0参数是指核函数中多项式内积函数与sigmoid内积函数中的参数,默认值为0。 另外,参数cost就是软间隔模型中的离群点权重。最后,参数nu是用于nu-regression、nu-classification和one-classification类型中的参数。 一个经验性的结论是,在利用svm()函数建立支持向量机模型时,使用标准化后的数据建立的模型效果更好。 根据函数的第二种使用格式,在针对上述数据建立模型时,首先应该将结果变量和特征变量分别提取出来。结果向量用一个向量表示,特征向量用一个矩阵表示。在确定好数据后还应根据数据分析所使用的核函数以及核函数所对应的参数值,通常默认使用高斯内积函数作为核函数。下面给出一段示例代码

在使用第二种格式建立模型时,不需要特别强调所建立模型的形式,函数会自动将所有输入的特征变量数据作为建立模型所需要的特征向量。在上述过程中,确定核函数的gamma系数时所使用的代码所代表的意思是:如果特征向量是向量则gamma值取l,否则gamma值为特征向量个数的倒数。

在利用样本数据建立模型之后,我们便可以利用模型来进行相应的预测和判别。基于由svm()函数建立的模型来进行预测时,可以选用函数predict()来完成相应工作。在使用该函数时,应该首先确认将要用于预测的样本数据,并将样本数据的特征变量整合后放入同一个矩阵。来看下面这段示例代码。

通常在进行预测之后,还需要检查模型预测的准确情况,这时便需要使用函数table()来对预测结果和真实结果做出对比展示。从上述代码的输出中,可以看到在模型预测时,模型将所有属于setosa类型的鸢尾花全部预测正确;模型将属于versicolor类型的鸢尾花中有48朵预测正确,但将另外两朵错误地预测为virginica类型;同样,模型将属于virginica类型的鸢尾花中的48朵预测正确,但也将另外两朵错误地预测为versicolor类型。

函数predict()中的一个可选参数是decision.values,我们在此也对该参数的使用做简要讨论。默认情况下,该参数的缺省值为FALSE。若将其置为TRUE,那么函数的返回向量中将包含有一个名为“decision.values”的属性,该属性是一个n*c的矩阵。这里,n是被预测的数据量, c是二分类器的决策值。注意,因为我们使用支持向量机对样本数据进行分类,分类结果可能是有k个类别。那么这k个类别中任意两类之间都会有一个二分类器。所以,我们可以推算出总共的二分类器数量是k(k-1)/2。决策值矩阵中的列名就是二分类的标签。来看下面这段示例代码。

由于我们要处理的是一个分类问题。所以分类决策最终是经由一个sign(⋅)函数来完成的。从上面的输出中可以看到,对于样本数据4而言,标签setosa/versicolor对应的值大于0,因此属于setosa类别;标签setosa/virginica对应的值同样大于0,以此判定也属于setosa;在二分类器versicolor/virginica中对应的决策值大于0,判定属于versicolor。所以,最终样本数据4被判定属于setosa。依据同样的罗辑,我们还可以根据决策值的符号来判定样本77和样本78,分别是属于versicolor和virginica类别的。

图3 SVM完整分类可视化图

为了对模型做进一步分析,可以通过可视化手段对模型进行展示,下面给出示例代码。结果如图3所示。可见,通过plot()函数对所建立的支持向量机模型进行可视化后,所得到的图像是对模型数据类别的一个总体观察。图中的“+”表示的是支持向量,圆圈表示的是普通样本点。

[plain] view plaincopy

1. > plot(cmdscale(dist(iris[,-5])),

2. + col = c("orange","blue","green")[as.integer(iris[,5])],

3. + pch = c("o","+")[1:150 %in% model3$index + 1])

4. > legend(1.8, -0.8, c("setosa","versicolor","virgincia"),

5. + col = c("orange","blue","green"), lty = 1)

在图3中我们可以看到,鸢尾花中的第一种setosa类别同其他两种区别较大,而剩下的versicolor类别和virginica类别却相差很小,甚至存在交叉难以区分。注意,这是在使用了全部四种特征之后仍然难以区分的。这也从另一个角度解释了在模型预测过程中出现的问题,所以模型误将2朵versicolor 类别的花预测成了virginica 类别,而将2朵virginica 类别的花错误地预测成了versicolor 类别,也就是很正常现象了。

回复数字或算法名称即可查看相关文章:

1. 决策树算法之一C4.5

2. 数据挖掘之Apriori算法

3. 网页排序算法之PageRank

4. 分类算法之朴素贝叶斯分类

5. 遗传算法如何模拟大自然的进化?

6. 没有公式如何看懂EM算法?

7. Python实现KNN算法

8. 基础聚类算法:K-means算法

9. 集成学习算法----Adaboost

10. 分类回归树算法---CART

11. EAG多目标进化算法

12. 蚁群算法(独辟蹊径的进化算法)

13. 逻辑回归(LR)算法

14. 鸟群的启发--粒子群算法

15. 模拟退火优化算法

16. GBDT算法(简明版)

17. 初识支持向量机

18. SVM的“核”武器

19. GBDT算法(详细版)

20. 基于SURF算法相似图像相对位置的寻找

21. 降维方法(一):PCA原理

22.SVM的R语言实战

参考文献:R语言实战

机器学习实战

免责声明:本文系网络转载。版权归原作者所有。如涉及版权,请联系删除!

本文分享自微信公众号 - 智能算法(AI_Algorithm)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2016-07-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • SVM的R语言实战

    在R中,可以使用e1071软件包所提供的各种函数来完成基于支持向量机的数据分析与挖掘任务。请在使用相关函数之前,安装并正确引用e1071包。该包中最重要的一个函...

    智能算法
  • GBDT(梯度提升决策树)算法(详细版)

    一、前言 通过之前的文章GBDT算法(简明版)对GBDT的过程做了大概的讲解,我们可以了解到GBDT是一种迭代的决策树算法,由多棵决策树组成,所有树的结论累加起...

    智能算法
  • 深度学习漫游指南:强化学习概览

    本文是NVIDIA博客上Tim Dettmers所写的《Deep Learning in a Nutshell》系列文章的第四篇。据介绍,该系列文章的目的是「提...

    智能算法
  • 一文看完《统计学习方法》所有知识点

    红色的是牛顿法的迭代路径,绿色的是梯度下降法的迭代路径.牛顿法起始点不能离极小点太远,否则很可能不会拟合.

    统计学家
  • 超全总结!一文囊括李航《统计学习方法》几乎所有的知识点!

    如果大家对机器学习算法有所涉猎的话,想必你一定看过《统计学习方法》这本书,里面介绍了统计学中的一些基本算法和知识点,本文进行了详细的总结。

    崔庆才
  • 牛客网 机器学习题目

    SVM核函数:线性核函数、多项式核函数、径向基核函数、高斯核函数、幂指数核函数、拉普拉斯核函数、ANOVA核函数、二次有理核函数、多元二次核函数、逆多元二次核函...

  • 《统计学习方法》 ( 李航 ) 读书笔记

    因为要准备面试,本文以李航的《统计学习方法》为主,结合西瓜书等其他资料对机器学习知识做一个整理。

    石晓文
  • 【学术】新的研究旨在解决黑箱算法中AI产生的偏见问题

    从选择股票到检查X光,人工智能正越来越多地被用于帮助人类做决策。但是人工智能只能对它所训练的数据做出好的反应,而且在很多情况下,我们最终会把太过人性化的偏见放到...

    AiTechYun
  • 关于提高机器学习性能的妙招

    这里有可以让你做出更好预测的32个建议、诀窍与技巧。

    人工智能资讯小编
  • 机器学习性能改善备忘单:32个帮你做出更好预测模型的技巧和窍门

    大数据文摘

扫码关注云+社区

领取腾讯云代金券