Bagging
Bagging 指的是一种叫做「Bootstrap Aggregating」(自助聚合)的技术。其实质是选取 T 个 bootstrap 样本,在每个样本安装一个分类器,然后并行训练模型。通常,在随机森林中,决策树是并行训练的。然后,将所有分类器的结果平均化,得到一个 bagging 分类器
该过程可以通过以下方式来说明。让我们考虑 3 个分类器,它们生成一个分类结果,该结果可能是对的也可能是错的。如果我们绘制 3 个分类器的结果,会有一些区域代表分类器的结果是错误的。在下图中,这样的区域用红色表示:
这个示例可以很好地起到说明作用,其中有一个分类器的结果是错误的,而另外两个分类器的结果是正确的。通过对分类器进行投票,你可以获得很高的分类准确率。但正如你可能会猜到的那样,bagging 机制有时并不能很好地起作用,这时所有的分类器都会在同一个区域内获得错误的分类结果。
出于这个原因,对 boosting 方法背后的直观想法是:
- 我们需要串行训练模型,而不是并行训练。
- 每个模型需要重点关注之前的分类器表现不佳的地方。
Boosting 简介
AdaBoost:
上述想法可以诠释为:
上图中被放大的点是被加权的样本,样本加权后,在下一次的学习中就会收到更多的关注。
也就是说提升算法对分类错误的样本更为关注,通过改变错误样本所占的权值来改变分类边界,从而一步步提升算法的准确度。
Boosting 方法会随着时间的推移,通过调整误差度量来训练一系列低性能算法,称之为弱学习器。弱学习器指的是那些误差率略低于 50% 的算法,如下图所示:
Adaboost算法的直观理解
融合分类器
自然而然地,下一步就应该是将这些分类器融合成一个符号分类器。根据某个数据点处于分割线的哪一侧,将其分类为 0 或 1。该过程可以通过如下方式实现:
你发现了可能提升分类器性能的方法吗?
通过为每个分类器加权,可以避免赋予不同的分类器相同的重要性。
随机森林
https://blog.csdn.net/qq_34106574/article/details/82016442
随机森林中有许多的分类树。我们要将一个输入样本进行分类,我们需要将输入样本输入到每棵树中进行分类。打个形象的比喻:森林中召开会议,讨论某个动物到底是老鼠还是松鼠,每棵树都要独立地发表自己对这个问题的看法,也就是每棵树都要投票。该动物到底是老鼠还是松鼠,要依据投票情况来确定,获得票数最多的类别就是森林的分类结果。森林中的每棵树都是独立的,99.9%不相关的树做出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消。少数优秀的树的预测结果将会超脱于芸芸“噪音”,做出一个好的预测。将若干个弱分类器的分类结果进行投票选择,从而组成一个强分类器,这就是随机森林bagging的思想(关于bagging的一个有必要提及的问题:bagging的代价是不用单棵决策树来做预测,具体哪个变量起到重要作用变得未知,所以bagging改进了预测准确率但损失了解释性。
有了树我们就可以分类了,但是森林中的每棵树是怎么生成的呢?
每棵树的按照如下规则生成:
1)如果训练集大小为N,对于每棵树而言,随机且有放回地从训练集中的抽取N个训练样本(这种采样方式称为bootstrap sample方法),作为该树的训练集;
从这里我们可以知道:每棵树的训练集都是不同的,而且里面包含重复的训练样本(理解这点很重要)。
为什么要随机抽样训练集?(add @2016.05.28)
如果不进行随机抽样,每棵树的训练集都一样,那么最终训练出的树分类结果也是完全一样的,这样的话完全没有bagging的必要;
为什么要有放回地抽样?*(add @2016.05.28)*
我理解的是这样的:如果不是有放回的抽样,那么每棵树的训练样本都是不同的,都是没有交集的,这样每棵树都是"有偏的",都是绝对"片面的"(当然这样说可能不对),也就是说每棵树训练出来都是有很大的差异的;而随机森林最后分类取决于多棵树(弱分类器)的投票表决,这种表决应该是"求同",因此使用完全不同的训练集来训练每棵树这样对最终分类结果是没有帮助的,这样无异于是"盲人摸象"。
2)如果每个样本的特征维度为M,指定一个常数m<
3)每棵树都尽最大程度的生长,并且没有剪枝过程。
一开始我们提到的随机森林中的“随机”就是指的这里的两个随机性。两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。
随机森林分类效果(错误率)与两个因素有关:
- 森林中任意两棵树的相关性:相关性越大,错误率越大;
- 森林中每棵树的分类能力:每棵树的分类能力越强,整个森林的错误率越低。
减小特征选择个数m,树的相关性和分类能力也会相应的降低;增大m,两者也会随之增大。所以关键问题是如何选择最优的m(或者是范围),这也是随机森林唯一的一个参数。
5 袋外错误率(oob error)
上面我们提到,构建随机森林的关键问题就是如何选择最优的m,要解决这个问题主要依据计算袋外错误率oob error(out-of-bag error)。
随机森林有一个重要的优点就是,没有必要对它进行交叉验证或者用一个独立的测试集来获得误差的一个无偏估计。它可以在内部进行评估,也就是说在生成的过程中就可以对误差建立一个无偏估计。
我们知道,在构建每棵树时,我们对训练集使用了不同的bootstrap sample(随机且有放回地抽取)。所以对于每棵树而言(假设对于第k棵树),大约有1/3的训练实例没有参与第k棵树的生成,它们称为第k棵树的oob样本。
而这样的采样特点就允许我们进行oob估计,它的计算方式如下:
(note:以样本为单位)
1)对每个样本,计算它作为oob样本的树对它的分类情况(约1/3的树);
2)然后以简单多数投票作为该样本的分类结果;
3)最后用误分个数占样本总数的比率作为随机森林的oob误分率。
oob误分率是随机森林泛化误差的一个无偏估计,它的结果近似于需要大量计算的k折交叉验证。
梯度提升迭代决策树GBDT
GBDT也是Boosting算法的一种,但是和AdaBoost算法不同;区别如下:
AdaBoost算法是利用前一轮的弱学习器的误差来更新样本权重值,然后一轮一轮
的迭代;GBDT也是迭代,但是GBDT要求弱学习器必须是回归CART模型,而且
GBDT在模型训练的时候,是要求模型预测的样本损失尽可能的小。
• 备注:所有GBDT算法中,底层都是回归树。
GBDT直观理解
GBDT的核心就在于:每一棵树学的是之前所有树结论和的残差,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学习。