R 支持向量机①

机器学习

  • R语言有很多包可以做机器学习(Machine Learning)的任务。机器学习的任务主要有有监督的学习方式和无监督的学习方式。
  • 有监督学习:在正确结果指导下的学习方式,若是正确结果是定性的,属于分类问题;若正确结果是定量的,属于回归问题。
  • 无监督学习:在没有正确结果指导下的学习方式,例如:聚类分析、降维处理等

支持向量机

  • 支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析。支持向量机属于一般化线性分类器,这族分类器的特点是他们能够同时最小化经验误差与最大化几何边缘区,因此支持向量机也被称为最大边缘区分类器。

  • 支持向量机将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化。假定平行超平面间的距离或差距越大,分类器的总误差越小。

  • 假设给定一些分属于两类的2维点,这些点可以通过直线分割, 我们要找到一条最优的分割线,如何来界定一个超平面是不是最优的呢?


    R 支持向量机①
    image

R包

  • R的函数包e1071提供了libsvm的接口。使用e1071包中svm函数可以得到与libsvm相同的结果。write.svm()更是可以把R训练得到的结果写为标准的Libsvm格式,以供其他环境下libsvm的使用。下面我们来看看svm()函数的用法。有两种格式都可以。
svm(formula,data=NULL,…,subset,na.action=na.omit,sacle=TRUE)

或者

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,

class.weights = NULL, cachesize = 40, tolerance =0.001, epsilon = 0.1,

shrinking = TRUE, cross = 0, probability = FALSE,fitted = TRUE,

..., subset, na.action = na.omit)

参数详解

主要参数说明如下:

  • subset:可以指定数据集的一部分作为训练数据。
  • na.cation:缺失值处理,默认为删除缺失数据。
  • scale:将数据标准化,中心化,使其均值为0,方差为1,将自动执行。
  • type:svm的形式。为:C-classification ,nu-classification,one-classification(for novelty detection) ,eps-regression, nu-regression 五种形式。后面两者为做回归时用到。默认为C分类器。
  • kernel:在非线性可分时,我们引入核函数来做。默认为高斯核。顺带说一下,在kernel包中可以自定义核函数。
  • degree:多项式核的次数,默认为3
  • gamma:除去线性核外,其他核的参数,默认为1/数据维数
  • coef0:多项式核与sigmoid核的参数,默认为0.
  • cost:C分类中惩罚项c的取值
  • nu:Nu分类,单一分类中nu的值
  • cross:做k折交叉验证,计算分类正确性。
  • 代码
> if(!suppressWarnings(require(e1071)))
+ {
+   install.packages('e1071')
+   require(e1071)
+ }
> setwd("E:\\Rwork")
> data(iris)
> 
> ir<-iris
> 
> set.seed(123)
> 
> index <- sample(nrow(ir),0.75*nrow(ir))
> data_train <- ir[index,]
> data_test <- ir[-index,]
> sv<-svm(Species~.,data=data_train,cross=5,type='C-classification',kernel='sigmoid')
> 
> summary(sv)  #查看支持向量机sv的具体信息,发现做5倍交叉验证的正确率为92%

Call:
svm(formula = Species ~ ., data = data_train, cross = 5, type = "C-classification", kernel = "sigmoid")


Parameters:
   SVM-Type:  C-classification 
 SVM-Kernel:  sigmoid 
       cost:  1 
      gamma:  0.25 
     coef.0:  0 

Number of Support Vectors:  47

 ( 6 19 22 )


Number of Classes:  3 

Levels: 
 setosa versicolor virginica

5-fold cross-validation on training data:

Total Accuracy: 88.39286 
Single Accuracies:
 81.81818 95.45455 91.30435 86.36364 86.95652 



> 
> 
> pre<-predict(sv,data_test)#对测试样本作预测。pre是一个类别向量。
> 
> dim(data_test[data_test$Species!=pre,])[1]/dim(data_test)[1]#计算错误率
[1] 0.1315789


> table(pre,data_test$Species)
            
pre          setosa versicolor virginica
  setosa         11          0         0
  versicolor      0         10         2
  virginica       0          3        12


plot(sv, iris, Petal.Width ~
+        
+        Petal.Length, slice = list(Sepal.Width = 3,
+                                   
+                                   Sepal.Length = 4))
R 支持向量机①
上一篇:癌症免疫系列(6)


下一篇:python logistic回归