Xgboost是在GBDT上进行改进的模型,其主要的特点是做了下面的工作,对了树每次做分裂候选时,是使用的Gain增益,而不是普通的gini指数或者均方差,是一种优化过的误差计算.....:
(1)将树模型的复杂度加入到正则项中,参与到损失函数,来避免过拟合问题。 (叶子打分就是预测值,分类问题是给的概率)
(2)对损失函数进行了优化,优化成了二阶泰勒展开形式,同时使用了一阶导和二阶导,加速了优化速度。【这里只是损失函数优化,使用的损失函数还是自己定的,logloss等损失吧】
(3)相比于GBDT只支持Cart作为基分类器的方式,Xgboost还支持线性分类器,在使用线性分类器时候可以使用L1正则化和L2正则化。【看到objective参数下可选 线性回归、逻辑回归等选项】
(4)引入了特征子采样【就是采样一部分特征作为每棵树的构建】,类似于RF那样,这样可以降低过拟合。
(5)在寻找最佳分割点时,使用了一种预排序的机制,特征列排序后以块状存储, 对所有特征都按照特征数值进行预排序,在第一次遍历时存起来,之后再遍历分割点时候用O(data)的代价找到特征上的最好分割点【存储的是按特征分割所带来的增益】,这个预先排序的数据,会存储在block结构中,之后的迭代时反复使用这一结构,能够大大减小计算量。 同时这也是实现并行化的重要支持。
(6)Xgboost可以自动对特征值样本处理,对于有缺失的样本,可以自动找到要分裂的方向 【把缺失值当做一种类型使用】,方法就是将缺失值数据分别分到左子树和右子树中分别计算损失,选择最优的那个,这样在训练时候尝试该怎么分,在测试时直接按照经验最优分即可 【对了,其不支持离散型特征,需要自己做处理,但是lightGBM分箱的机制是支持的】
(7)Xgboost支持并行计算,其并行不是模型上的并行,而是特征上的并行【处理单个特征时可以做到】, 将特征列排序后以block形式放到内存中,之后重复使用这一结构。 boosting方法必须串行,但是在处理每个特征列时是可以并行的。 就是每个特征列下候选分割点的Gain增益计算
(8)使用Shrinkage缩减的方法,相对于对学习率的设置,xgboost在进行玩一次迭代后,会将叶子结点的权重乘该系数,主要是削弱每棵树的影响,放置过拟合,实际使用时候,刚开始会设置的大一些,之后迭代次数多了时候会设置小一些。
(9)相比于 ID3使用信息增益、C4.5使用信息增益比、Cart树使用Gini指数、Xgboost主要使用的计算分裂前后的增益使用的是打分函数, 以打分函数计算每个叶子节点做总体误差的贡献,我们需要误差越
小越好,所以每次做叶子分裂时,都是 计算分裂前后根据打分函数得到Gain增益值,Gain值越大,分裂后L减少的越多。 这里有个疑问,每棵树叶子节点计算残差时还和之前一样吗,应该不是一样的,应该是一种结合到原目标函数、 后面的拉姆塔是结构代价
(10)Xgboost并不是完全的贪心寻找最佳分割点的方法,而是使用了一种近似的方法,其思想是根据百分位法列举几个可能成为分割点的候选者,在候选者基础上找到最佳的分割点,提升效率。
(11)支持自定义loss 损失函数【注意,是loss,是目标函数中的L部分】,只要能够一阶和二阶泰勒展开即可。 另外在打分函数推导推导时的w是最优化求出来的,而不是平均值或者规则