服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - R语言 - R语言交叉验证的实现代码

R语言交叉验证的实现代码

2021-12-24 13:52bigdata老司机 R语言

这篇文章主要介绍了R语言交叉验证的实现,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

k-折交叉验证

k-折交叉验证(K-fold cross-validation)是交叉验证方法里一种。它是指将样本集分为k份,其中k-1份作为训练数据集,而另外的1份作为验证数据集。用验证集来验证所得分类器或者模型的错误率。一般需要循环k次,直到所有k份数据全部被选择一遍为止。

有关交叉验证的介绍可参考作者另一博文:
http://blog.csdn.net/yawei_liu1688/article/details/79138202

 

R语言实现

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 <- 10
datasize <- nrow(iris)
cvlist <- CVgroup(k = k,datasize = datasize,seed = 1206)
cvlist

结果输出示例:

R语言交叉验证的实现代码

K折交叉验证
第一种方法:循环语句写验证

data <- iris
pred <- 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:

R语言交叉验证的实现代码

结果输出示例2:指标分别为真实值、预测值、随机森林树数、预测组编号

R语言交叉验证的实现代码

第二种方法:apply家族lapply
当测试的循环数较多或单任务耗时较多时,apply家族优势特别明显

data <- iris
library(plyr)
library(randomForest)
k = 10
j <- 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:指标分别为真实值、预测值、随机森林树数、预测组编号

R语言交叉验证的实现代码

system.time(pred <- mdply(x,cvtest))  

R语言交叉验证的实现代码

mdyly在plyr包中:输出三个指标:“用户”“系统”“流逝”。其中“流逝”应该是这段代码从开始到结束的真正时间。对于一般单线程的程序来说这个时间近似于用户时间和系统时间之和,可以看出共运行了1386秒。

到此这篇关于R语言交叉验证的文章就介绍到这了,更多相关R语言交叉验证的实现代码内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/yawei_liu1688/article/details/79142088

延伸 · 阅读

精彩推荐
  • R语言R语言-使用ifelse进行数据分组

    R语言-使用ifelse进行数据分组

    这篇文章主要介绍了R语言-使用ifelse进行数据分组,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    小力丸12042022-01-10
  • R语言R语言编程学习绘制动态图实现示例

    R语言编程学习绘制动态图实现示例

    这篇文章主要介绍了R语言编程学习绘制动态图实现示例,有需要的的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪...

    微小冷7652022-01-18
  • R语言聊聊R语言中Legend 函数的参数用法

    聊聊R语言中Legend 函数的参数用法

    这篇文章主要介绍了聊聊R语言中Legend 函数的参数用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Gavin姓陈6352021-12-28
  • R语言R语言创建矩阵的实现方法

    R语言创建矩阵的实现方法

    这篇文章主要介绍了R语言创建矩阵的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随...

    hjk_caesar9462021-12-27
  • R语言R语言中c()函数与paste()函数的区别说明

    R语言中c()函数与paste()函数的区别说明

    这篇文章主要介绍了R语言中c()函数与paste()函数的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    yiyu_j11152022-01-12
  • R语言R语言绘制散点图实例分析

    R语言绘制散点图实例分析

    在本篇文章里小编给大家整理的是一篇关于R语言绘制散点图实例分析内容,有需要的朋友们可以学习下。...

    w3cschool6942022-01-06
  • R语言R语言可视化存储矢量图实现方式

    R语言可视化存储矢量图实现方式

    这篇文章主要为大家介绍了R语言存储矢量图的实现方式过程,有需要的朋友可以借鉴参考下,希望能够有所你帮助,祝大家多多进步,早日升职加薪...

    Kanny广小隶9392022-01-20
  • R语言R studio 批量注释的快捷方式

    R studio 批量注释的快捷方式

    这篇文章主要介绍了R studio 批量注释的快捷方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    JasonKQLin13342022-01-04