数值预测:
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 #交叉验证的误分率。