随机森林是基于决策树的组合模型,若因变量为分类变量则建立分类判别模型,若为连续变量则建立非线性回归分析模型。随机森林在分类中返回得票数最多的分类选项,在回归中返回所有决策树输出的平均值。随机森林是由多个回归树组合而成的模型,广泛用于分类研究,随机森林回归能够有效的分析非线性、具有共线性和交互作用的数据,效果要优于多元线性回归,并且不需要预先给定模型的形式假定,回归效果比回归树更好。随机森林在实际应用中在分类中效果要优于回归,随机森林不能够作出超越训练集数据范围的预测,这可能导致在对某些还有特定噪声的数据进行建模时出现过度拟合。
随机森林回归算法流程
随机森林使用bootstrap重复抽样方法,也称自助法,是一种从给定数据集中有放回均匀抽样,小样本时效果较好。实际操作从原始样本中抽取一定数量样本,允许重复抽样;根据抽出的样本计算给定的统计量;重复上述步骤多次,得到多个计算的统计量结果;由统计量结果得到统计量方差。
1、假设原始样本含量为N,应用bootstrap有放回随机抽取b个自助样本集(一般样本集中样本量越大回归效果越好),并由此构建b颗回归树,同时未抽取到的数据即袋外数据(OOB)作为随机森林的测试样本;
2、设原始数据变量个数为p,则在每一个回归树的每个节点处随机抽取 m0 个变量( m0 < p )作为备选分枝变量,一般取 m0 =p/3,然后再其中根据分枝优度准则选取最优分枝(同回归树模型建立);其中分枝优度准则是基于离均差平方和,假设有p个自变量X=( X1 , X2 ,…, Xp )和连续型因变量Y。对于树的某一节点t的样本为{..xn,yn},改节点样本量为N(t),由此可知该节点的的离均差平方和。假定该阶段t内所有可能的分枝集合(含变量和相应的切点)为A,分枝s将节点t分裂为两个子节点 tl 与 tr ,其中最佳分枝既为使得t节点的离均差平方和与分裂后的两个子节点对应的离均差平方和之和差距最大的分枝,即分裂后效果优于分裂前,使得各子节点内的变异最小。
3、每棵树开始自顶向下递归分枝,设定叶节点最小尺寸为5,并以此作为回归树生长的终止条件,即当叶节点数目小于5时,停止分枝;
4、将生成的b颗回归树组成随机森林回归模型,回归的效果评价采用带袋外数据(OOB)预测残差均方MSE及拟合优度 R2 。
随机森林回归变量重要性评分
在进行回归的过程中,可对变量进行打分,获取变量重要性得分,增加了模型的可解释性,其使用permulation随机置换的方式,通过残差均方误差减少量衡量。
随机置换属于非参数检验的一种,通常用在小样本情况下,具体来说,总体有m+n个,从中抽取n个作为样本A,剩下m个作为样本B,比较A、B两组差异,重复该过程多次。
具体过程如下:
1、每一个自助样本建立一个回归树,产生袋外数据b个,同时使用该模型对对应的袋外数据OOB进行预测,得到袋外数据的残差均方及标准误差(SE);残差均方记为 MSE1,MSE2,MSE3....MSEB ;
2、遍历拟合回归树所用到的变量 Xi ,形成新的OOB测试样本(既只采用 Xi 剔除其他变量),然后用已建立的随机森林对新的OOB进行预测,并获取置换后的OOB残差均方,结果矩阵如下
3、使用 MSE1 , MSE2 ,…, MSEb 与矩阵中i行向量相减后平均最后除以标准误差SE获取变量 Xi 的重要性评分。
数据说明
数据文件内容部分截图如下,以index作为因变量,index1~index6为自变量,有数据可知,因变量为连续性变量,采用随机森林的方法进行回归拟合(若为分类变量则进行分类)。
R代码
library(randomForest)#加载R包
randomForestOut<-function(formula,data,pre_num,outFile){
works<-unique(data$Ipname)
for(i in 1:length(works)){
namestr=paste("^",works[i],"$",sep="")
data_single<-data[grep(namestr,data$Ipname),]#获取每一部作品的时序数据
num1=(nrow(data_single)-pre_num)
train_data<-data_single[1:num1,]#获取模型训练数据
test_data<-data_single[nrow(data_single)-pre_num+1:nrow(data_single),][1:pre_num,]#获取测试数据
test_result<-randomRession(train_data,test_data,formula)#调用自定义函数randomRession,获取测试集结果
out=data.frame(test_data,test_result)#将原文件数据与回归结果输出
outPut(out,outFile,i)#调用自定义函数outPut,将结果输出到外部文件outFile中
}
}
randomRession<-function(train_data,test_data,formula){
Randommodel<-randomForest(formula,data=train_data,importance=TRUE,proximity = FALSE)#拟合随机森林,也可输出指标的重要性得分imporimportance=TRUE即表示,这里就不输出了,可单独调用这一行,查看
test_result<-predict(Randommodel,test_data)#获取拟合随机森林模型的测试集结果
return(test_result)
}
outPut<-function(output,outFile,num){
if(num==1){
write.table(output,outFile,append=TRUE,sep=",",row.names = FALSE)#第一行输出保存列名
}else{
write.table(output,outFile,append=TRUE,sep=",",row.names = FALSE,col.names = FALSE)#其他行输出保存不保留列名
}
}
####调用方法,获取结果####
data<-read.csv("F://data//indextotal.csv",header = T,as.is = F)#从csv文件中获取数据
outFile="F://data//result.csv"#指定数据输出文件
pre_num=4#指定回归预测个数
formula=index~index1+index2+index3+index4+index5+index6
randomForestOut(formula,data,pre_num,outFile)#调用方法,并导出结果
备注:R代码部分参考即可,训练集和测试集代码里面的划分并不合理,且功能划分不是很清晰,大致用法就是这样。
参考论文
参考论文:http://www.doc88.com/p-3911030547146.html