一、R中svm介绍
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 =
\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)
主要参数说明如下:
formula:分类模型形式,在第二个表达式中可以理解为y~x 即y相当于标签,x相当于特征(变量) data:数据框。
subset:可以指定数据集的一部分作为训练数据。 na.cation:缺失值处理,默认为删除缺失数据。
scale:将数据标准化,中心化,使其均值为0,方差为1,将自动执行。
type:svm的形式。为:C-classification ,nu-classification, one-classification (for novelty detection) ,eps-regression,
nu-regression 五种形式。后面两者为做回归时用到。默认为C分类器。 kernel:在非线性可分时,我们引入核函数来做。R中提供的核函数如下 线性核:
u'*v 多项式核:
(gamma*u'*v + coef0)^degree
高斯核:
exp(-gamma*|u-v|^2) sigmoid核:
tanh(gamma*u'*v + coef0)
默认为高斯核。顺带说一下,在kernel包中可以自定义核函数。 degree:多项式核的次数,默认为3
gamma:除去线性核外,其他核的参数,默认为1/数据维数 coef0:多项式核与sigmoid核的参数,默认为0. cost:C分类中惩罚项c的取值 nu:Nu分类,单一分类中nu的值 cross:做k折交叉验证,计算分类正确性。
二、一个具体的小例子。
我们依然使用iris数据集来做svm分类。如下 > data(iris) > ir<-iris > set.seed(124)
> count.test<-round(runif(50,1,150)) > test<-ir[count.test,] > library(e1071)
>sv<-svm(Species~.,data=ir,cross=5,type='C-classification',kernel='sigmoid')
> summary(sv) #查看支持向量机sv的具体信息,发现做5倍交叉验
证的正确率为92%
> pre<-predict(sv,test) #对测试样本作预测。pre是一个类别向量。 > dim(test[test$Species!=pre,])[1]/dim(test)[1] #计算错误率 [1] 0.06
我们发现错误率为6%