R语言交叉验证(详细)
发布日期:2021-06-30 22:33:25
浏览次数:2
分类:技术文章
本文共 2370 字,大约阅读时间需要 7 分钟。
k-折交叉验证
k-折交叉验证(K-fold cross-validation)是交叉验证方法里一种。它是指将样本集分为k份,其中k-1份作为训练数据集,而另外的1份作为验证数据集。用验证集来验证所得分类器或者模型的错误率。一般需要循环k次,直到所有k份数据全部被选择一遍为止。
有关交叉验证的介绍可参考作者另一博文:
http://blog.csdn.net/yawei_liu1688/article/details/79138202R语言实现
K折交叉验证,随机分组
数据打折-数据分组自编译函数:进行交叉检验首先要对数据分组,数据分组要符合随机且平均的原则
library(plyr)CVgroup <- function(k,datasize,seed){ cvlist <- list() set.seed(seed) n <- rep(1:k,ceiling(datasize/k))[1:datasize] #将数据分成K份,并生成的完成数据集n temp <- sample(n,datasize) #把n打乱 x <- 1:k dataseq <- 1:datasize cvlist <- lapply(x,function(x) dataseq[temp==x]) #dataseq中随机生成k个随机有序数据列 return(cvlist)}
k <- 10datasize <- nrow(iris)cvlist <- CVgroup(k = k,datasize = datasize,seed = 1206)cvlist
结果输出示例:
K折交叉验证
第一种方法:循环语句写验证data <- irispred <- data.frame() #存储预测结果library(plyr)library(randomForest)m <- seq(60,500,by = 20) #如果数据量大尽量间隔大点,间隔过小没有实际意义for(j in m){ #j指的是随机森林的数量 progress.bar <- create_progress_bar("text") #plyr包中的create_progress_bar函数创建一个进度条, progress.bar$init(k) #设置上面的任务数,几折就是几个任务 for (i in 1:k){ train <- data[-cvlist[[i]],] #刚才通过cvgroup生成的函数 test <- data[cvlist[[i]],] model <-randomForest(Sepal.Length~.,data = train,ntree = j) #建模,ntree=j 指的树数 prediction <- predict(model,subset(test,select = -Sepal.Length)) #预测 randomtree <- rep(j,length(prediction)) #随机森林树的数量 kcross <- rep(i,length(prediction)) #i是第几次循环交叉,共K次 temp <- data.frame(cbind(subset(test,select = Sepal.Length),prediction,randomtree,kcross))#真实值、预测值、随机森林树数、预测组编号捆绑在一起组成新的数据框tenp pred <- rbind(pred,temp) #temp按行和pred合并 print(paste("随机森林:",j)) #循环至树数j的随机森林模型 progress.bar$step() #输出进度条。告知完成了这个任务的百分之几 }}
结果输出示例1:
结果输出示例2:指标分别为真实值、预测值、随机森林树数、预测组编号
第二种方法:apply家族lapply
当测试的循环数较多或单任务耗时较多时,apply家族优势特别明显data <- irislibrary(plyr)library(randomForest)k = 10j <- seq(10,10000,by = 20) #j树的数量i <- 1:k #K折i <- rep(i,times = length(j))j <- rep(j,each = k) #多少折,each多少x <- cbind(i,j)cvtest <- function(i,j){ train <- data[-cvlist[[i]],] test <- data[cvlist[[i]],] model <- randomForest(Sepal.Length~.,data = train,ntree = j) prediction <- predict(model,subset(test,select = -Sepal.Length)) temp <- data.frame(cbind(subset(test,select = Sepal.Length),prediction))}
结果输出示例3:指标分别为真实值、预测值、随机森林树数、预测组编号
system.time(pred <- mdply(x,cvtest))
mdyly在plyr包中:输出三个指标:“用户”“系统”“流逝”。其中“流逝”应该是这段代码从开始到结束的真正时间。对于一般单线程的程序来说这个时间近似于用户时间和系统时间之和,可以看出共运行了1386秒。
转载地址:https://lovebigdata.blog.csdn.net/article/details/79142088 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月10日 15时19分27秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
JAVA学习笔记6 - 数组
2019-04-30
JAVA学习笔记10 - 继承
2019-04-30
Android 开发学习笔记 00 - Getting Started
2019-04-30
【学习笔记】Android Activity
2019-04-30
Android使用Retrofit_00_Getting Started
2019-04-30
Android使用Retrofit_01_OAuth2 + GitHub
2019-04-30
OpenCV杂记 - Mat in C++
2019-04-30
location区段
2019-04-30
nginx访问控制、基于用户认证、https配置
2019-04-30
SaltStack
2019-04-30
linux内存的寻址方式
2019-04-30
how2heap-double free
2019-04-30
how2heap-fastbin_dup_consolidate
2019-04-30
orw_shellcode_模板
2019-04-30
fmt在bss段(neepusec_easy_format)
2019-04-30
python 函数式编程
2019-04-30
tensorflow 数据格式
2019-04-30
tf keras SimpleRNN源码解析
2019-04-30
tf keras Dense源码解析
2019-04-30