1. 什么是XGBoost
    全称:eXtreme Gradient Boosting
    基础:GBDT
    所属:boosting迭代型、树类算法。
    适用范围:分类、回归
    优点:速度快、效果好、能处理大规模数据、支持多种语言、支持自定义损失函数等等。
    缺点:算法参数过多,调参负责,对原理不清楚的很难使用好XGBoost。不适合处理超高维特征数据。
  2. XGBoost原理
    XGBoost 所应用的算法就是GBDT(gradient boosting decision tree),既可以用于分类也可以用于回归问题中。那什么是 Gradient Boosting?Gradient boosting 是 boosting 的其中一种方法。所谓 Boosting ,就是将弱分离器 f_i(x) 组合起来形成强分类器 F(x) 的一种方法。所以 Boosting 有三个要素:
    1)A loss function to be optimized:例如分类问题中用 cross entropy,回归问题用 mean squared error。
    2)A weak learner to make predictions:例如决策树。
    3)An additive model:将多个弱学习器累加起来组成强学习器,进而使目标损失函数达到极小。
    Gradient boosting 就是通过加入新的弱学习器,来努力纠正前面所有弱学习器的残差,最终这样多个学习器相加在一起用来进行最终预测,准确率就会比单独的一个要高。之所以称为 Gradient,是因为在添加新模型时使用了梯度下降算法来最小化的损失。一般来说,gradient boosting 的实现是比较慢的,因为每次都要先构造出一个树并添加到整个模型序列中。而 XGBoost 的特点就是计算速度快,模型表现好,这两点也正是这个项目的目标。
  3. XGBoost的优势
    1)正则化
    XGBoost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
    2)XGBoost工具支持并行。
    Boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
    高度的灵活性。XGBoost支持用户自定义目标函数和评估函数,只要目标函数二阶可导就行。
    3)缺失值处理。
    XGBoost内置处理缺失值的规则。用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。XGBoost在不同节点遇到缺失值时采用不同的处理方法,并且会学习未来遇到缺失值时的处理方法。
    4)剪枝。
    当分裂时遇到一个负损失时,GBM会停止分裂。因此GBM实际上是一个贪心算法。 XGBoost会一直分裂到指定的最大深度(max_depth),然后回过头来剪枝。如果某个节点之后不再有正值,它会去除这个分裂。 这种做法的优点,当一个负损失(如-2)后面有个正损失(如+10)的时候,就显现出来了。GBM会在-2处停下来,因为它遇到了一个负值。但是XGBoost会继续分裂,然后发现这两个分裂综合起来会得到+8,因此会保留这两个分裂。比起GBM,这样不容易陷入局部最优解。
    5)内置交叉验证。
    XGBoost允许在每一轮boosting迭代中使用交叉验证。因此,可以方便地获得最优boosting迭代次数。而GBM使用网格搜索,只能检测有限个值。
    6)在已有的模型基础上继续。
    XGBoost可以在上一轮的结果上继续训练。