引子:
xgboost,lightgbm和catboost都是非常好用的工具,它们将多个弱分类器集成为一个强分类器。在此对他们使用的框架背景和不同之处做简单的总结。
xgboost vs lightgbm vs catboost
背景:boosting,CART & GBDT
单纯讲定义实在是有些晦涩难懂,所以下面基本用简单的例子来描述。(这部分不讲公式,只讲简单原理)
boosting
boosting是集成学习的其中一种框架。定义说boosting通过组合弱学习器来产生强学习器,通俗来说,就是三个臭皮匠,顶个诸葛亮。boosting的基本思想,是先赋予每个训练样本相同的概率,然后进行多次迭代,每次迭代后,对分类错误的样本加重weight,这样在下一次的迭代中就会更加关注这个样本。
原理示意图如下(源自刘建平)
boosting最流行的两种算法是adaboost算法和GBDT。
CART
CART(全称为Classification And Regression Tree),即分类回归树算法。CART算法构成二叉树,即使一个特征有多个取值,也只是将数据分为两部分。其建树过程主要分为两步,一是将样本递归划分进行建树,而是用验证数据进行剪枝。
- 怎样才能判断样本的划分是好是坏?有三类指数可以衡量,分别是gini、举一个简单的例子,比如预测病人的患癌概率,提供的训练集中包含年龄、性别等多个特征,每个特征有大量的离散值,以及预测的target,即病人是否患癌。
- 最开始,可以按年龄是否大于60岁,性别是男是女,骨钙质密度是否大于10(这里纯瞎胡诌的)等划分,这样划分后,总体内包含了很多类别,比如年龄大于60、骨钙质密度大于10是有3个男性和5个女性,年龄大于60、骨钙质面密度小于10有2个男性和4个女性,这两个总体包含的类别杂乱程度不一样(可以用熵来理解),这个杂乱程度用GINI指数(基尼指数)来表示。如果我们使用性别是否为男女来划分的话,可以得到一个GINI增益,而gini增益最小的划分就是最好的划分。
- 如果上面按照性别划分良好,在性别下再接着进行划分就可以产生分类回归树,什么时候停止分类呢?需要计算Xsquare,当计算出来的值很小时,节点停止分裂。
- 另外,划分太细的话,会导致过拟合的问题。所以需要进行剪枝(此处类似于线性回归的正则化)。那如何判断是否达到剪枝条件呢?上面的Xsquare算是一种前剪枝,它直接判断了这个节点不进行分裂,而后剪枝是先生成原始的决策树,然后生成各种剪枝效果的决策树,接着用交叉验证来检验剪枝后的预测能力,选择预测能力最好的作为最终的CART树。(简而言之两步:生成子树+交叉验证)
GBDT
- 全称为gradient boost decision tree,即提升决策树。GBDT基于boosting的原理,使用CART树。
- 比如现在预测二手车的价格,训练集中的真实价格为2k,而基于训练集的第一个模型的预测价格为1.9k,这时预测价格和真实价格之间的差值为100,即残差为100。
- 在此基础上,再次根据当前的训练集构建第二个模型,这时模型不再预测车的价格,而是对刚刚第一个模型的残差进行预测。在规定的迭代次数内,以此类推不断的新建模型,降低残差,使得最终的模型的精度达到最高。
- 拟合思路这里不展开细讲,有时间再看刘建平的文章。
三者的简介
XGBoost
一. 简介:
xgboost基于gradient boost decision tree(GBDT),可以解决监督式学习的问题。
二. 预测原理:
xgboost从零建立模型后,每次会在原有模型的基础上新增函数(即增加树)以修复上一棵树(即上一个函数)的不足,通过贪心算法,在树的建构过程中优化并提升目标函数。当面临大的训练集时,xgboost使用近似贪心算法、并行学习和加权分位数草图(应对数据缺失的情况)。如果训练集小的话,就使用贪心算法。
三. 简单版文字表达式:
初始预测值 + 学习率(ε) * 树(λ和γ) --> 新的预测值 + 学习率 * 树 --&