决策树和随机森林

什么是决策树?

这次不搬运百科定义了,用通俗的话概括一下,就是把数据按照不同属性(由宽泛到精细)进行归类而构造出来的一颗“树”。西瓜书给出了一个基本算法流程,参考下图。

现在你应该对决策树有一个大概的印象了,这里最重要的部分是什么呢?其实是算法第8行,如何寻找最优的划分属性。现在举一个例子,你想约妹子出去玩,但是不确定什么情况下邀请比较好,然后你观察了一阵子,发现有四个因素值得考虑(天气,温度,湿度,是否刮风),甚至把这些天偷偷观察到的数据记录了下来,如下图所示

属性选择

好家伙,四个印象因素,怎么知道哪些是重要的呢?下面我们补充几个常用的选择属性的依据。

1. 信息熵(Entropy)

他衡量了事件的不确定性,如果熵越大则该事件不确定性越大,如果熵很小,那么它就很容易被预测。例如正常硬币(正反面概率0.5)的熵为1,而异常硬币(正面0.9反面0.1)熵为0.46,符合常识前者更难预测,也就是不确定性大。

\(H(x) = -\sum_{i=1}^{n} P(i) log_2 P(i)\)

2.信息增益(Information Gain)

信息增益计算的是某个属性划分前后熵的变化。\(IG(R_A|R) = H(R) - \sum_{i=1}^{m} P(i) H(i) = H(R) - Mean Info(x_1,...,x_m)\),后面减去的部分其实是带权重的平均熵。我们看一个栗子演示一下具体计算。假设以天气作为划分属性,

划分前:\(H(R) = -(9/14)log_2(9/14) -(5/14)log_2(5/14) = 0.94\)
划分后: \(H(rainy) = -(3/5)log_2(3/5) - (2/5)log_2(2/5) = 0.97; H(overcast) = 0; H(sunny) = 0.971\)
计算增益:\(IG(R_A|R) = H(R) - ((5/14)*H(rainy) + (4/14)*H(overcast) + (5/14)*H(sunny)) = 0.94 - 0.693 = 0.247\)

同样的我们也可以计算出温度,湿度以及刮风的信息增益,进行对比选择增益更大的属性。另外需要注意的是,信息增益对于下级分支较多的属性有更多的青睐,这里刮风(只有yes和no)可能就不会那么好了,这种标准可能导致overfitting。

3.增益率(Gain Ratio)

增益率就是解决信息增益可能导致过拟合的一个方法。数学表达如下,其中SI为split information。

\(GR(R_A|R) = \frac{IG(R_A|R)}{SI(R_A|R)} = \frac{IG(R_A|R)}{H(R_A)} = \frac{H(R) - \sum_{i=1}^{m} P(x_i)H(x_i)}{-\sum_{i=1}^{m} P(x_i)log_2 P(x_i)}\)

这里我们就不具体计算了,把结果贴在下面,

你看刮风属性一下子觉得自己又可以了。

4.基尼系数(Gini)

这是CART(classification and regression tree)决策树使用的一种标准,基尼系数反映了数据中随机两个样本为不同label的概率,系数越小则数据集纯度越高,最优划分也就是要选择基尼系数最小的属性。

\(Gini(D) = \sum_{k\not=k'} P(k)P(k')\)

剪枝处理

在完成前面的属性选择后,针对模型分类的表现如果出现过拟合的现象,可以采用剪枝处理(pruning)。剪枝也分为预剪枝和后剪枝。

样本有缺失值怎么办?

西瓜书中给出了一种方法,修改信息增益,\(IG(D,a) = \rho * IG(D',a))\),其中\(\rho\)表示无缺省值样本所占的比例,D’表示无缺省值样本子集。

随机森林

随机森林(Random Forest,RF)指的是利用多棵决策树对样本进行训练并预测的一种分类器。随机森林属于集成学习,它通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。

随机森林既然是有许多决策树构成,那么如何构造这些树呢? 作者AAA小肥杨总结的很好,我觉得搬运一下(懒)。

每棵树的生成规则:

1)如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;

从这里我们可以知道:每棵树的训练集都是不同的,而且里面包含重复的训练样本(理解这点很重要)。

为什么要随机抽样训练集?

如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样的话完全没有bagging的必要;

为什么要有放回地抽样?

如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。

2)如果每个样本的特征维度为M,指定一个常数m<<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选择最优的;(西瓜书似乎提到过这种)

3)每棵树都尽最大程度的生长,并且没有剪枝过程。

那么有了树,最后怎么做分类?

常用的方法有:

  1. 投票法majority vote

  2. 平均法average

  3. 加权平均weighted avg

OOB

对于随机森林,我们不需要使用cross-validation来选择m,而是用OOB(out-of-bag)sampling方法。过程如下,

1)对每个样本(Xi,Gi),训练RF分类器

2)对于每个bootstrap树,使用不属于他的样本来做分类,得到结果G’。

3)最后用误分个数占样本总数的比率作为随机森林的oob误分率,\((1/n)\sum_{i=1}{n}I(G_i\not=G'_i)\)

posted @ 2021-03-24 02:14  MrDoghead  阅读(114)  评论(0编辑  收藏  举报