应用机器学习(七):随机森林

来源:互联网 发布:苏州淘宝美工招聘 编辑:程序博客网 时间:2024/06/05 21:03

随机森林

随机森林( Random forest ),是一种用于分类、回归等任务的集成学习方法。对于分类任务,它在训练时构建多棵决策树,输出这些树的分类结果的众数( mode ),即,将大多数树的分类结果作为最终的结果。这样,随机森林修正了单棵决策树过度拟合训练集的倾向。

随机森林算法

  • 准备工作:决策树学习

对于详细的决策树学习理论,请参考 应用机器学习 | 第七讲

在构建的决策树里,长的比较”深”的树,倾向过拟合训练集,即,它有较低的偏差,但较高的方差。随机森林平衡了多棵决策树,目的是减小预测方差,但付出的代价是,增加了偏差且损失了部分模型可解释性。尽管如此,随机森林仍然很大程度上改善了最终模型的预测表现。

  • Tree bagging

给定一个训练集 X=(x1,x2,,xn), 响应变量(类标签) Y=(y1,y2,,yn).
所谓装袋( bagging ),指的是从训练集中有放回地抽取一个随机样本,在这个样本上拟合树。假设重复装袋 B 次,整个训练过程为:

b=1,2,,B:

  1. 分别从 X,Y 有放回地抽取训练实例 Xb,Yb;

  2. Xb,Yb 上训练一棵决策树 fb.

经过 B 次训练后,对于一个未知类的新实例 x, 将各棵树的预测结果做平衡,得到最终的预测:

(1). 平均数原则

f^=1Bb=1Bfb(x)

(2). 大多数原则

取大多数决策树的预测结果作为最终的结果。

以上训练随机森林的过程,称为 Bootstrapping procedure, 它在没有增减偏差( bias )的情况下,降低了模型的预测方差( variance )。当单棵决策树的预测对训练集的噪声数据敏感时,只要保证多棵树之间不相关,那么,它们的平均预测可以大大降低这种敏感性。仅在一个训练集上构建多棵决策树,会导致强相关的树,而 Bootstrapping 抽样是一种降低树之间相关性的有效方法。

在这里,样本数 B 是一个自由参数。通常,构建从几百到几千棵树,也就是说,B 从几百取到几千,这依赖训练集的大小和本质。

  • 从特征装袋到随机森林

特征装袋( feature bagging ), 指的是在决策树学习过程中,每次随机选择一个特征子集,在这个子集上构建决策树。而普通的装袋法,每棵决策树是在全部特征上拆分得到的。特征装袋的原因是,如果存在某个或多个特征是响应变量(类变量)强预测变量,那么,这些变量就可能在 B 棵树的多棵的构建过程中被选择作为拆分变量,这导致树的相关性。通常,对于一个分类问题,假设有 p 个特征,那么,在每次拆分时,随机选择的子特征数为 [p]. 该算法的流程如图1所示:


这里写图片描述

随机森林的性质

  • 袋外误差

袋外误差( Out-of-bag (OOB) error ),也称袋外估计( out-of-bag estimate ),是测量随机森林预测误差的一种方法。

假设有数据集 D={zi=(Xi,Yi),i=1,2,,n}, 对于每一个训练实例 zi, 将它置于”袋外”,即,由不包括 zibootstrap 样本构建决策树,预测 zi 的响应变量值(类标签)。OOB 是对每个 zi 的平均预测误差。

  • 变量重要性

在回归、分类问题里,随机森林可以排秩变量的重要程度。
使用数据集 D 拟合一个随机森林。每一个实例的 OOB 被记录且平均在森林上。为了测量第 j 个特征训练后的重要性,在训练集置换该特征的值,然后计算置换的数据集的 OOB. 定义第 j 个特征的重要分数为,置换前后的 OOB 差关于所有树的平均值。重要分数越大,说明该特征越重要。

R 执行代码

下面是随机森林和装袋集成算法的一段 R 执行代码,需要安装 RpartyTH.data.

set.seed(290875)    ### honest (i.e., out-of-bag) cross-classification of    ### true vs. predicted classes    data("mammoexp", package = "TH.data")    table(mammoexp$ME, predict(cforest(ME ~ ., data = mammoexp,                                control = cforest_unbiased(ntree = 50)),                               OOB = TRUE))    ### fit forest to censored response    if (require("TH.data") && require("survival")) {        data("GBSG2", package = "TH.data")        bst <- cforest(Surv(time, cens) ~ ., data = GBSG2,                    control = cforest_unbiased(ntree = 50))        ### estimate conditional Kaplan-Meier curves        treeresponse(bst, newdata = GBSG2[1:2,], OOB = TRUE)        ### if you can't resist to look at individual trees ...        party:::prettytree(bst@ensemble[[1]], names(bst@data@get("input")))    }    ### proximity, see ?randomForest    iris.cf <- cforest(Species ~ ., data = iris,                        control = cforest_unbiased(mtry = 2))    iris.mds <- cmdscale(1 - proximity(iris.cf), eig = TRUE)    op <- par(pty="s")    pairs(cbind(iris[,1:4], iris.mds$points), cex = 0.6, gap = 0,           col = c("red", "green", "blue")[as.numeric(iris$Species)],          main = "Iris Data: Predictors and MDS of Proximity Based on cforest")    par(op)

阅读更多精彩内容,请关注微信公众号 “统计学习与大数据”!