R语言 随机森林 Random Forest 交叉验证 error.cv Gini指数画图

本文主要是介绍R语言 随机森林 Random Forest 交叉验证 error.cv Gini指数画图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

机器学习RandomForest, 随机森林, 分类回归

#自己的一些记录。  提供参考吧。

#可以直接复制到R运行

#加载包
library(randomForest)

#加载数据
data=read.csv("L6_filter.csv",row.names = 1,header=T)  

#设置随机种子数,确保以后再执行代码时可以得到一样的结果
set.seed(123456789)

#数据随机采样设置70%数据用作训练集 30%用作测试集
train_sub = sample(nrow(data),7/10*nrow(data))
train_data = data[train_sub,]
test_data = data[-train_sub,]

#数据预处理 factor的作用是打上标签或者类别
train_data$zq101 = as.factor(train_data$zq101)  #zq101是我的分组信息
test_data$zq101 = as.factor(test_data$zq101)

#筛选mtry个数 
n<-length(names(train_data)) 

set.seed(123456789)  #一些网友说每次随机森林前面都要跑一下
for(i in 1: (n-1)){
        mtry_fit<-randomForest(zq101~. ,data=train_data,mtry=i)
        err<-mean(mtry_fit$err.rate)
        print(err)
}      


##试验性训练模型,使用训练集构建随机森林 
#ntree和mytry分布根据后面的步骤确定 决策树的数量,默认是500,
#mtry每个分组中随机的变量数一般是变量数开根,每棵树使用的特征个数
#mtry指定节点中用于二叉树的变量个数 ??randomForest

set.seed(123456789)  #一些网友说每次随机森林前面都要跑一下
train_randomforest <- randomForest(zq101 ~ .,data = train_data,
                                  ntree =500,    mtry=8,   importance=TRUE ,
                                  proximity=TRUE)
#判断树的数量,树的数量大于?的时候就基本稳定了 
plot(train_randomforest)

#查看变量的重要性
train_randomforest$importance

#对于变量重要性的判断,也可以通过画图的方式直观显现:
varImpPlot(train_randomforest, main = "variable importance",
           n.var = 25)  #var代表显示前?个变量

#对测试集进行预测??predict 
pre_ran <- predict(train_randomforest,newdata=test_data)
#将真实值和预测值整合到一起
obs_p_ran = data.frame(prob=pre_ran,obs=test_data$zq101)
#输出混淆矩阵
table(test_data$zq101,pre_ran,dnn=c("真实值","预测值"))

#ROC曲线和AUC值??ROC
library(pROC)
ran_roc <- roc(test_data$zq101,as.numeric(pre_ran),ci=TRUE)
ran_roc
plot(ran_roc, 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曲线,mtry=3,ntree=500')

#随机森林连续型变量 ??predict    #对比下上一个也有加颜色的,type可以选择3个参数 
fitted.prob<-predict(train_randomforest,newdata=test_data,type="prob")
roc_prob<-roc(as.ordered(test_data$zq101),fitted.prob[,2],ci=T) #计算ROC
auc(roc_prob)
roc_prob$ci
#??plot.roc
plot.roc(roc_prob,col="mediumblue",legacy.axes=TRUE)
roc_prob$ci

#导出图片 pdf  6*8


#交叉验证
set.seed(1264759)
data$zq101 = as.factor(data$zq101)
data1 <-data[,2:53]

#交叉验证中添加随机数的训练集、分组、交叉验证的次数
#step是样本改变的倍数(输出的x轴)    #step可以改变看下结果,其实是一次变量数
result <- rfcv(data1, data$zq101, cv.fold=5,scale="log", step=0.99)
# 绘制错误率曲线,观察错误率与使用Markers数量的变化
with(result, plot(n.var, error.cv, log="x", type="o", lwd=2))
result$error.cv

##使用replicate多次交叉验证??replicate    
result <- replicate(10, rfcv(data1, data$zq101, cv.fold=5,scale="log", step=0.99), 
                    simplify=FALSE)
error.cv <- sapply(result, "[[", "error.cv")
matplot(result[[1]]$n.var, cbind(rowMeans(error.cv), error.cv), type="l",
        lwd=c(2, rep(1, ncol(error.cv))), col=1, lty=1, log="x",
        xlab="Number of variables", ylab="CV Error")

#显示误差行均值
row_mean = apply(error.cv,1,mean)
min(row_mean)

提取绘制折线图

a=data.frame(result[[1]][["error.cv"]])
b=data.frame(result[[2]][["error.cv"]])
c=data.frame(result[[3]][["error.cv"]])
d=data.frame(result[[4]][["error.cv"]])
e=data.frame(result[[5]][["error.cv"]])

f=data.frame(result[[6]][["error.cv"]])
g=data.frame(result[[7]][["error.cv"]])
h=data.frame(result[[8]][["error.cv"]])
i=data.frame(result[[9]][["error.cv"]])
j=data.frame(result[[10]][["error.cv"]])
#合并并删除
error_cbing=cbind(a,b,c,d,e,f,g,h,i,j)
rm(a,b,c,d,e,f,g,h,i,j)

#均数+标准差
row_mean = apply(error_cbing,1,mean)
row_mean2=data.frame(row_mean)
row_sd=    apply(error_cbing,1,sd)
row_sd=data.frame(row_sd)
row_mean_sd=cbind(row_mean2,row_sd)
#改下名字
names(row_mean_sd)[1]="mean"
names(row_mean_sd)[2]="sd"
xa=rownames(row_mean_sd)
xxa=data.frame(xa)
row_mean_sd2=cbind(xxa,row_mean_sd)
#error_sum$xa = factor(error_sum$xa,ordered=TRUE)
#str(error_sum)
#先把数据导出,手动变成因子化
#删掉一部分折线点 #xmin=lowSD, xmax=highSD
row_mean_sd2$lowSD=row_mean_sd2$mean-row_mean_sd2$sd
row_mean_sd2$highSD=row_mean_sd2$mean+row_mean_sd2$sd

write.table(row_mean_sd2,"折线图.csv",sep=",",row.names=TRUE,col.names=TRUE)

#数据可视化,散点图 分组情况
MDSplot(train_randomforest,train_data$zq101,palette = rep((2:8),2),cex=0.5)

#然后看一下样本之间的距离
#看做每个样本映射到2维空间中的坐标,每一维空间是一个分类特征,
#但是不是最原始的4个特征,而是由4个特征衍生得到的新的分类特征,
#根据这个坐标,可以画一张散点图,得到每个样本基于两个分类变量的分组情况
data.mds <- cmdscale(1 -train_data$proximity, eig=TRUE)
plot(data.mds$points, col = rep(c("red", "blue", "green"), each = 50))

#一些想法 或原理学习
#random forest结果是有随机性的,因为每次训练单个数都是通过Bootstrap随机取样
#所以每次结果不同是正常的。
#每次运行结果都是随机初始值的
#所以你在运行前加一个代码:set.seed(100)括号里面的数字是可以自己设定的,
#相当于固定下来那个随机值,每次运行都设定相同的值结果就会一样了
#OOB estimate of error rate 表明了分类器的错误率为4%

Gini指数绘图(后续提供)

 误差折线图 (后续提供)

这篇关于R语言 随机森林 Random Forest 交叉验证 error.cv Gini指数画图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/292051

相关文章

基于Go语言实现一个压测工具

《基于Go语言实现一个压测工具》这篇文章主要为大家详细介绍了基于Go语言实现一个简单的压测工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录整体架构通用数据处理模块Http请求响应数据处理Curl参数解析处理客户端模块Http客户端处理Grpc客户端处理Websocket客户端

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

Go语言使用Buffer实现高性能处理字节和字符

《Go语言使用Buffer实现高性能处理字节和字符》在Go中,bytes.Buffer是一个非常高效的类型,用于处理字节数据的读写操作,本文将详细介绍一下如何使用Buffer实现高性能处理字节和... 目录1. bytes.Buffer 的基本用法1.1. 创建和初始化 Buffer1.2. 使用 Writ

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl