1 决策树

1.1 什么是决策树

决策树是一种基本的分类和回归方法.决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程.可以认为是if-then 规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布.

1.2 优缺点

优点是可读性强,分类速度快,缺点是泛化能力较弱

1.3 算法步骤

特征选择,决策树生成,决策树修剪

1.4 常用算法

根据选择特征的准则不同分为:基于信息增益值的ID3,基于信息增益比的C4.5以及基于基尼系数的CART

1.5 讨论

决策树的生成对应模型的局部选择,决策树的剪枝对应模型的全局选择

决策树区别与一般线性分类是每次只选择一个最优特征,更符合人类的思维模式

2 随机森林

2.1 什么是随机森林

随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。而“Random Forests”是他们的商标。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合Breimans的“Bootstrap aggregating”(bagging)想法和Ho的“random subspace method” 以建造决策树的集合。

解决决策树泛化能力弱的缺点

2.2 学习算法

根据下列算法而建造每棵树:

  1. 用N来表示训练用例(样本)的个数,M表示特征数目。

  2. 输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。

  3. 从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。

  4. 对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。

  5. 每棵树都会完整成长而不会剪枝(Pruning,这有可能在建完一棵正常树状分类器后会被采用)。

两个随机

1. 样本的随机:从样本集中用Bootstrap随机选取n个样本

2. 特征的随机:从所有属性中随机选取K个属性,选择最佳分割属性作为节点建立CART决策树

2.3 优点

随机森林的优点有:

  • 高准确度;

  • 处理大量的输入变量;

  • 决定类别时,评估变量重要性;

  • 在建造森林时,可以在内部对于一般化后的误差产生无偏估计;

  • 包含一个好方法可以估计缺失值的,并且,如果有很大一部分缺失值,仍可以维持准确度;

  • 提供一个实验方法,可以去侦测variable interactions;

  • 对于不平衡的分类数据集来说,可以平衡误差;

  • 可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类;

  • 学习过程快速。

2.4 R语言实践

2.4.1 数据导入

library("DT")
insect <- read.table("~/Rmarkdown/Random_Forest/insects",header = T ,sep = "\t") #从硬盘读入数据到对象
datatable(insect)

说明

  • insect是一个包含5个变量20个记录的数据表。insect[,c(‘L1’,‘L2’,‘L3’,‘L4’)]表示昆虫的量度,是一个4乘以20的矩阵;
  • insect[,‘Species’]表示昆虫的物种类别,是20个物种名组成的一个向量。

2.4.2 判别

library(randomForest)  #调用随机森林程序包
## randomForest 4.6-12
## Type rfNews() to see new features/changes/bug fixes.
RF1 <- randomForest(insect[,c('L1','L2','L3','L4')], insect[,'Species'], importance=TRUE, ntree=10000 ,proximity=T) #运行随机森林模型
## Warning in randomForest.default(insect[, c("L1", "L2", "L3", "L4")],
## insect[, : '.Random.seed' is not an integer vector but of type 'NULL', so
## ignored
#insect是一个包含5个变量20个记录的数据表。insect[,c('L1','L2','L3','L4')]表示昆虫的量度,是一个4乘以20的矩阵;
#insect[,'Species']表示昆虫的物种类别,是20个物种名组成的一个向量。
RF1
## 
## Call:
##  randomForest(x = insect[, c("L1", "L2", "L3", "L4")], y = insect[,      "Species"], ntree = 10000, importance = TRUE, proximity = T) 
##                Type of random forest: classification
##                      Number of trees: 10000
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 5%
## Confusion matrix:
##   A B C class.error
## A 6 1 0   0.1428571
## B 0 6 0   0.0000000
## C 0 0 7   0.0000000

说明

  • 显示模型对A的判别错误率为28.6%,对B和C的判别错误率为0。
  • 每行表示实际的类别,每列表示随机森林判定的类别。

2.4.3 相关系数绘图

MDSplot(RF1,k=2, insect$Species)

2.4.4 变量重要性评估

varImpPlot(RF1)

说明

  • MeanDecreaseAccuracy衡量把一个变量的取值变为随机数,随机森林预测准确性的降低程度。该值越大表示该变量的重要性越大。
  • MeanDecreaseGini通过基尼(Gini)指数计算每个变量对分类树每个节点上观测值的异质性的影响,从而比较变量的重要性。该值越大表示该变量的重要性越大。

2.4.5 变量变化评估

imp <- importance(RF1)
impvar <- rownames(imp)[order(imp[, 1], decreasing=TRUE)]
op <- par(mfrow=c(2, 2))
for (i in seq_along(impvar)) {
  a<-partialPlot(RF1, insect , impvar[i], xlab=impvar[i],
              main=paste("Partial Dependence on", impvar[i])
              )
}

说明

  • 各个变量变化趋势对于随机森林的影响

3 参考

李航-统计学习方法第五章

用随机森林模型替代常用的回归和分类模型

4 sessionInfo()

## R version 3.3.3 (2017-03-06)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 14.04.5 LTS
## 
## locale:
##  [1] LC_CTYPE=zh_CN.UTF-8       LC_NUMERIC=C              
##  [3] LC_TIME=zh_CN.UTF-8        LC_COLLATE=zh_CN.UTF-8    
##  [5] LC_MONETARY=zh_CN.UTF-8    LC_MESSAGES=zh_CN.UTF-8   
##  [7] LC_PAPER=zh_CN.UTF-8       LC_NAME=C                 
##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
## [11] LC_MEASUREMENT=zh_CN.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] randomForest_4.6-12 DT_0.2             
## 
## loaded via a namespace (and not attached):
##  [1] Rcpp_0.12.12         digest_0.6.12        rprojroot_1.2       
##  [4] jsonlite_1.5         backports_1.0.5      magrittr_1.5        
##  [7] evaluate_0.10.1      stringi_1.1.5        rmarkdown_1.6.0.9001
## [10] RColorBrewer_1.1-2   tools_3.3.3          stringr_1.2.0       
## [13] htmlwidgets_0.9      yaml_2.1.14          htmltools_0.3.6     
## [16] knitr_1.16