决策树是一种基本的分类和回归方法.决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程.可以认为是if-then 规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布.
优点是可读性强,分类速度快,缺点是泛化能力较弱
特征选择,决策树生成,决策树修剪
根据选择特征的准则不同分为:基于信息增益值的ID3,基于信息增益比的C4.5以及基于基尼系数的CART
决策树的生成对应模型的局部选择,决策树的剪枝对应模型的全局选择
决策树区别与一般线性分类是每次只选择一个最优特征,更符合人类的思维模式
随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。而“Random Forests”是他们的商标。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合Breimans的“Bootstrap aggregating”(bagging)想法和Ho的“random subspace method” 以建造决策树的集合。
解决决策树泛化能力弱的缺点
根据下列算法而建造每棵树:
用N来表示训练用例(样本)的个数,M表示特征数目。
输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。
从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。
每棵树都会完整成长而不会剪枝(Pruning,这有可能在建完一棵正常树状分类器后会被采用)。
两个随机
1. 样本的随机:从样本集中用Bootstrap随机选取n个样本
2. 特征的随机:从所有属性中随机选取K个属性,选择最佳分割属性作为节点建立CART决策树
随机森林的优点有:
高准确度;
处理大量的输入变量;
决定类别时,评估变量重要性;
在建造森林时,可以在内部对于一般化后的误差产生无偏估计;
包含一个好方法可以估计缺失值的,并且,如果有很大一部分缺失值,仍可以维持准确度;
提供一个实验方法,可以去侦测variable interactions;
对于不平衡的分类数据集来说,可以平衡误差;
可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类;
学习过程快速。
library("DT")
insect <- read.table("~/Rmarkdown/Random_Forest/insects",header = T ,sep = "\t") #从硬盘读入数据到对象
datatable(insect)
说明
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
说明
MDSplot(RF1,k=2, insect$Species)
varImpPlot(RF1)
说明
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])
)
}
说明
## 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