R语言支持向量机实例

数值预测:
1、读入数据

> library(ggplot2)
> library(dplyr)
> data(diamonds)
> diamonds.data<-select(diamonds,carat:clarity,price)
> summary(diamonds.data)
     carat               cut        color        clarity          price      
 Min.   :0.2000   Fair     : 1610   D: 6775   SI1    :13065   Min.   :  326  
 1st Qu.:0.4000   Good     : 4906   E: 9797   VS2    :12258   1st Qu.:  950  
 Median :0.7000   Very Good:12082   F: 9542   SI2    : 9194   Median : 2401  
 Mean   :0.7979   Premium  :13791   G:11292   VS1    : 8171   Mean   : 3933  
 3rd Qu.:1.0400   Ideal    :21551   H: 8304   VVS2   : 5066   3rd Qu.: 5324  
 Max.   :5.0100                     I: 5422   VVS1   : 3655   Max.   :18823  
                                    J: 2808   (Other): 2531                  
> dim(diamonds.data)
[1] 53940     5

2、随机划分数据

> set.seed(1234) #为了每次都获得相同的结果
> samp2<-sample(53940,40000)
> diamonds.train<-diamonds.data[samp2,]  #训练数据
> diamonds.test<-diamonds.data[-samp2,]  #测试数据,注意格式

3、分析预测 – ksvm()函数

> install.packages('kernlab') #安装kernlab程序包
> library(kernlab)
> diamonds.svm<- ksvm(price~., data=diamonds.train) #训练
> class(diamonds.svm)
[1] "ksvm"
attr(,"package")
[1] "kernlab"

> (diamonds.svm<- ksvm(price~., data=diamonds.train)) #加括号,可以直接出结果。
Support Vector Machine object of class "ksvm" 

SV type: eps-svr  (regression)  #支持向机量类型eps-svr用于数值预测,另外还有nu-svr
 parameter : epsilon = 0.1  cost C = 1 

Gaussian Radial Basis kernel function. 
 Hyperparameter : sigma =  0.172220640844366 

Number of Support Vectors : 9073 

Objective Function Value : -1278.04 
Training error : 0.020335 

> diamonds.pre<-predict(diamonds.svm,select(diamonds.test,-price)) #predict()函数对测试数据进行预测,注意函数的参数使用。

计算相关系数,评估预测的精准度。

> cor(data.frame(diamonds.test$price,diamonds.pre))	
                    diamonds.test.price diamonds.pre
diamonds.test.price           1.0000000    0.9891593
diamonds.pre                  0.9891593    1.0000000

计算均方误差(MSE),小的可以认为是好的模型。

> diamonds.model<-data.frame(y=diamonds.test$price,yhat=diamonds.pre)
> mean((diamonds.model$y-diamonds.model$yhat)^2)
[1] 349364.9

类别预测:
1、读入数据及类型转化

> spam<-read.csv('spambase.data',header=F)
> colnames(spam)<-read.table('spambase.names',skip=33,sep=':',comment.char='')[,1]
> colnames(spam)[ncol(spam)]<-'spam'
> class(spam$spam)
[1] "integer"
> spam$spam<-as.factor(spam$spam) #转化为因子型
> class(spam$spam)
[1] "factor"
> dim(spam)
[1] 4601   58

2、数据划分

> set.seed(1234)
> samp<-sample(4601,2500) 
> spam.train<-spam[samp,] #训练集
> spam.test<-spam[-samp,] #测试集

3、ksvm()函数分析

> library(kernlab)
> spam.svm1<-ksvm(spam~.,data=spam.train) #训练数据
> spam.svm1
Support Vector Machine object of class "ksvm" 

SV type: C-svc  (classification)  #支持向机量类型 C-svc,用于分类预测
 parameter : cost C = 1 

Gaussian Radial Basis kernel function. 
 Hyperparameter : sigma =  0.0291709274636615 

Number of Support Vectors : 876 

Objective Function Value : -467.6213 
Training error : 0.0428 

ksvm()函数的完整形式为,

> ksvm(spam~.,data=spam.train,kernel='rbfdot',kpar=list(sigma=0.01)) #kernel参数指定核函数,参数σ也可选用以提高预测精度
Support Vector Machine object of class "ksvm" 

SV type: C-svc  (classification) 
 parameter : cost C = 1 

Gaussian Radial Basis kernel function. 
 Hyperparameter : sigma =  0.01 

Number of Support Vectors : 733 

Objective Function Value : -527.1641 
Training error : 0.0588 

对测试数据做类别预测:

> spam.test.pre<-predict(spam.svm1,select(spam.test,-spam)) #预测测试集数据,注意函数格式

计算错误率:

> (spam.test.svmt<-table(data.frame(select(spam.test,spam),spam.test.pre)) ) #生成列联表
    spam.test.pre
spam    0    1
   0 1208   53
   1  104  736
   
   > 1-sum(diag(spam.test.svmt)/sum(spam.test.svmt)) #错误率计算公式
[1] 0.07472632

同样可以对训练数据做预测来验证预测精度。此处省略代码,结果接近测试数据集的预测错误率。

交叉验证法(Cross Validation)
由于是随机分割训练数据和测试数据,导致预测精度会有高低不等。
kvsm()函数中有交叉验证法(Cross Validation)。k折交叉验证公式如下,

> spam.cv<- ksvm(spam~.,data=spam,kernel='rbfdot',kpar=list(sigma=0.05),C=5,cross=10) #注意函参数使用

结果如下,与上述随机分组结果接近。
Support Vector Machine object of class “ksvm”

SV type: C-svc (classification)
parameter : cost C = 5

Gaussian Radial Basis kernel function.
Hyperparameter : sigma = 0.05

Number of Support Vectors : 1547

Objective Function Value : -2082.468
Training error : 0.022169
Cross validation error : 0.070415 #交叉验证的误分率。

你可能感兴趣的:(R语言,数据分析及挖掘)