GBDT
本文以多分类问题为例介绍GBDT的算法,针对多分类问题,每次迭代都需要生成K个树(K为分类的个数),记为,其中m为迭代次数,k为分类。
针对每个训练样本,使用的损失函数通常为,此时损失函数的梯度可以表示为。
GBDT算法的流程如下所示:
- for k=1 to K: Initialize
- for m=1 to M:
- for k=1 to K: compute for each sample
- for k=1 to K: build up regression tree (j=1 to Jmk refer to the leaf nodes) from training samples
- for k=1 to K: compute leaf weights for j=1 to Jmk
- for k=1 to K: , 为学习率
针对的计算,有
为了求得w的值,使上述公式的一阶导数为0,利用Newton-Raphson公式(在这个问题中将初始值设为0,只进行一步迭代,并且Hessian矩阵只取对角线上的值),记,有
文献[1]在的前面乘以了的系数,可能原因是在分类器的建立过程中,可以把任意一个始终设为0,只计算剩余的,因此
参考文献
[1] Friedman, Jerome H. Greedy function approximation: A gradient boosting machine. Ann. Statist. 29 (2001), 1189–1232.
XGBOOST
仍以多分类问题介绍XGBOOST的算法,相对于GBDT的一阶导数,xgboost还引入了二阶导数,并且加入了正则项。
区别于上文的符号,记,并记,xgboost的计算流程如下:
- for k=1 to K: Initialize
- for m=1 to M:
- for k=1 to K: compute and for each sample
- for k=1 to K: compute (i.e., , j=1 to Jmk refer to the leaf nodes) to minimize the function , where is the regularization function
- for k=1 to K: , 为学习率
针对回归树的求解,记,最小化问题变为,这是Jmk个独立的二次函数之和。
假设回归树的结构已经固定,记,此时在时目标函数取得最小值,最小值为。
使用贪心算法确定回归树的结构,从一个节点开始不断进行分裂,分裂的规则是挑选使分裂增益最大的特征和分裂点进行分裂,直到达到某个停止条件为止。假设待分裂的节点为,分裂后的两个节点分别为和,那么分裂增益可以表示为:
XGBOOST的Python包中的重要参数
- eta(alias:learning_rate): learning rate or shrinkage,同上文的,常用值0.01~0.2
- gamma(alias: min_split_loss): min loss reduction to create new tree split,同上文的
- lambda(alias: reg_lambda): L2 regularization on leaf weights,同上文的
- alpha(alias: reg_alpha): L1 regularization on leaf weights
- max_depth: max depth per tree,常用值3~10
- min_child_weight: minimum sum of instance weight(hessian) of all observations required in a child,即在一个节点中的样本的损失函数二阶导数之和,以多分类为例,
- subsample: % samples used per tree,常用值0.5~1
- colsample_bytree: % features used per tree,常用值0.5~1
- 针对样本类别不均衡问题,若是二分类问题,可以设置参数scale_pos_weight,通常设为sum(negative instances)/sum(positive instances); 若是多分类问题,可以通过xgboost.DMatrix(…,weight,…)或者在Scikit-Learn API中调用fit(…,sample_weight,…)
- 特征重要性可以通过该特征被选中作为节点分裂特征的次数来度量
- xgboost示例可参见文章Xgboost应用及调参示例