上节我们介绍了随机森林的一些简单情况和使用R语言做二分类结局变量的随机森林模型分析,今天我们继续来介绍为连续变量结局变量的随机森林模型分析,废话不多说,立即开始,使用的数据为SPSS自带的大气层臭氧的数据集,主要描述的是臭氧浓度和大气一些相关指标的情况,因为有些数据是非线性的,使用Logistic回归不合适,可以使用随机森林模型进行分析。
需要使用到randomForest、pROC、lforeign、Metrics、ggplot2包,要先下载好,我们先导入数据看一下情况
library(randomForest)
library(pROC)
library(foreign)
library(Metrics)
library(ggplot2)
bc <- read.spss("E:/r/test/ozone.sav",
use.value.labels=F, to.data.frame=T)
names(bc)
数据中有七个变量,ozon每日臭氧水平为结局变量,Inversion base height反转基准高度,Pressure gradient (mm Hg) 压力梯度(mm Hg),Visibility (miles) 能见度(英里),Temperature (degrees F) 温度(华氏度),Day of the year日期,vh我也不知道是什么,反正就是一参数,这里所有的变量都是连续的。
和二分类模型一样,我们先建立训练集和验证集
set.seed(1)
index <- sample(2,nrow(bc),replace = TRUE,prob=c(0.7,0.3))
traindata <- bc[index==1,]
testdata <- bc[index==2,]
建立随机森林模型
def_ntree<- randomForest(ozon ~vh+ibh+dpg+vis+temp,data=traindata,
ntree=500,important=TRUE,proximity=TRUE)
plot(def_ntree)
可以看到到了500颗树后,模型比较稳定了,我们还可以通过tuneRF函数求出mtry,
mte<-tuneRF(traindata[,c(1,3:6)],traindata[,2],stepFactor =2)
假如我们想知道温度和臭氧浓度的关系,可以发现,当温度达到90度,对臭氧影响很大
partialPlot(def_ntree,traindata,temp,"0",xlab = "temp",ylab = "Variabl effect")
接下来生成训练集和预测集的概率
ctree.predict = predict(def_ntree,testdata)
traindata$ctree.predict1 = predict(def_ntree,traindata)
通过查看R2,rmse,mae比较模型的拟合性
r2<-cor(ctree.predict,testdata$ozon)^2
rmse<-rmse(ctree.predict,testdata$ozon)
mae<-mae(ctree.predict,testdata$ozon)
生成校准的散点图,可以发现大于15以后,预测效能变差,残差增大
plot(ctree.predict,testdata$ozon,pch=19,col="gray25",xlab = "实际值",ylab="预存值")
abline(0,1,col="red")
对变量重要性进行评分,可以发现温度和高度是影响臭氧的重要变量
varImpPlot(def_ntree)
ggplot() +
geom_line(data=traindata,aes(traindata$doy, traindata$ozon,col="red"))+
geom_line(data=traindata,aes(traindata$doy, traindata$ctree.predict1,col="greed"))+
theme(legend.background = element_blank(),legend.position = c(0.1,0.8))+
scale_color_discrete(name = "类别", labels = c("实际值", "预测值"))
我们还可以把任何数据带入求出预测值,也可以通过把臭氧浓度分类进行预判,还有通过验证集验证模型的预测性能,我这里就不一一演示了,可以参考前面两篇的内容。