读书读人读事 2018-03-11
本文将介绍如何使用party包,rpart包及randomForest包来建立预测模型。
首先,我们将使用party包来建立决策树,并用决策树用于分类。其次,利用randomForest包来训练随机森林模型。
最后学习使用rpart包来建立决策树。
所使用的数据集为R中自带的iris数据集
#划分训练集和测试集 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包训练随机森林 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)
调用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的所有算法