本文实现了R语言构建随机森林模型并且进行K-折交叉验证。K-折交叉验证即将原始数据分成K等分,每次选择1份作为测试集,另外k-1份为训练集进行建模,最终精度为k次建模精度的均值。本文以十折交叉验证为例,例子不是分类是回归。如果一次结果不太满意,可以修改max_seed,代码实现了这一迭代,最后会保留最佳的训练结果。

感谢评论指出的错误,代码已经改正过了。

# 保留最高r2的种子
bestm = 0
# 保留最高r2
bestr2 = 0
# 原始csv数据路径,建议仅保留自变量和因变量,去掉索引号
dir = "这里是原始数据的路径.csv"
# 定义最大迭代随机种子数值,默认为3,等于分别设置种子为1、2、3运行三次,并保留模型精度最高的种子作为最终结果,max_seed根据个人需求自行修改。该代码迭代所有种子,最后再运行一次精度最高的种子作为输出,如果设置为1只是想运行一次,该代码就显得非常累赘低效,请自行修改。
max_seed = 3
# 数据拆分份数
k = 10
for (m in 1:max_seed){print(paste('set seed = ',m))# 设置随机种子set.seed(m)# 读取数据data = read.csv(dir)# 转换为dataframedata = as.data.frame(data)#获取长度len = nrow(data)#定义拆分函数mysplitmysplit = function(k,len){# 数据索引池pool = c(1:len)#每份的长度seg = as.integer(len/k)# 定义训练集合测试集的索引数据框,如果len不能被k整除会舍弃零头数据train = as.data.frame(matrix(nrow = (len - seg)))test = as.data.frame(matrix(nrow = seg))for (i in 1 : k){# 测试集索引ctest = sample(pool,seg,replace = FALSE)# 赋值train[i] = setdiff(c(1:len),ctest)test[i] = ctest# 不放回抽样,更新索引池pool = setdiff(pool,ctest)}# 返回索引数据框out = list(one=train, two=test)return(out)}# 调用函数,从out提取出train和test索引数据框split1 = mysplit(k,len)train = split1$onetest = split1$two# 定义验证精度的累加值,循环结束后取均值total_train = 0total_test = 0# 开始循环for(i in 1:k){# 根据索引拆分训练测试集train_actual = data[unlist(train[i]),]test_actual = data[unlist(test[i]),]# 定义输出路径,为了避免冗余,输出csv这部分放到了代码最后,这里都注释掉了# path_test_actual = paste ("C:/Users/Administrator/Desktop/test_actual",i,".csv",sep = "", collapse = NULL)# path_train_actual = paste ("C:/Users/Administrator/Desktop/train_actual",i,".csv",sep = "", collapse = NULL)# path_train_predict = paste ("C:/Users/Administrator/Desktop/train_predict",i,".csv",sep = "", collapse = NULL)# path_test_predict = paste ("C:/Users/Administrator/Desktop/test_predict",i,".csv",sep = "", collapse = NULL)# 随机森林建模,请自行进行模型的调试library(randomForest)rf = randomForest(这里写原数据里因变量的名称不要带引号 ~ ., data=train_actual)# 训练测试集预测结果train_predict = predict(rf, train_actual)test_predict = predict(rf, test_actual)# 输出csv,方便数据检视# write.csv(train_actual, file=path_train_actual)# write.csv(test_actual, file=path_test_actual)# write.csv(train_predict, file = path_train_predict)# write.csv(test_predict , file = path_test_predict)# ---- 计算测试集预测精度 ----# 1. 'Actual' and 'Predicted' data# df <- data.frame(y_actual = test_actual[[这里写原数据里因变量的名称要带引号]],y_predict  = test_predict) # 下面是计算过程# 2. Average of actual dataavr_y_actual <- mean(df$y_actual)# 3. Total sum of squaresss_total <- sum((df$y_actual - avr_y_actual)^2)# 4. Regression sum of squaresss_regression <- sum((df$y_predict - avr_y_actual)^2)# 5. Residual sum of squaresss_residuals <- sum((df$y_actual - df$y_predict)^2)# 6. R2 Scorer_test <- 1 - ss_residuals / ss_total# 输出一下k以及测试精度R2# print(paste ("第",i,"折测试集r2:",r_test,sep='',collapse = NULL))# print(r_test)# ---- 计算训练集预测精度 ----# 1. 'Actual' and 'Predicted' data# --这里的6记得修改,对应h_test.csv参数y所在的列df <- data.frame(y_actual = train_actual[[这里写原数据里因变量的名称要带引号]],y_predict  = train_predict) # 下面是计算过程# 2. Average of actual dataavr_y_actual <- mean(df$y_actual)# 3. Total sum of squaresss_total <- sum((df$y_actual - avr_y_actual)^2)# 4. Regression sum of squaresss_regression <- sum((df$y_predict - avr_y_actual)^2)# 5. Residual sum of squaresss_residuals <- sum((df$y_actual - df$y_predict)^2)# 6. R2 Scorer_train <- 1 - ss_residuals / ss_total#train R2# 输出训练精度R2# print(paste ("第",i,"折训练集r2:",r_train,sep='',collapse = NULL))# 精度累加值更新total_train = total_train + r_traintotal_test = total_test + r_test}# 计算R2平均值total_train = total_train/ktotal_test = total_test/k# 输出print(paste('最终测试集r2:',total_test))print(paste('最终训练集r2:',total_train))# 如果该种子为最佳结果,则保留结果并输出if (total_test > bestr2){bestr2 = total_testbestm = m}jindu = m/(max_seed/100)print(paste('当前已运行',round(jindu,1),'%'))
}
# print(paste('最高r2种子为:',bestm))
# print(paste('最高r2为:',bestr2))# ----------------------------最后输出最高r2的csv预测结果---------------------------
# ----------------------------最后输出最高r2的csv预测结果---------------------------
# ----------------------------最后输出最高r2的csv预测结果---------------------------
# 设置随机种子
set.seed(bestm)#定义拆分函数mysplit
mysplit = function(k,len){# 数据索引池pool = c(1:len)#每份的长度seg = as.integer(len/k)# 定义训练集合测试集的索引数据框,如果len不能被k整除会舍弃零头数据train = as.data.frame(matrix(nrow = (len - seg)))test = as.data.frame(matrix(nrow = seg))for (i in 1 : k){# 测试集索引ctest = sample(pool,seg,replace = FALSE)# 赋值train[i] = setdiff(c(1:len),ctest)test[i] = ctest# 不放回抽样,更新索引池pool = setdiff(pool,ctest)}# 返回索引数据框out = list(one=train, two=test)return(out)
}
split1 = mysplit(k,len)
train = split1$one
test = split1$two
# 开始循环
total_predict = data.frame()
total_actual = data.frame()for(i in 1:k){# 根据索引拆分训练测试集train_actual = data[unlist(train[i]),]test_actual = data[unlist(test[i]),]# 定义输出路径path_test_actual = paste ("C:/Users/Administrator/Desktop/test_actual",i,".csv",sep = "", collapse = NULL)# path_train_actual = paste ("C:/Users/Administrator/Desktop/train_actual",i,".csv",sep = "", collapse = NULL)# path_train_predict = paste ("C:/Users/Administrator/Desktop/train_predict",i,".csv",sep = "", collapse = NULL)path_test_predict = paste ("C:/Users/Administrator/Desktop/test_predict",i,".csv",sep = "", collapse = NULL)# 随机森林建模,请自行进行模型的调试library(randomForest)rf = randomForest(这里写原数据里因变量的名称不要带引号 ~ ., data=train_actual)# 训练测试集预测结果train_predict = predict(rf, train_actual)test_predict = predict(rf, test_actual)# 输出csv,方便数据检视# write.csv(train_actual, file=path_train_actual)write.csv(test_actual, file=path_test_actual)# write.csv(train_predict, file = path_train_predict)write.csv(test_predict , file = path_test_predict)total_predict = rbind(total_predict,read.csv(path_test_predict))total_actual = rbind(total_actual,read.csv(path_test_actual))
}
total = merge(total_actual,total_predict)
# 输出k次建模的测试集实际值和预测值
write.csv(total, 'C:/Users/Administrator/Desktop/total.csv')
print(paste('最高r2种子为:',bestm))
print(paste('最高r2为:',bestr2))
print('done')

已经很傻瓜操作了,需要修改的代码有:1)交叉验证折数 k 的值; 2)原始csv数据的路径; 3)因变量的参数名;4)随机种子最大值 max_seed 。模型的调试请自行尝试。

如果遇到问题或者提供建议,欢迎留言,也可联系QQ:1262840380

R语言 K-折交叉验证 十折交叉验证 数据集的等分 随机森林回归为例相关推荐

  1. R语言dplyr包和tidyr包创建交叉表(列联表、crosstab)实战

    R语言dplyr包和tidyr包创建交叉表(列联表.crosstab)实战 目录 R语言dplyr包和tidyr包创建交叉表(列联表.crosstab)实战

  2. csv数据,已区分训练集和验证集,需要用r语言建立随机森林回归模型,计算模型精度,包括训练集和验证集的r方、mae、rmse

    csv数据,已区分训练集和验证集,需要用r语言建立随机森林回归模型,计算模型精度,包括训练集和验证集的r方.mae.rmse #读取训练集 train <- read.csv("tra ...

  3. R语言用标准最小二乘OLS,广义相加模型GAM ,样条函数进行逻辑回归LOGISTIC分类...

    原文链接:http://tecdat.cn/?p=21379 本文我们对逻辑回归和样条曲线进行介绍. logistic回归基于以下假设:给定协变量x,Y具有伯努利分布, 目的是估计参数β. 回想一下, ...

  4. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、使用fa.diagram函数可视化斜交旋转因子分析、并解读可视化图形

    R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵).使用rotate参数指定进行斜交旋转提取因子.使用fa.diagram函数可视化斜交旋转因子分析.并解读可视化图形 目 ...

  5. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、使用nfactors参数指定抽取的因子个数、fa函数因子分析结果解读

    R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵).使用rotate参数指定进行斜交旋转提取因子.使用nfactors参数指定抽取的因子个数.fa函数因子分析结果解读(  ...

  6. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、并获取因子分数、因子得分系数(scoring coefficients)

    R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵).使用rotate参数指定进行斜交旋转提取因子.并获取因子分数.因子得分系数(factor scores.scoring ...

  7. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用nfactors参数指定抽取的因子的个数、fa函数因子分析结果解读(Extracting common facto

    R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵).使用nfactors参数指定抽取的因子的个数.fa函数因子分析结果解读(Extracting common facto ...

  8. R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵)、使用rotate参数指定进行斜交旋转提取因子、使用factor.plot函数可视化斜交旋转因子分析、并解读可视化图形

    R语言使用psych包的fa函数对指定数据集进行因子分析(输入数据为相关性矩阵).使用rotate参数指定进行斜交旋转提取因子.使用factor.plot函数可视化斜交旋转因子分析.并解读可视化图形 ...

  9. R语言随机森林回归(randomforest)模型构建

    R语言随机森林回归(randomforest)模型构建 目录 R语言随机森林回归(randomforest)模型构建

  10. R语言neuralnet包构建神经网络模型:基于乳腺癌数据集

    R语言neuralnet包构建神经网络模型:基于乳腺癌数据集 目录 R语言neuralnet包构建神经网络模型:基于乳腺癌数据集

最新文章

  1. 数据竞争(data race)问题分析的利器——valgrind的Helgrind
  2. Transformer 眼中世界 Vs. CNN 眼中世界
  3. python3创建定时任务
  4. 四旋翼飞行器旋转矩阵公式推导!
  5. [C++ STL] 常用算法总结
  6. linux爬365租房没有数据,新手求助,LINUX下安装11G不能MOUNT数据库
  7. Nginx 反向代理 websocket 协议
  8. VC项目配置基础 (VC6.0 和VC2005)
  9. html报错页面,多页面配置生成的html报错
  10. 微软想通了?Windows 11恢复一键改变默认浏览器功能
  11. 组件化,插件化和热更新
  12. 软件项目管理 project 实验
  13. java jsonp网络爬虫_JSOUP 爬虫
  14. 【Shawn-LeetCode】Two Sum
  15. npm install 时报错:npm WARN vueproject@1.0.0 No repository field.(缺少repository字段)
  16. 【HBuilderX】预编译器错误:代码使用了scss/sass语言,但未安装相应的编译器插件,请前往插件市场安装该插件:
  17. 基于Android的手机点名签到学生请假考勤系统
  18. 如何在xampp下运行php文件
  19. 据说,这四招能提高你的打字速度 快来试试
  20. 通读《C++ primer plus》— C++中的5种数据类型转换方式

热门文章

  1. 视频翻译软件有哪些?好用的视频翻译软件推荐
  2. 淘宝无货源自动群控软件一键铺货接口对接说明
  3. FME转换器参考手册目录汉化索引
  4. 良田摄像头 linux,良田万能摄像头高拍仪驱动下载|良田万能摄像头驱动 官方版 - 软件下载 - 绿茶软件园|33LC.com...
  5. 大一大学计算机应用基础,大一计算机应用基础试题
  6. 大学计算机基础教程期末试题,大一大学计算机基础教程期末考试卷试题 .doc
  7. 2022软考中级软件设计师---易混淆知识点总结1
  8. ArcGIS制图之地形图制作
  9. 远程接入CBTS的应用
  10. 项目进度管理:活动之间的四种依赖关系