Bagging(Bootstrap汇总)是一种集成方法。首先,我们创建随机训练数据集样本(训练数据集的子集)。然后我们为每个样本建立分类器。最后,这些多分类器的结果将结合起来,使用平均或多数投票。Bagging有助于降低方差。
Boosting提供了预测模块的连续学习功能。第一个预测模块从整个数据集上学习,下一个预测模块在前一个的性能基础上在训练数据集上学习。首先对原始数据集进行分类,并给每个观测给予同样的权重。如果第一个学习模块错误预测了类,那么将会赋予错误分类观测较高的权重。这个过程将反复迭代,不断添加分类学习模块,直到达到模型数量或者某个准确度。Boosting有比Bagging更好的预测精准度,但它有时也会过度拟合训练数据。
Stacking工作分为两个阶段。首先,我们使用多个基础分类器来预测分类。然后,一个新的学习模块与它们的预测结果结合起来,来降低泛化误差。
在机器学习中,随机森林是一个包含多个决策树的分类器,并且其输出的类别是由个别树输出的类别的众数而定。 Leo Breiman和Adele Cutler发展出推论出随机森林的算法。而”Random Forests”是他们的商标。这个术语是1995年由贝尔实验室的Tin Kam Ho所提出的随机决策森林(random decision forests)而来的。这个方法则是结合Breimans的”Bootstrap aggregating”想法和Ho的”random subspace method” 以建造决策树的集合。
用N来表示训练用例(样本)的个数,M表示特征数目。
1. 输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。
从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
2. 对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。
3. 每棵树都会完整成长而不会剪枝(Pruning,这有可能在建完一棵正常树状分类器后会被采用)。
随机森林的优点有:
1、随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟
2、对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的。
xgboost 的全称是 eXtreme Gradient Boosting。正如其名,它是 Gradient Boosting Machine 的一个 c++ 实现,作者为正在华盛顿大学研究机器学习的大牛陈天奇。他在研究中深感自己受制于现有库的计算速度和精度,因此在一年前开始着手搭建 xgboost 项目,并在去年夏天逐渐成型。xgboost 最大的特点在于,它能够自动利用 CPU 的多线程进行并行,同时在算法上加以改进提高了精度。它的处女秀是 Kaggle 的希格斯子信号识别竞赛,因为出众的效率与较高的预测准确度在比赛论坛中引起了参赛选手的广泛关注,在 1700 多支队伍的激烈竞争中占有一席之地。随着它在 Kaggle 社区知名度的提高,最近也有队伍借助 xgboost 在比赛中夺得第一。
目标函数:
我们要学习的是那些函数 fi f i ,每个函数都包含树的结构和叶子分数。这比传统的你可以找到捷径的优化问题要难得多。在 tree ensemble 中,参数对应了树的结构,以及每个叶子节点上面的预测分数。 一次性训练所有的树并不容易。 相反,我们使用一个附加的策略:优化好我们已经学习完成的树,然后一次添加一棵新的树。 我们通过 ŷ (t)i y ̂ i ( t ) 来关注步骤 t 的预测值,所以我们有
目标方法:
xgboost与gbdt比较大的不同就是目标函数的定义
这个定义的一个重要优点是它只依赖于 gi 和 hi 。这就是 xgboost 如何支持自定义损失函数。 我们可以使用完全相同的使用 gi 和 hi 作为输入的 solver(求解器)来对每个损失函数进行优
模型复杂度:
这里 w 是树叶上的分数向量,q 是将每个数据点分配给叶子的函数,T 是树叶的数量。
结构分数 (衡量一棵树有多好):
在这个等式中 wj w j 是相互独立的,形式 Gjwj+12(Hj+λ)w2j 是二次的,对于给定的结构 q(x) 的最好的 wj w j ,我们可以得到最好的客观规约:
学习树结构
尽量一次优化树的一个层次。 具体来说,将一片叶子分成两片,并得到分数:
这个公式可以分解为 1) 新左叶上的得分 2) 新右叶上的得分 3) 原始叶子上的得分 4) additional leaf(附加叶子)上的正则化。 我们可以在这里看到一个重要的事实:如果增益小于 γ,我们最好不要添加那个分支。这正是基于树模型的 pruning(剪枝) 技术!
论文算法
xgboost相比传统gbdt有何不同
不能用类似 mini batch 的方式来训练,需要对数据进行无数次的遍历。如果想要速度,就需要把数据都预加载在内存中,但这样数据就会受限于内存的大小;如果想要训练更多的数据,就要使用外存版本的决策树算法。虽然外存算法也有较多优化,SSD 也在普及,但在频繁的 IO 下,速度还是比较慢的。
参考:
https://www.csdn.net/article/2015-10-20/2825965
https://zh.wikipedia.org/wiki/%E9%9A%8F%E6%9C%BA%E6%A3%AE%E6%9E%97
https://cosx.org/2015/03/xgboost/
机器学习算法中 GBDT 和 XGBOOST 的区别有哪些? - wepon的回答 - 知乎
https://www.zhihu.com/question/41354392/answer/98658997
如何看待微软新开源的LightGBM? - 柯国霖的回答 - 知乎
https://www.zhihu.com/question/51644470/answer/130946285