作者:[菜菜TsaiTsai]
集成算法概述
继承学习不是一个单独的机器学习算法,而是通过在数据上构建多个模型,继承所有模型的建模结果。
集成算法的目标是:集成算法会考虑多个评估器的建模结果,汇总之后得到一个综合的结果,以此来获取比单个模型更好的回归或分类表现
多个模型集成成为的模型叫做集成评估器,组成集成评估器的每个模型都叫做基评估器。通常来说,有三类集成算法:袋装法(Bagging)、提升法(Boosting)和stacking
袋装法的核心思想是构建多个互相独立的评估器,然后对其预测进行平均或多数表决原则来决定继承评估器的结果。袋装法的代表模型就是随机森林 提升法中,基评估器是相关的,是按顺序一一构建的。其核心思想是结合若评估器的力量一次次对难以评估的样本进行预测,从而构成一个强评估器。提升法的代表模型有Adaboost和梯度提升树
随机森林算法流程如图所示
Adaboost算法如图所示
随机森林概述
下面是随机森林的构造过程:
- 假如有N个样本,则有放回的随机选择N个样本(每次随机选择一个样本,然后返回继续选择)。这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。
- 当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
- 决策树形成过程中每个节点都要按照步骤2来分裂(很容易理解,如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
- 按照步骤1~3建立大量的决策树,这样就构成了随机森林了。
作者:许铁-巡洋舰科技 链接:说说随机森林 - 知乎 (zhihu.com)
实际上我们可以通过参数进行剪枝
这其中提到的有放回的随机选择N个样本
就是袋装法。
我们称抽样得到的n个样本的集合为自助集。由于我们每次是随机采样,因此每次的自助集和原式数据集不同,和其他的采样集也是不同的。这样我们就可以获得互不相同的自助集,用这些自助集来训练我们的基分类器,得到的基分类器也就是各不相同的
有放回的抽样也会有自己的问题,由于是有放回,一些样本可能在同一个自助集中出现多次,有一些可能被忽略,一般来说,自助集大约平均会包含63%的原始数据。这是因为每个样本被抽到某个自助集中的概率为 $$ 1-\left(1- \frac{1}{n}\right)^{n} $$ 当$n$足够大时,这个概率收敛于$\begin{aligned} 1- \frac{1}{e}\end{aligned}$,约等于0.632,。因此,会有约37%的训练数据被浪费掉,没有参数建模,这些数据被称为袋外数据(out of bag data,简写为oob)。 袋外数据可以被用来作为集成算法的测试集,这样就不需要划分测试集与训练集了。当n和n_estimators不够大时,很可能就没有数据落在袋外,也就无法使用oob数据来测试模型了
关于我们为什么选择随机森林 上面说到随机森林的本质是一种装袋集成算法(bagging),装袋集成算法是对基评估器的预测结果进行平均或用多数表决原则来决定集成评估器的结果。 在之后的红酒例子中,我们建立了25棵树,对任何一个样本而言,平均或多数表决原则下,当且仅当有13棵及以上的树判断错误的时候,随机森林才会判断错误。单独一棵决策树对红酒数据集的分类准确率在0.85上下浮动,假设一棵树判断错误的可能性为0.2$\epsilon$,那20棵树以上都判断错误的可能性是: $$ e=\sum\limits_{i=13}^{25}C_{25}^{i}\epsilon ^{i}(1-\epsilon )^{25-i}=0.000369 $$ 其中$i$是判断错误的决策树数量,$\epsilon$是判断错误的概率
from scipy.special import comb np.array([comb(25,i)*(0.2**i)*((1-0.2)**(25-i)) for i in range(13,26)]).sum() --- 0.00036904803455582827
可见错误的几率非常小,也就让随机森林在红酒数据集上的表现远远好于单棵决策树
随机森林有很多的优点:
- 在数据集上表现良好,两个随机性的引入,使得随机森林不容易陷入过拟合
- 在当前的很多数据集上,相对其他算法有着很大的优势,两个随机性的引入,使得随机森林具有很好的抗噪声能力
- 它能够处理很高维度(feature很多)的数据,并且不用做特征选择,对数据集的适应能力强:既能处理离散型数据,也能处理连续型数据,数据集无需规范化