利用R语言实现支持向量机(SVM)数据挖掘案例

创建模型网络

svm()函数在创建支持向量机模型的时候有两种创建方式。简单地说,一种是根据既定公式创建模型;而另一种方式则是根据所给的数据模型创建模型。ide

根据函数的第一种使用格式,针对上述数据建模时,应该先肯定所创建的模型所使用的数据,而后再肯定所创建模型的结果变量和特征变来那个。代码以下:函数

library(e1071)优化

data(iris)ci

#创建svm模型cmd

model <- svm(Species~.,data = iris)数据分析

在使用第一种格式创建模型时,若是使用数据中的所有特征变量做为模型特征变量时,能够简要地使用“Species~.”中的“.”代替所有的特征变量。it

根据函数的第二种使用格式,在针对iris数据创建模型时,首先应该将结果变量和特征变量分别提取出来。结果变量用一个向量表示,而特征向量用一个矩阵表示。在肯定好数据后还应根据数据分析所使用的核函数以及核函数所对应的参数值,一般默认使用高斯内积函数做为核函数,具体分析代码以下:数据挖掘

#提取iris数据中除第5列之外的数据做为特征变量io

x <- iris[,-5]

#提取iris数据中第5列数据做为结果变量

y <- iris[,5]

#创建svm模型

model <- svm(x,y,kernel = "radial", gamma = if(is.vector(x)) 1 else 1/ncol(x))

在使用第二种格式创建模型时,不须要特别强调所创建模型的哪一个是,函数会自动将全部输入的特征变量数据做为创建模型所须要的特征变来那个。

在上述过程当中,肯定核函数的gamma系数时所使用的R语言所表明的意思为:若是特征向量是向量则gamma值取1,不然gamma值为特征向量个数的倒数。

结果分析

summary(model)

Call:

svm.default(x = x, y = y, kernel = "radial", gamma = if (is.vector(x)) 1 else 1/ncol(x))

Parameters:

SVM-Type: C-classification

SVM-Kernel: radial

cost: 1

gamma: 0.25

Number of Support Vectors: 51

( 8 22 21 )

Number of Classes: 3

Levels:

setosa versicolor virginica

经过summary()函数能够获得关于模型的相关信息。其中,SVM-Type项目说明本模型的诶别为C分类器模型;SVM-Kernel项目说明本模型所使用的核函数为高斯内积函数且核函数中参数gamma的取值为0.25;cost项目说明本模型肯定的约束违反成本为1。

在输出结果中,咱们还能够看到,对于该数据,模型找到了51个支持变量;第一类具备8个支持向量,第二类具备22个支持向量,第三类具备21个支持向量。最后说明了模型中的三个类别为:setosa、versicolor和virginica。

预测判别

一般咱们利用样本数据创建模型以后,主要目的都是利用模型来进行相应的预测和判别。在利用svm()函数创建的模型进行预测时,咱们将用到predict()函数对模型进行预测。在实用predict()函数时,应该首先确认将用于预测的样本数据,并将样本数据的特征变量整合放入同一个矩阵,代码以下:

#确认须要继续预测的样本特征矩阵

x <- iris[,1:4]

#根据模型model对x数据进行预测

pred <- predict(model, x)

#随机挑选8个预测结果进行展现

print(pred[sample(1:150, 8)])

1 131 133 41 79 49 47 93

setosa virginica virginica setosa versicolor setosa setosa versicolor

Levels: setosa versicolor virginica

在进行数据预测时,主要注意的问题就是必须保证用于预测的特征向量的个数应同模型创建时使用的特征向量个数一致,不然将没法预测结果。在使用predict()函数进行预测时,不用刻意去调整预测结果类型。

经过对预测结果的展现,咱们能够看到predict()函数在预测时自动识别预测结果的类型,并自动生成了相应的类别名称。一般在进行预测以后,还须要检查模型预测的精度,这便须要用到table()函数对预测结果和真实结果作出对比展现。代码以下:

#模型预测精度展现

table(pred, y)

y

pred setosa versicolor virginica

setosa 50 0 0

versicolor 0 48 2

virginica 0 2 48

经过观察table()函数对模型预测精度的展现结果,咱们能够看到在模型预测时,模型将全部属于setosa类型的花所有预测正确;模型将属于versicolor类型的花中的48朵预测正确,但将另外良多预测为virginica类型;同理,模型将属于virginica类型的花中的48朵预测正确,但也将另外良多预测为versicolor类型。

综合建模

经过以前对支持向量机理论及支持向量机模型具体应用的介绍,现基于iris数据集 ,综合介绍利用R语言创建模型的完整过程。

分析数据能够看出,数据须要判别的是三个类别,且三个类别属于字符类型,因此咱们能够选择的支持向量机分类机就有三类:C-classification、nu-classification、one-classification。同时,能够选择的核函数有四类:线性核函数(linear)、多项式核函数(polynomial)、径向基核函数(radial basis,RBF)和神经网络核函数(sigmoid)。因此在时间和精力容许的状况下,应该尽量创建全部可能的模型,最后经过比较选出判别结果最优的模型。根据上述分析,利用R语言实现的具体程序代码以下:

library(e1071)

#将数据集iris按列单独确认为向量

attach(iris)

#肯定特征变量为数据集iris中除去Species中的其余项

x <- subset(iris, select = -Species)

#肯定结果变量为数据集iris中的Species项

y <- Species

#肯定将要使用的分类方式

type <- c("C-classification","nu-classification","one-classification")

#肯定将要使用的核函数

kernel <- c("linear","polynomial","radial","sigmoid")

#初始化预测结果矩阵的三维长度分别为150,3,4

pred <- array(0,dim = c(150,3,4))

#初始化模型精准度矩阵的二维分别为3,4

accuracy <- matrix(0,3,4)

#为方便模型精度计算,将结果变量数量化为1,2,3

yy <- as.integer(y)

#确认i影响的维度表明分类方式

for(i in 1:3){

  • #确认j影响的维度表明核函数

  • for(j in 1:4){

  • #对每一模型进行预测

  • pred[,i,j] <- predict(svm(x,y.type=type[i],kernel=kernel[j]),x)

  • if (i>2) {

  • accuracy[i,j] <- sum(pred[,i,j]!=1)

  • } else {

  • accuracy[i,j] <- sum(pred[,i,j]!=yy)

  • }

  • }

  • }

#肯定模型精度变量的列名和行名

dimnames(accuracy)=list(type,kernel)

在运行程序中,if语句的使用是由于C-classification和nu-classification与one-classification的模型预测精度精算方式不一样,因此应该分别进行计算。在运行程序以后,能够获得全部12个模型所对应的预测精度。程序中accuracy所表明的是模型预测错误的个数。

咱们将根据这个预测结果挑选出预测错误最少的一些 模型,而后再根据实际状况进行详细分析,最终决定得出最适合本次研究目的的模型。

相应的预测结果以下:

R语言数据挖掘实践——支持向量机代码实战

从表中的模型预测结果能够看出,利用one-classification方式不管采起何种核函数得出的结果错误都很是多,因此能够看出该方式不适合这类数据类型的判别。使用one-classification方式进行建模时,数据一般状况下为一个类别的特征,创建的模型主要用于判别其余样本是否属于这类。

利用C-classification与高斯核函数结合的模型判别错误最少,若是咱们创建模型的目的主要是为了整体误判率最低,而且各类类型判错的代价是相同的,那么就能够直接选择这个模型做为最有模型。那么将利用C-classification与高斯核函数介个的模型的预测结果示例代码以下:

table(pred, y)

y

pred setosa versicolor virginica

setosa 50 0 0

versicolor 0 48 2

virginica 0 2 48

在获得这个较优模型以后,咱们将针对这一模型在进行具体的分析和讨论,力图进一步提升模型的预测精度。

可视化分析

在创建支持向量机模型以后,咱们来进一步分析模型。在分析过程当中将会使用模型可视化以便于对模型的分析。在对模型进行可视化的过程当中,咱们使用plot()函数对模型进行可视化绘制,代码以下:

plot(cmdscale(dist(iris[,-5])),

  • col=c("lightgray","black","gray")[as.integer(iris[,5])],

  • pch=c("o","+")[1:150 %in% model$index + 1])

legend(2,-0.8,c("setosa","versicolor","virginica"),col = c("lightgray","black","gray"),lty=1)

R语言数据挖掘实践——支持向量机代码实战

经过plot()函数对所创建的支持向量机模型进行可视化以后,所获得的图像是对模型数据类别的一个整体观察。图中"+"表示的是支持向量,“0”表示的是普通样本点。

从图中咱们能够看到,鸢尾属中的第一种setosa类别同其余两种区别较大,而剩下的versicolor和virginica类别却相差很小,甚至存在交叉难以区分。这也在另外一个角度解释了在模型预测过程当中出现的问题,这正是为何模型将两朵versicolor类别的话预测成了virginica类别,并将两朵virginica类别的花预测成了versicolor类别的缘由。

在使用plot()函数对所创建的模型进行了整体的观察后,咱们还能够利用plot()函数对模型进行其余角度的可视化分析。咱们能够利用plot()函数对模型类别关于模型中任意两个特征向量的变更过程进行绘图。绘图过程以下:

data(iris)

model <- svm(Species~., data = iris)

plot(model, iris, Petal.Width~Petal.Length,fill = FALSE,

  • symbolPalette = c("lightgray","black","grey"),svSymbol = "+")

legend(1,2.5,c("setosa","versicolor","virginica"),col = c("lightgray","black","gray"),lty=1)

R语言数据挖掘实践——支持向量机代码实战

经过对模型关于花瓣的宽度和长度对模型类别分类影响的可视化后,咱们仍然能够获得一致的结果:setosa类别的花瓣同另外两个类别相差较大,而versicolor类别的花瓣同virginica类别的花瓣相差较小。

经过模型可视化能够看出,virginica类别的花瓣在长度和宽度的整体水平上都高于其余两个类别,而versicolor类别的花瓣在长度和宽度的整体水平上处于居中的位置,而setosa类别的花瓣在长度和宽度上都比另外两个类别小。

优化模型

在模型预测精度结果中咱们发现,尽管模型的预测错误已经不多,可是所创建的模型仍是出现了4个预测错误,那么为了寻找到一个最优的支持向量机模型,咱们是否能经过一些方式来进一步提升模型的预测精度,最理想的状况就是将模型的预测错误率减小为零。

经过对模型的可视化分析后,不管是从整体的整体的角度观察,仍是从模型个别特征的角度观察,咱们均可以获得一致的结论:类别setosa同其余两个类别的差别较大,而类别versicolor和类别virginica的差别很是小,并且直观上能看到两部分出现少量交叉,而且在预测结果中,模型出现判别错误的地方也是混淆了累呗versicolor和类别virginica。

所以,针对这种状况,咱们能够向导经过改变模型各个类别的比重来对数据进行调整。因为类别setosa同其余两个类别相差很大,因此咱们能够考虑下降类别setosa在模型中的额比重,而提升另外两个类别的比重,即适当牺牲类别setosa的精度来提升其余两个类别的精度。这种方法在R语言中能够经过svm()函数中的class.weights参数来进行调整。特别强调的是,class.weights参数所须要的数据必须为向量,而且具备列名,具体过程以下:

#肯定模型各个类别的比重为1:1:1

wts <- c(1,1,1)

#肯定各个比重对应的类别

names(wts) <- c("setosa","versicolor","virginica")

#创建模型

model1 <- svm(x,y,class.weights = wts)

当模型的各个类别的比重为1:1:1时,则模型就是最原始的模型,预测结果即以前的预测模型。接下来咱们适当提升类别versicolor和类别virginica的比重,以观察对模型的预测精度是否产生影响,是否为正向影响。

首先,咱们先将这两种类别的比重扩大100倍(具体倍数可根据自行调整修改):

wts <- c(1,100,100)

names(wts) <- c("setosa","versicolor","virginica")

model2 <- svm(x,y,class.weights = wts)

pred2 <- predict(model2,x)

table(pred2,y)

y

pred2 setosa versicolor virginica

setosa 50 0 0

versicolor 0 49 1

virginica 0 1 49

经过预测结果的展现发现,经过提升类别versicolor和virginica的比重却能能对模型的预测精度产生影响,而且能产生正向影响。因此咱们能够继续经过改变权重的方法来视图提升模型的预测精度。

接下来,咱们将这两个类别的权重在扩大5倍,即相对于原始数据,这两个类别的权重总共扩大了500倍:

wts <- c(1,500,500)

names(wts) <- c("setosa","versicolor","virginica")

model3 <- svm(x,y,class.weights = wts)

pred3 <- predict(model3,x)

table(pred3,y)

y

pred3 setosa versicolor virginica

setosa 50 0 0

versicolor 0 50 0

virginica 0 0 50

经过对权重的调整以后,咱们创建的支持向量机模型可以将全部样本所有预测正确。因此在实际构建模型的过程当中,在必要的时候能够经过改变各样本之间的权重比例来提升模型的预测精度。

相关文章
相关标签/搜索