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

本文介绍了如何使用R语言实现随机森林算法,包括数据预处理、模型训练、变量重要性评估以及ROC曲线分析。通过随机森林进行分类和回归任务,展示了交叉验证在模型选择中的应用,并探讨了随机森林结果的随机性及其处理方法。
摘要由CSDN通过智能技术生成

机器学习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指数绘图(后续提供)

 误差折线图 (后续提供)

  • 15
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
随机森林是一种常用的机器学习算法,用于分类和回归。它通过组合多个决策树来进行预测,并通过投票或求平均值的方式得到最终的结果。 在R语言中,使用randomForest包来实现随机森林。首先,我们需要设置种子数(set.seed),以确保随机性的可复现性。接着,我们可以使用randomForest函数来构建随机森林模型。在构建模型时,可以设置树的数量(ntree)和每棵树使用的特征个数(mtry)等参数。通常,树的数量默认为500,而每个分组中随机的变量数一般是变量数开根。 交叉验证是一种评估模型性能的方法。在R语言中,可以使用for循环结合randomForest函数来进行交叉验证。首先,我们需要设置种子数(set.seed),以确保随机性的可复现性。然后,通过for循环遍历不同的mtry值,每次使用不同的mtry值构建随机森林模型,并计算模型的平均错误率(err.rate)。通过打印错误率,我们可以观察不同mtry值对模型性能的影响。 总结起来,R语言中的随机森林可以通过设置参数来构建模型,并使用交叉验证来评估模型性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [R语言 随机森林 Random Forest 交叉验证 error.cv Gini指数画图](https://blog.csdn.net/weixin_46623488/article/details/119441965)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值