##########随机森林##########
#导入数据时,推荐建立一个R project,直接将所需数据拖入即可,方便使用
#原始数据集在本script中名为“train”,需要预测的数据集名为“text”,你可以根据你的需要修改
#推荐将导入数据的后缀改为csv
#本script的预测变量名称为Churn(二分类),你可以根据你的需要做修改(建议使用查找并一键替换)
##########载入工具包##########
library(randomForest)
library(pROC)
library(caret)
library(ggplot2)
##########划分测试集与训练集##########
n=7
m=3#n:m为测试集与训练集之比,n+m=10
trainlist<-sample(nrow(train),n/(n+m)*nrow(train))#将数据集划分为n:m,
train_data<-train[trainlist,]#取前10n%作为训练集
test_data<-train[-trainlist,]#取后10m%作为测试集
##########寻找合适的特征数##########
err_rate<-1#设置模型误判率向量初始值
n<-ncol(train_data)
for(i in 1:(n-1))
{
set.seed(1234)
rf_train<-randomForest(as.factor(train_data$Churn)~.,data=train_data,
mtry=i,importance=T,proximity=T,ntree=500)
err_rate[i]<-mean(rf_train$err.rate) #计算基于OOB数据的模型误判率均值
}
plot(err_rate)#当纵坐标误判率最小时,选择最合适的特征数,图上看不出来的话
#你可以单独运行err_rate来进行查看
##########设置特征数并选择合适的树模型个数##########
#构建随机森林模型:将特征值(mytry)定为X(上方你已经选择过最佳的index),树模型的个数并不是越多越好,
#当树模型个数达到一定数值后,整体效果趋于稳定,若建立太多树模型,会导致整体的准确率下降。
#平均最小基尼系数表示随机森林预测准确性的降低程度,该值越大表示该变量的重要性越大。
#平均准确率下降指数表示每个变量对分类树每个节点上观测值的异质性的影响,该值越大表示该变量的重要性越大。
#实验性训练模型
set.seed(1000)
rf_train<-randomForest(as.factor(train_data$Churn)~.,data=train_data,
mtry=10,importance=T,proximity=T,ntree=800)
plot(rf_train) #绘制模型误差与决策树数量关系图
#正式训练
rf_train<-randomForest(as.factor(train_data$Churn)~.,data=train_data,
mtry=10,importance=T,proximity=T,ntree=600)
importance(rf_train,type=2)#计算平均最小基尼指数
importance(rf_train,type=1)#计算平均准确度下降指数
varImpPlot(rf_train, main = "variable importance")#使用图形的方式对指标的重要性进行可视化
##########展示随机森林模型的简要信息##########
print(rf_train)#展示随机森林模型简要信息
hist(treesize(rf_train))#展示随机森林模型中每棵决策树的节点数
MDSplot(rf_train,train_data$Churn,palette=rep(1,3),pch=as.numeric(train_data$Churn),
main="二维情况下各类别的具体分类情况")#展示数据集在二维情况下各类别的具体分布情况
par(mar=c(5,12,2,2))#调整绘图区域距离外框线的距离,分别是下左上右分别空出的距离
barplot(rf_train$importance[,1],main="输入变量重要性测度指标柱形图",horiz=TRUE,las=1)#importance后面的1为准确率递减方法衡量,2为基尼系数方法
box()
##########利用测试集进行测试并输出模型的预测结果##########
pred<-predict(rf_train,newdata=test_data)#利用测试集进行预测
pred_out_1<-predict(object=rf_train,newdata=test_data,type="prob")#输出概率
confusionMatrix(data = as.factor(pred), reference = as.factor(test_data$Churn), mode = "everything")
#上一行代码输出混淆矩阵及各项统计指标
table <- table(pred,test_data$Churn)
sum(diag(table))/sum(table)#计算更加详细的预测准确率
plot(margin(rf_train,test_data$Churn),main="观测值被判断正确的概率图")
multiclass.roc(as.numeric(test_data$Churn), as.numeric(pred))#测试集roc,ROC曲线与横坐标轴所围成面积越大,说明模型的判错率越小
#结果为二分类可以直接使用如下部分画出roc曲线
h<-test_data
ran_roc<-roc(as.numeric(h$Churn),as.numeric(pred))
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曲线')#绘制ROC曲线
##########交叉验证##########
# 交叉验证
# 交叉验证中添加随机数的训练集、分组、交叉验证的次数
result=rfcv(test_data,test_data$Churn,cv.fold = 10)#折数
# 绘制错误率曲线,观察错误率与使用Markers数量的变化,你可以根据这个选择一个特征数量的个数
with(result,plot(n.var,error.cv,log="x",type="o",lwd=2))
##使用replicate多次交叉验证
result=replicate(5,rfcv(test_data,test_data$Churn),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")