初始决策树与随机森林

读书读人读事 2018-03-11

本文将介绍如何使用party包,rpart包及randomForest包来建立预测模型。

首先,我们将使用party包来建立决策树,并用决策树用于分类。其次,利用randomForest包来训练随机森林模型

最后学习使用rpart包来建立决策树。

所使用的数据集为R中自带的iris数据集

使用party包来建立决策树

  • 首先查看数据集结构
初始决策树与随机森林
  • 划分训练集和测试集
#划分训练集和测试集
 set.seed(1234)
 nrow(iris) #共150行
 ind <- sample(x = 1:2,size = nrow(iris),replace = T,prob = c(0.7,0.3)) #设随机数1或者2
 train_data <- iris[ind==1,]
 test_data <- iris[ind==2,]
  • 建立决策树

1#建立决策树2 library(party) #加载library包3 iris_ctree <- ctree(formula = Species~.,data = train_data) #建立决策树,Species(种类为目标变量),其他为输入变量45 table(predict(iris_ctree),train_data$Species) #建立频数表检查预测结果

初始决策树与随机森林

可以看到,预测结果中,versicolor有一个预测错误,virginica有三个预测错误,预测结果可以接受。

  • 输出规则和绘制图表
    print(iris_ctree)
    plot(iris_ctree)  #绘制决策树
    plot(iris_ctree,type='simple') #简化形式
    初始决策树与随机森林初始决策树与随机森林
初始决策树与随机森林
  • 使用测试集对用训练集构建的决策树进行测试
iris_test <- predict(iris_ctree,newdata=test_data) #以iris_ctree为模型,代入需要预测的数据test_data,即学习集,进行预测
table(iris_test,test_data$Species)                 #输出列联表查看预测结果
初始决策树与随机森林

仅有virginica中有两个错误归类为versicolor,预测模型准确率达到94.7%。

  • 使用randomForest包训练随机森林

#使用randomForest包训练随机森林
 library(randomForest)
 rf <- randomForest(Species~. ,data = train_data,ntree=10,proximity=T)#产生随机森林,ntree:决策树数量
 table(predict(rf),train_data$Species) #查看频数表
初始决策树与随机森林

print(rf) #查看规则

初始决策树与随机森林

plot(rf)#根据随机森林生成的不同的树绘制误差率

初始决策树与随机森林

importance(rf) #查看每个变量的重要性

初始决策树与随机森林

varImpPlot(rf) #通过图形查看每个变量的重要性

初始决策树与随机森林
  • 使用测试集测试模型

#使用测试集测试训练模型
iris_ran_PRED <-predict(object = rf,newdata = test_data)
table(iris_ran_PRED,test_data$Species)
初始决策树与随机森林
  • 使用rpart包构建数据集

  • 载入数据集

调用TH.data包中的Bodyfat数据集

初始决策树与随机森林
  • 划分数据集

#划分数据集
 set.seed(1234)
 ind <- sample(x = 1:2,size=nrow(bodyfat),replace = T,prob = c(0.7,0.3))
 train_data <- bodyfat[ind==1,]
 test_data <- bodyfat[ind==2,]
  • 构建决策树

#构建决策树
 library(rpart)   #加载包使用rpart,prune等函数
 #查看体脂和年龄、腰围、臀围、肘宽、膝宽的关系
 bodyfat_rpart  <- rpart(formula = DEXfat~age+waistcirc+hipcirc+elbowbreadth+kneebreadth,
                         data = train_data,
                         control=rpart.control(minsplit = 10))
 print(bodyfat_rpart) #输出规则
 plot(bodyfat_rpart) #绘制决策树
 text(bodyfat_rpart,use.n = T) #添加标签
初始决策树与随机森林
  • 修剪决策树

#修剪决策树
 opt <- which.min(bodyfat_rpart$cptable[,'xerror']) #选择具有最小误差的决策树,第七行的xerror为最小
 cp <- bodyfat_rpart$cptablep[opt,'CP'] #选择第七行的'CP'值
 bodyfat_prune <- prune(bodyfat_rpart,cp=cp) #修剪树
 print(bodyfat_prune)
 <strong>plot(bodyfat_prune)</strong>   #绘制修剪后的决策树
 text(bodyfat_prune,use.n = T)  #添加标签
 DEXfat_pred <- predict(bodyfat_prune,newdata = test_data)  #预测
 xlim <- range(bodyfat$DEXfat)  #X坐标的区间为体脂的区间
 <strong>plot(DEXfat_pred~DEXfat,data=test_data,xlab='Observed',ylab='Predicted',ylim=xlim,xlim=xlim)</strong> #绘制图形查看观测值和预测值的差异
 abline(a=0,b=1)  #加入对角线进行对比,y=a+bx
初始决策树与随机森林

上图具有最小预测误差的决策树。

初始决策树与随机森林

可观察到测试集中,观测值和预测值的差异,从而判断是否为一个好的预测模型。可看到大部分点都在对角线上或附近,

约5个点差异较大,该决策树模型的准确率约为1-(5/15)=66.7%

: 通过这个接口,可以在R中使用Weka的所有算法

相关推荐