分裂点贪心算法
对现有的叶节点加入一个分裂,然后考虑分裂之后目标函数降低多少,如果目标函数下降,则说明可以分裂,如果目标函数不下降,则说明该叶节点不宜分裂
对于一个叶节点,加入给定其分裂点,定义划分到左子节点的样本的集合为
mathbbIL={i∣q(x
i)=L}
定义划分到右子节点的样本的集合为
IR={i∣q(x
i)=R}则有
GLHLG=H==i∈IL∑gi,GR=i∈IR∑gi=i∈IL∑hiHR=i∈IR∑hii∈IL∑gi+i∈IR∑gi=GL+GRi∈IL∑hi+i∈IR∑hi=HL+HR
定义叶节点的分裂增益为:
Gain=21[HL+λGL2+HR+λGR2−H+λG2]−γ
其中:
HL+λGL2表示:该叶节点的左子树的结构分
HR+λGR2表示:该叶节点的右子树的结构分
H+λG2表示:如果不分裂,则该叶节点本事的结构分
−λ表示:因为分裂导师叶节点数量增大1,从而导致增益的下降
每次分裂只一个叶节点,因此其他叶节点不会发生变化,因此
若
Gain>0,则该叶节点应该分裂
若
Gain≤0,则该叶节点不宜分裂
现在的问题是:不知道分裂点。对于每个叶节点,存在很多个分裂点,且可能很多分裂点都能带来增益。
解决办法是:对于叶节点中的所有可能的分裂点进行一次扫描,然后计算每个分裂点的增益,选取增益最大的分裂点作为本叶节点的最优分裂点。
贪心算法的缺点
分裂贪心算法尝试所有特征和所有分裂位置,从而求得最优分裂点,当样本太大且特征为连续值时,这种暴力做法的计算量太大。
近似算法
近似算法的思想
1.近似算法寻找最优分裂点时不会枚举所有的特征值,而是对特征值进行聚合统计,然后形成若干个桶。然后仅仅将桶边界上的特征的值作为分裂点的候选,从而获取计算性能的提升。
2.假设数据集
D=(x1
,y1~),(x2
,y2~),...,(xN
,yN~) 样本
xi
=(xi,1,xi,2,...,xi,n)T
对第k个特征进行分桶:
如果第k个特征为连续特征,则执行百分位分桶,得到分桶的区间为
Sk=sk,1,sk,2,...,sk,l,其中
sk,1<sk,2<...<sk,l
分桶的数量、分桶的区间都是超参数,需要仔细挑选
如果第k个特征为离散特征,则执行案离散值分桶,得到的分桶为
Sk=sk,1,sk,2,...,sk,l,其中
sk,1,sk,2,...,sk,l为第k个特征的所有可能的离散值
分桶的数量l就是所有样本在第k个特征上的取值的数量。
分桶的模式
分桶有两种模式
全局模式:在算法开始时,对每个维度分桶一次,后续的分裂都依赖于该分桶并不在更新。
优点是:只需要计算一次,不需要重复计算
缺点是:在经过多次分裂之后,叶节点的样本可能在很多全局桶中是空的
局部模式:除了在算法开始时进行分桶,每次拆分之后再重新分桶
优点是:每次分桶都能保证各桶中的样本数量都是均匀的
缺点是:计算量较大
分桶的超参数
分桶时的桶区间间隔大小是个重要的参数
区间间隔越小,则桶越多,则划分的越精细,候选的拆分点就越多。
加权分桶
定义一个排序函数
假设候选样本的第K维特征,及候选样本的损失函数的二阶偏导数为:
Dk=(x1,k,h1),(x2,k,h2),...,(xN,k,hN)
定义排序函数
rk(z)=∑{i∣(xi,k,hi)∈Dk}hi∑{i∣(xi,k,hi)∈Dk,xi,k<z}hi
它刻画的是:第K维小于z的样本的h之和,占总的h之和的比例
xgboost的作者提出了一种带权重的桶划分算法。定义候选样本的下标集合为
I,拆分点为
Sk=sk,1,sk,2,...,sk,l定义为
sk,1=i∈Iminxi,k,sk,l=i∈Imaxxi,k,∣rk(sk,j)−rk(sk,j+1)∣<ϵ
其中
xi,k表示样本
xi
的第k个的特征,即:
最小的拆分点是所有样本第k维的最小值。
最大的拆分点是所有样本第k维的最大值。
中间的拆分点:选取拆分点,使得相邻拆分点的排序函数值小于
ϵ(分桶的桶宽)
其意义为:第K维大于等于
sk,j,小于
sk,j+1的样本的h之和,占总的h之和的比例小于
ϵ。
这种拆分点使得每个桶内的以h为权重的样本数量比较均匀,而不是样本个数比较均匀。
加权分桶的方法的解释
改写以后可以发现,对于第t棵决策树而言,它等价于样本
xi的真实label为
higi,权重为
hi,损失函数的平方损失。因此分桶时每个桶的权重为h。