SVM之交叉验证【转】

交叉验证(CrossValidation)方法思想简介

以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进行训练,在利用验证集来测试训练得到的模型(model),以此来做为评价分类器的性能指标.常见CV的方法如下:

1).Hold-Out Method

将原始数据随机分为两组,一组做为训练集,一组做为验证集, 利用训练集训练分类器,然后利用验证集验证模型,记录最后的分类准确率为此Hold-OutMethod下分类器的性能指标.此种方法的好处的处理简单,只需随机把原始数据分为两组即可,其实严格意义来说Hold-Out Method并不能算是CV,因为这种方法没有达到交叉的思想,由于是随机的将原始数据分组,所以最后验证集分类准确率的高低与原始数据的分组有很大的关系,所以这种方法得到的结果其实并不具有说服性.

2).K-fold Cross Validation(记为K-CV)

将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标.K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.K-CV可以有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性.

3).Leave-One-Out Cross Validation(记为LOO-CV)

如果设原始数据有N个样本,那么LOO-CV就是N-CV,即每个样本单独作为验证集,其余的N-1个样本作为训练集,所以LOO-CV会得到N个模型,用这N个模型最终的验证集的分类准确率的平均数作为此下LOO-CV分类器的性能指标.相比于前面的K-CV,LOO-CV有两个明显的优点:

① 
a.每一回合中几乎所有的样本皆用于训练模型,因此最接近原始样本的分布,这样评估所得的结果比较可靠。

② 
b.实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。

但LOO-CV的缺点则是计算成本高,因为需要建立的模型数量与原始数据样本数量相同,当原始数据样本数量相当多时,LOO-CV在实作上便有困难几乎就是不显示,除非每次训练分类器得到模型的速度很快,或是可以用并行化计算减少计算所需的时间

### 使用R语言实现SVM分类及交叉验证 #### 安装必要的包 为了在R中执行支持向量机(SVM)分类以及应用交叉验证,需要安装`e1071`和`caret`这两个软件包。前者提供了SVM的功能接口;后者则简化了模型训练过程中的预处理、参数调整与评估工作。 ```r install.packages("e1071") install.packages("caret") ``` #### 加载库并准备数据集 加载所需的库,并读取或创建用于实验的数据集。这里以经典的鸢尾花(iris)数据为例来展示具体操作方法[^2]。 ```r library(e1071) library(caret) data(iris) set.seed(1234) # 设置随机种子以便重复试验结果 trainIndex <- createDataPartition(y=iris$Species,p=.8,list=F,times=1) trainingSet<-trainIndex, ] ``` #### 构建SVM模型 通过调用`svm()`函数构建基础的支持向量机模型,在此之前可以先定义好核函数类型和其他超参数设置。对于多类别问题,默认采用一对一(one-vs-one)策略解决。 ```r model <- svm(Species ~ . , data = trainingSet,kernel="radial",cost=1,gamma=0.1) summary(model) ``` #### 应用交叉验证优化模型 利用`tune.svm()`来进行网格搜索式的参数寻优,同时内置地完成了K折(K-fold)交叉验证流程。此处设定为10倍折叠方式测试不同组合下的表现情况,从而挑选最优配置方案[^4]。 ```r tunedModel <- tune(svm, Species~., data = trainingSet, kernel='radial', ranges=list(cost=c(.1,.5,1,5,10),gamma=c(.01,.1)), tunecontrol=tune.control(sampling="cross", cross=10)) print(tunedModel) best.model <- tunedModel$best.model summary(best.model) ``` #### 测试最佳模型性能 最后一步是在独立的测试集中检验经过调参后的SVM模型效果如何,计算预测精度等指标衡量其泛化能力。 ```r predictions <- predict(best.model,newdata=testingSet) confusionMatrix(predictions,factor(testingSet$Species)) ``` 上述代码展示了基于R语言环境下完成一次完整的SVM分类器建立到最终部署的过程,期间融入了重要的交叉验证环节确保所得结论具有较高的可靠性[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值