登录
首页精彩阅读在R中使用支持向量机(SVM)进行数据挖掘(下)
在R中使用支持向量机(SVM)进行数据挖掘(下)
2017-03-18
收藏

在R中使用支持向量机SVM)进行数据挖掘(下)

第二种使用svm()函数的方式则是根据所给的数据建立模型。这种方式形式要复杂一些,但是它允许我们以一种更加灵活的方式来构建模型。它的函数使用格式如下(注意我们仅列出了其中的主要参数)。
[plain] view plain copy
svm(x, y = NULL, scale = TRUE, type = NULL, kernel = "radial",  
degree = 3, gamma = if (is.vector(x)) 1 else 1 / ncol(x),  
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类别的。

为了对模型做进一步分析,可以通过可视化手段对模型进行展示,下面给出示例代码。结果如图14-15所示。可见,通过plot()函数对所建立的支持向量机模型进行可视化后,所得到的图像是对模型数据类别的一个总体观察。图中的“+”表示的是支持向量,圆圈表示的是普通样本点。
[plain] view plain copy
> plot(cmdscale(dist(iris[,-5])),  
+ col = c("orange","blue","green")[as.integer(iris[,5])],  
+ pch = c("o","+")[1:150 %in% model3$index + 1])  
> legend(1.8, -0.8, c("setosa","versicolor","virgincia"),  
+ col = c("orange","blue","green"), lty = 1) 
在图14-15中我们可以看到,鸢尾花中的第一种setosa类别同其他两种区别较大,而剩下的versicolor类别和virginica类别却相差很小,甚至存在交叉难以区分。注意,这是在使用了全部四种特征之后仍然难以区分的。这也从另一个角度解释了在模型预测过程中出现的问题,所以模型误将2朵versicolor 类别的花预测成了virginica 类别,而将2朵virginica 类别的花错误地预测成了versicolor 类别,也就是很正常现象了。

数据分析咨询请扫描二维码

客服在线
立即咨询