决策树模型中最为流行的是C4.5算法, 该类算法70年代末,J Ross Quinlan提出ID3算法,此算法的目的在于减少树的深度。但是忽略了叶子数目的研究。1993年,Quinlan本人以ID3算法为基础研究出C4.5/C5.0算法,C4.5算法在ID3算法的基础上进行了改进,对于预测变量的缺值处理、剪枝技术、派生规则等方面作了较大的改进,既适合于分类问题,又适合于回归问题。在R包中,有如下的算法包可完成C4.5 分类计算,如下,分别以鸢尾花数据集为例进行验证
- partykit::ctree
- RWeka::J48
- C50:C5.0
- 总结及对比分析
partykit::ctree
- 所需安装的R包如下:
install.packages("RWeka") install.packages("party") install.packages("partykit")
- 数据集iris包含五个指标萼片长度、萼片宽度、花瓣长度、花瓣宽度、三种花类型, 建立模型
set.seed(1234) #从iris数据集中随机抽70%定义为训练数据集,30%为测试数据集 ind <- sample(2, nrow(iris), replace=TRUE, prob=c(0.7, 0.3)) trainData <- iris[ind==1,] testData <- iris[ind==2,] library(party) #建立决策树模型预测花的种类 myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width iris_ctree <- ctree(myFormula, data=trainData) # 查看预测的结果 table(predict(iris_ctree), trainData$Species)
-
结果如下:
> table(predict(iris_ctree), trainData$Species) setosa versicolor virginica setosa 40 0 0 versicolor 0 37 3 virginica 0 1 31
-
对照数据结构看决策图
> #输出决策树图 > head(trainData,10) Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1 5.1 3.5 1.4 0.2 setosa 2 4.9 3.0 1.4 0.2 setosa 3 4.7 3.2 1.3 0.2 setosa 4 4.6 3.1 1.5 0.2 setosa 6 5.4 3.9 1.7 0.4 setosa 7 4.6 3.4 1.4 0.3 setosa 8 5.0 3.4 1.5 0.2 setosa 9 4.4 2.9 1.4 0.2 setosa 10 4.9 3.1 1.5 0.1 setosa 11 5.4 3.7 1.5 0.2 setosa > plot(iris_ctree)
-
输出结果图如下:
- 对测试集进行预测
> testPred <- predict(iris_ctree, newdata = testData) > table(testPred, testData$Species) testPred setosa versicolor virginica setosa 10 0 0 versicolor 0 12 2 virginica 0 0 14
-
在测试集上结果看模型有较好的泛化能力
RWeka::J48
- RWeka包在上例已经安装,测试及训练数据见上例
library(RWeka) library(party) #训练与测试样本见上例 m1<-J48(Species~.,data=trainData) table(trainData$Species,predict(m1)) plot(m1)
- m1结果如下:
- 预测结果
> testPred <- predict(m1, newdata = testData) > table(testPred, testData$Species) testPred setosa versicolor virginica setosa 10 0 0 versicolor 0 12 1 virginica 0 0 15
-
从结果上看,貌似比ctree训练算法稍强点, 需大的数据来深入对比
C50:C5.0
- C5.0 是Ross Quinlan 1998年提出来的,对C4.5做了很多改进,目前他是作为商业机密在售卖。该算法引入了Boosting的算法框架,比前面提到的算法性能更快,对内存的使用更有效,决策树更小等等。更详细的请访问他的个人主页查阅文章http://www.rulequest.com/see5-unix.html和http://rulequest.com/download.html%20
- 用法:C5.0(formula, data, weights, subset, na.action = na.pass, ...)
> library(C50) > #ls("package:C50") > #训练与测试样本见上例 > m_c50 <- C5.0(Species ~., data = trainData) > C5imp(m_c50) Overall Petal.Length 100.00 Petal.Width 64.29 Sepal.Length 0.00 Sepal.Width 0.00
-
plot(m_c50) 输出图结果如下:
- 从图上可发现建树差异,预测结果正确率:
> c50_pred <- predict(m_c50,newdata = testData) > table(c50_pred, testData$Species) c50_pred setosa versicolor virginica setosa 10 0 0 versicolor 0 12 2 virginica 0 0 14
总结及对比分析
- 上几节仅是对不同包的算法进行了介绍,数据量太小,比较不出在资源占用、正确率方面的差异,下面以较大数据的情况,对这三个包的结果进行对比分析,正确率如下:
- 其中C50算法中提供的函数,最重要的参数如下:
> myFormula <- Type ~. > m.C50 <- C5.0(myFormula, data = mytrain) > C5imp(m.C50) Overall DV 100.00 LV 66.07 LT 51.07
- 对比资源占用如下图:
- 对比正确率