R语言中的k折交叉验证是怎样的

这篇文章给大家介绍R语言中的k折交叉验证是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

 机器学习中需要把数据分为训练集和测试集,因此如何划分训练集和测试集就成为影响模型效果的重要因素。本文介绍一种常用的划分最优训练集和测试集的方法——k折交叉验证。

  • k折交叉验证

K折交叉验证(k-fold cross-validation)首先将所有数据分割成K个子样本,不重复的选取其中一个子样本作为测试集,其他K-1个样本用来训练。共重复K次,平均K次的结果或者使用其它指标,最终得到一个单一估测。

这个方法的优势在于,保证每个子样本都参与训练且都被测试,降低泛化误差。其中,10折交叉验证是最常用的。

  • 实例代码

在线性分类器与性能评价(R语言)中,我们将数据集随机抽取70%作为训练集,剩下30%作为测试集,通过线性回归的方法进行预测,通过ROC和AUC评价模型效果。现在,我们使用k折交叉验证的方法,选取最优的训练集和测试集,建立线性分类器并评价模型效果。

1、数据导入并分组。导入数据,并使用caret包中的createFolds()函数,根据标签列将数据分成10份 。

target.url <- 'https://archive.ics.uci.edu/ml/machine-learning-databases/undocumented/connectionist-bench/sonar/sonar.all-data'

data <- read.csv(target.url,header = F) 

set.seed(17)  

require(caret)  

folds <- createFolds(y=data[,61],k=10)

2、选取最优训练集与测试集。构建for循环,得到十次交叉验证预测的AUC值。并纪录取值最大的一组,作为最优的训练集与测试集划分。

library(pROC)

max=0  

num=0 

auc_value<-as.numeric()

for(i in 1:10){  

  fold_test <- data[folds[[i]],]   #取folds[[i]]作为测试集  

  fold_train <- data[-folds[[i]],]   # 剩下的数据作为训练集    

  fold_pre <- lm(as.numeric(V61)~.,data=fold_train)  

  fold_predict <- predict(fold_pre,type='response',newdata=fold_test)  

  auc_value<- append(auc_value,as.numeric(auc(as.numeric(fold_test[,61]),fold_predict)))

}  

num<-which.max(auc_value)

print(auc_value)

10次auc取值结果如下:

 [1] 0.7636364 0.7474747 0.8484848 0.9363636 0.7272727 0.8454545 0.9181818 0.7454545 0.7979798

[10] 0.7916667

3、构建分类器并判断模型效果。根据前一步的结果,使用最优划分构建线性分类器并预测。绘制出测试集的ROC曲线。

fold_test <- data[folds[[num]],]   

fold_train <- data[-folds[[num]],]

fold_pre <- lm(as.numeric(V61)~.,data=fold_train)  

fold_predict <- predict(fold_pre,type='response',newdata=fold_test)

roc_curve <- roc(as.numeric(fold_test[,61]),fold_predict)

plot(roc_curve, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),

     grid.col=c("green", "red"), max.auc.polygon=TRUE,

     auc.polygon.col="skyblue", print.thres=TRUE,main="ROC curve for the set with the largest AUC value")

R语言中的k折交叉验证是怎样的

线性分类器与性能评价(R语言)中随机选取训练集和测试集,最终测试集的AUC值仅为0.755,而本次我们通过k折交叉验证选取训练集和测试集,测试集AUC值达到0.936,可以看出模型效果提升显著。

关于R语言中的k折交叉验证是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/opensource/208369.html

(0)
上一篇 2021年12月7日 10:16
下一篇 2021年12月7日 10:16

相关推荐

发表回复

登录后才能评论