【教程】R语言实现随机森林超详细教程
本期分享如何用R实现随机森林,主要包括算法介绍、R语言代码实现及randomForest包实现随机森林应用等。
library("randomForest")
n<-length(names(train_data)) #计算数据集中自变量个数,等同n=ncol(train_data)
rate=1 #设置模型误判率向量初始值
for(i in 1:(n-1)){
set.seed(1234)
rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=i,ntree=1000)
rate[i]<-mean(rf_train$err.rate) #计算基于OOB数据的模型误判率均值
print(rf_train)
}
rate #展示所有模型误判率的均值
plot(rate)
set.seed(100)
rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=12,ntree=1000)
plot(rf_train) #绘制模型误差与决策树数量关系图
legend(800,0.02,"IS_LIUSHI=0",cex=0.9,bty="n")
legend(800,0.0245,"total",cex=0.09,bty="n")
set.seed(100)
rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=12,ntree=400,importance=TRUE,proximity=TRUE)
a. importance设定是否输出因变量在模型中的重要性,如果移除某个变量,模型方差增加的比例是它判断变量重要性的标准之一;
b. proximity参数用于设定是否计算模型的临近矩阵;
c. ntree用于设定随机森林的树数。
importance<-importance(rf_train)
write.csv(importance,file="E:/模型搭建/importance.csv",row.names=T,quote=F)
barplot(rf_train$importance[,1],main="输入变量重要性测度指标柱形图")
box()
importance(rf_train,type=1)
varImpPlot(x=rf_train,sort=TRUE,n.var=nrow(rf_train$importance),main="输入变量重要性测度散点图")
(6) 信息展示:
print(rf_train) #展示随机森林模型简要信息
hist(treesize(rf_train)) #展示随机森林模型中每棵决策树的节点数
max(treesize(rf_train));min(treesize(rf_train))
MDSplot(rf_train,train_data$IS_OFF_USER,palette=rep(1,2),pch=as.numeric(train_data$IS_LIUSHI)) #展示数据集在二维情况下各类别的具体分布情况
(7) 检测:
pred<-predict(rf_train,newdata=test_data)
pred_out_1<-predict(object=rf_train,newdata=test_data,type="prob") #输出概率
table <- table(pred,test_data$IS_LIUSHI)
sum(diag(table))/sum(table) #预测准确率
plot(margin(rf_train,test_data$IS_LIUSHI),main=观测值被判断正确的概率图)
randomForest(formula, data=NULL, ..., subset, na.action=na.fail)
randomForest(x, y=NULL, xtest=NULL, ytest=NULL, ntree=500,
mtry=if (!is.null(y) && !is.factor(y))
max(floor(ncol(x)/3), 1) else floor(sqrt(ncol(x))),
replace=TRUE, classwt=NULL, cutoff, strata,
sampsize = if (replace) nrow(x) else ceiling(.632*nrow(x)),
nodesize = if (!is.null(y) && !is.factor(y)) 5 else 1,
maxnodes = NULL,
importance=FALSE, localImp=FALSE, nPerm=1,
proximity, oob.prox=proximity,
norm.votes=TRUE, do.trace=FALSE,
keep.forest=!is.null(y) && is.null(xtest), corr.bias=FALSE,
keep.inbag=FALSE, ...)
a. formula指定模型的公式形式,类似于y~x1+x2+x3…;
b. data指定分析的数据集;
c. subset以向量的形式确定样本数据集;
d. na.action指定数据集中缺失值的处理方法,默认为na.fail,即不允许出现缺失值,也可以指定为na.omit,即删除缺失样本;
e. x指定模型的解释变量,可以是矩阵,也可以是数据框;
f. y指定模型的因变量,可以是离散的因子,也可以是连续的数值,分别对应于随机森林的分类模型和预测模型。这里需要说明的是,如果不指定y值,则随机森林将是一个无监督的模型;
g. xtest和ytest用于预测的测试集;
h. ntree指定随机森林所包含的决策树数目,默认为500;
i. mtry指定节点中用于二叉树的变量个数,默认情况下数据集变量个数的二次方根(分类模型)或三分之一(预测模型)。一般是需要进行人为的逐次挑选,确定最佳的m值;
j. replace指定Bootstrap随机抽样的方式,默认为有放回的抽样
k. classwt指定分类水平的权重,对于回归模型,该参数无效;
l. strata为因子向量,用于分层抽样;
m. sampsize用于指定样本容量,一般与参数strata联合使用,指定分层抽样中层的样本量;
n. nodesize指定决策树节点的最小个数,默认情况下,判别模型为1,回归模型为5;
o. maxnodes指定决策树节点的最大个数;
p. importance逻辑参数,是否计算各个变量在模型中的重要性,默认不计算,该参数主要结合importance()函数使用;
q. proximity逻辑参数,是否计算模型的临近矩阵,主要结合MDSplot()函数使用;
r. oob.prox是否基于OOB数据计算临近矩阵;
s. norm.votes显示投票格式,默认以百分比的形式展示投票结果,也可以采用绝对数的形式;
t. do.trace是否输出更详细的随机森林模型运行过程,默认不输出;
u. keep.forest是否保留模型的输出对象,对于给定xtest值后,默认将不保留算法的运算结果。
(2). importance()函数用于计算模型变量的重要性:
importance(x, type=NULL, class="NULL", scale=TRUE, ...)
a. x为randomForest对象;
b. type可以是1,也可以是2,用于判别计算变量重要性的方法,1表示使用精度平均较少值作为度量标准;2表示采用节点不纯度的平均减少值最为度量标准。值越大说明变量的重要性越强;
c. scale默认对变量的重要性值进行标准化。
(3). MDSplot()函数用于实现随机森林的可视化:
MDSplot(rf, fac, k=2, palette=NULL, pch=20, ...)
a. rf为randomForest对象,需要说明的是,在构建随机森林模型时必须指定计算临近矩阵,即设置proximity参数为TRUE;
b. fac指定随机森林模型中所使用到的因子向量(因变量);
c. palette指定所绘图形中各个类别的颜色;
d. pch指定所绘图形中各个类别形状;
e. 还可以通过R自带的plot函数绘制随机森林决策树的数目与模型误差的折线图
(4). rfImpute()函数可为存在缺失值的数据集进行插补(随机森林法),得到最优的样本拟合值:
rfImpute(x, y, iter=5, ntree=300, ...)
rfImpute(x, data, ..., subset)
a. x为存在缺失值的数据集;
b. y为因变量,不可以存在缺失情况;
c. iter指定插值过程中迭代次数;
d. ntree指定每次迭代生成的随机森林中决策树数量;
e. subset以向量的形式指定样本集。
(5). treesize()函数用于计算随机森林中每棵树的节点个数:
treesize(x, terminal=TRUE)
c. 一般treesize()函数生成的结果用于绘制直方图,方面查看随机森林中树的节点分布情况。
本文原文作者bigdata老司机,点击下方左下角【阅读原文】可跳转至原文页面。
-----END-----
社群交流 / 原创投稿 / 商务合作
(请添加下方小助手微信)
来源:生态遥感笔记
推荐阅读
【吐槽】测绘工程行业也有相貌歧视?【技术】全站仪如何进行导线测量之计算【招聘】中国地调局自然资源综合调查指挥中心所属13大中心发布2021招聘通知!【关注】“房地一体”几何精度如何保障?测绘院有高招!【荐书】《国家大地坐标系建立的理论与实践》推荐关注
温馨提示:近期,微信公众号信息流改版。每个用户可以设置 常读订阅号,这些订阅号将以大卡片的形式展示。因此,如果不想错过“测绘之家”的文章,你一定要进行以下操作:进入“测绘之家”公众号 → 点击右上角的 ··· 菜单 → 选择「设为星标」
↓↓↓点击下方“阅读原文”查看更多精彩内容...