随机森林算法介绍及R语言实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
随机森林算法介绍及R语言实现
随机森林算法介绍
算法介绍:
简单的说,随机森林就是用随机的方式建立一个森林,森林里面有很多的决策树,并且每棵树之间是没有关联的。得到一个森林后,当有一个新的样本输入,森林中的每一棵决策树会分别进行一下判断,进行类别归类(针对分类算法),最后比较一下被判定哪一类最多,就预测该样本为哪一类。
随机森林算法有两个主要环节:决策树的生长和投票过程。
决策树生长步骤:
1.从容量为N的原始训练样本数据中采取放回抽样方式(即bootstrap取样)
随机抽取自助样本集,重复k(树的数目为k)次形成一个新的训练集N,以此生成一棵分类树;
2.每个自助样本集生长为单棵分类树,该自助样本集是单棵分类树的全部训
练数据。设有M个输入特征,则在树的每个节点处从M个特征中随机挑选m(m < M)个特征,按照节点不纯度最小的原则从这m个特征中选出一个特征进行分枝生长,然后再分别递归调用上述过程构造各个分枝,直到这棵树能准确地分类训练集或所有属性都已被使用过。在整个森林的生长过程中m将保持恒定;
3.分类树为了达到低偏差和高差异而要充分生长,使每个节点的不纯度达到
最小,不进行通常的剪枝操作。
投票过程:
随机森林采用Bagging方法生成多个决策树分类器。
基本思想:
1.给定一个弱学习算法和一个训练集,单个弱学习算法准确率不高,可以视
为一个窄领域专家;
2.将该学习算法使用多次,得出预测函数序列,进行投票,将多个窄领域专
家评估结果汇总,最后结果准确率将大幅提升。
随机森林的优点:
•可以处理大量的输入变量;
•对于很多种资料,可以产生高准确度的分类器;
•可以在决定类别时,评估变量的重要性;
•在建造森林时,可以在内部对于一般化后的误差产生不偏差的估计; •包含一个好方法可以估计遗失的资料,并且,如果有很大一部分的资料遗失,仍可以维持准确度;
•提供一个实验方法,可以去侦测variable interactions;
•对于不平衡的分类资料集来说,可以平衡误差;
•计算各例中的亲近度,对于数据挖掘、侦测偏离者(outlier)和将资料视觉化非常有用;
•使用上述。可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类。也可侦测偏离者和观看资料;
•学习过程很快速。
缺点
•随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合; •对于有不同级别的属性的数据,级别划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。
R语言实现
寻找最优参数mtry,即指定节点中用于二叉树的最佳变量个数
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,ntre e=1000)
rate[i]<-mean(rf_train$err.rate) #计算基于OOB数据的模型误判率均值
print(rf_train)
}
rate #展示所有模型误判率的均值
plot(rate)
寻找最佳参数ntree,即指定随机森林所包含的最佳决策树数目
set.seed(100)
rf_train<-randomForest(as.factor(train_data$IS_LIUSHI)~.,data=train_data,mtry=12,ntre
e=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,ntre
e=400,importance=TRUE,proximity=TRUE)
•importance设定是否输出因变量在模型中的重要性,如果移除某个变量,模型方差增加的比例是它判断变量重要性的标准之一;
•proximity参数用于设定是否计算模型的临近矩阵;
•ntree用于设定随机森林的树数。
输出变量重要性:分别从精确度递减和均方误差递减的角度来衡量重要程度。importance<-importance(rf_train)
write.csv(importance,file="E:/模型搭建/importance.csv",s=T,quote=F)
barplot(rf_train$importance[,1],main="输入变量重要性测度指标柱形图")
box()
提取随机森林模型中以准确率递减方法得到维度重要性值。type=2为基尼系数方法
importance(rf_train,type=1)
varImpPlot(x=rf_train,sort=TRUE,n.var=nrow(rf_train$importance),main="输入变量重要性测度散点图")
信息展示
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)) #展示数据集在二维情况下各类别的具体分布情况
检测
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包可以实现随机森林算法的应用,主要涉及5个重要函数,语法和参数请见下