集成学习--XGBoost
对于XGBoost算法原理看陈天奇的PPT和一份算法实战指导文档就够了
目录:
一、XGBoost算法原理:
1,CART树
2,XGBoost算法与GBDT
3,一个实例
4,XGB的优缺点
二、RF,GBDT与XGB比较
1),GBDT与XGB
2),GBDT与RF区别
3),RF的优缺点
三、XGBoost算法的python实现
XGB相关知识模块:算法原理,损失函数,分裂结点算法,正则化,对缺失值处理。
一、XGBoost算法原理:
1,CART树:
CART - Classification and Regression Trees
分类与回归树,是二叉树,可以用于分类,也可以用于回归问题,最先由 Breiman 等提出。
分类树的输出是样本的类别,回归树的输出是一个实数。
CART算法有两步:
决策树生成和剪枝。
决策树生成:递归地构建二叉决策树的过程,基于训练数据集生成决策树,生成的决策树要尽量大;
自上而下从根开始建立节点,在每个节点处要选择一个最好的属性来分裂,使得子节点中的训练集尽量的纯。
不同的算法使用不同的指标来定义"最好":
分类问题,可以选择GINI,双化或有序双化;回归问题,可以使用最小二乘偏差(LSD)或最小绝对偏差(LAD)。
决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准。
这里用代价复杂度剪枝 Cost-Complexity Pruning(CCP)
2,XGBoost算法与GBDT:
GBDT无论在理论推导还是在应用场景实践都是相当完美的,但有一个问题:第n颗树训练时,需要用到第n-1颗树的(近似)残差。从这个角度来看,GBDT比较难以实现分布式(ps:虽然难,依然是可以的,换个角度思考就行)。
简单讲,XGB(extremegradient boosting)是GBDT的一种工业实现,也是通过不断增加新树,拟合伪残差去降低损失函数。其拟合过程是使用的损失函数的二阶泰勒展开,这是和GBDT的一个区别。
xgboost使用CART树而不是用普通的决策树。对于分类问题,由于CART树的叶子节点对应的值是一个实际的分数,而非一个确定的类别,这将有利于实现高效的优化算法。xgboost出名的原因一是准,二是快,之所以快,其中就有选用CART树的一份功劳。
不同于传统的gbdt方式 ,只利用了一阶的导数信息,xgboost对loss func 做了二阶的泰勒展开,并在目标函数之外加入了正则项整体求最优解,用以权衡目标函数的下降和模型的复杂程度,避免过拟合。具体推导详见陈天奇的ppt(文末有网盘链接),这里给出简要的摘注,一些变量的称谓沿用陈天奇ppt 里的叫法,和前述 friedman 的版本里不一致,请注意。
利用泰勒展开三项,做一个近似,我们可以很清晰地看到,最终的目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数。
3,一个实例:
1,XGBoost:
算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是