【任务三 XGB算法梳理】
CART树
算法原理
损失函数
分裂结点算法
正则化
对缺失值处理
优缺点
sklearn参数
应用场景
一、CART树
CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
CART算法由以下两步组成:
决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时损失函数最小作为剪枝的标准。
CART生成
决策树的生成是递归地构建二叉决策树的过程,对回归树用平方误差最小化准则,对分类树使用基尼系数最小化准则,进行特征选择,生成二叉树。
1.回归树模型
f
(
x
)
=
∑
m
=
1
M
c
m
I
(
x
∈
R
m
)
f(x) = \sum_{m=1}^Mc_mI(x\in R_m)
f(x)=m=1∑McmI(x∈Rm)
当输入空间的划分确定时,可以用平方误差来表示回归树对于训练数据的预测误差,用平方误差最小的准则求解每个单元上的最有输出值。根据输出值寻找最优的切分变量 j 和切分点 s,构成一个对(j,s),依此将输入空间划分为两个区域。重复对所有区域进行划分,知道满足所有情况,生成回归树,这样的回归树通常称为最小二乘回归树。
2.分类树模型
基于基尼系数选择最优特征,同时决定该特征的最优二值切分点。
基尼系数:
G
i
n
i
(
p
)
=
∑
k
=
1
K
p
k
(
1
−
p
k
)
=
1
−
∑
k
=
1
K
p
k
2
Gini(p) = \sum_{k=1}^Kp_k(1-p_k) = 1-\sum_{k=1}^Kp_k^2
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2
对于二分类问题,概率分布的基尼指数为
G
i
n
i
(
p
)
=
2
p
(
1
−
p
)
Gini(p) = 2p(1-p)
Gini(p)=2p(1−p)
对于给定的样本集合D,其基尼系数为
G
i
n
i
(
D
)
=
1
−
∑
k
=
1
K
(
∣
C
k
∣
∣
D
∣
)
2
Gini(D) = 1-\sum_{k=1}^K(\frac{|C_k|}{|D|})^2
Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
在特征A的条件下,集合D的基尼系数为
G
i
n
i
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
G
i
n
i
(
D
1
)
+
∣
D
2
∣
∣
D
∣
G
i
n
i
(
D
2
)
Gini(D,A) = \frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2)
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
基尼系数表示集合D的不确定性,基尼系数值越大,样本集合的不确定性也就越大。
二、XgBoost算法原理
该算法思想就是不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数,去拟合上次预测的残差。当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数,最后只需要将每棵树对应的分数加起来就是该样本的预测值。
y
^
=
ϕ
(
x
i
)
=
∑
k
=
1
K
f
k
(
x
i
)
w
h
e
r
e
F
=
(
f
(
x
)
=
w
q
(
x
)
)
(
q
:
R
m
−
>
T
,
w
∈
R
T
)
\hat y=\phi(x_i) = \sum_{k=1}^Kf_k(x_i) \\where \ F = (f(x)=w_{q(x)})(q:R_m ->T,w\in R^T)
y^=ϕ(xi)=k=1∑Kfk(xi)where F=(f(x)=wq(x))(q:Rm−>T,w∈RT)
三、XgBoost损失函数
XGBoost目标函数定义为:
O
b
j
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
)
+
∑
k
=
1
K
Ω
(
f
k
)
Obj = \sum_{i=1}^nl(y_i,\hat y_i) + \sum_{k=1}^K\Omega(f_k)
Obj=i=1∑nl(yi,y^i)+k=1∑KΩ(fk)
目标函数由两部分构成,第一部分用来衡量预测分数和真实分数的差距,另一部分则是正则化项。正则化项同样包含两部分,T表示叶子结点的个数,w表示叶子节点的分数。γ可以控制叶子结点的个数,λ可以控制叶子节点的分数不会过大,防止过拟合。 新生成的树要拟合上次预测的残差,即当生成t棵树后,预测分数可以为
y
^
i
(
t
)
=
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
\hat y_i^{(t)} = \hat y_i^{(t-1)} + f_t(x_i)
y^i(t)=y^i(t−1)+ft(xi)
同时目标函数改成
F
(
t
)
=
∑
i
=
1
n
l
(
y
i
,
y
^
i
(
t
−
1
)
+
f
t
(
x
i
)
)
+
Ω
(
f
t
)
F^{(t)} = \sum_{i=1}^nl(y_i,\hat y_i^{(t-1)}+f_t(x_i)) +\Omega(f_t)
F(t)=i=1∑nl(yi,y^i(t−1)+ft(xi))+Ω(ft)
将每个样本的损失值加起来以后,可以将目标函数改写成关于叶子节点分数w的一个一元二次函数,求解最优的w和目标函数值就变得很简单了,直接使用顶点公式即可。因此,最优的w和目标函数公式为
ω
j
∗
=
−
G
i
H
j
+
λ
O
b
j
=
−
1
2
∑
j
=
1
T
G
j
2
H
j
+
λ
+
γ
T
\omega_j^* = -\frac{G_i}{H_j+\lambda} \\ Obj = -\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda} + \gamma T
ωj∗=−Hj+λGiObj=−21j=1∑THj+λGj2+γT
四、分裂节点算法
在上面的推导中,我们知道了如果我们一棵树的结构确定了,如何求得每个叶子结点的分数。但我们还没介绍如何确定树结构,即每次特征分裂怎么寻找最佳特征,怎么寻找最佳分裂点。
正如上文说到,基于空间切分去构造一颗决策树是一个NP难问题,我们不可能去遍历所有树结构,因此,XGBoost使用了和CART回归树一样的想法,利用贪婪算法,遍历所有特征的所有特征划分点,不同的是使用上式目标函数值作为评价函数。具体做法就是分裂后的目标函数值比单子叶子节点的目标函数的增益,同时为了限制树生长过深,还加了个阈值,只有当增益大于该阈值才进行分裂。
同时可以设置树的最大深度、当样本权重和小于设定阈值时停止生长去防止过拟合。
五、正则化
左上角描绘的是用户随着时间的变化对某话题的感兴趣程度的变化,如果使用step function来建模,可以看到右上角的模型基本上拟合到每一个数据点,然而也可以看到它太复杂了,也就是模型复杂度太高;而对于左下角模型,它虽然比较简单,但是很多数据都没有拟合到;最后看看右下角的模型,它简单,而且基本拟合到所有数据点。因此我们说右下角的模型是最好的,对于一个机器学习的模型的通用原则是:简单并且准确。模型往往需要在简单和准确之中做一个折中,这种折中也成为偏差-方差的折中(bias-variance tradeoff)。
六、对缺失值处理
当样本的第i个特征值缺失时,无法利用该特征进行划分时,XGBoost的想法是将该样本分别划分到左结点和右结点,然后计算其增益,哪个大就划分到哪边。
七、优缺点
优点
1.使用许多策略去防止过拟合,如:正则化项、Shrinkage and Column Subsampling等。
2.目标函数优化利用了损失函数关于待求函数的二阶导数
3.支持并行化,这是XGBoost的闪光点,虽然树与树之间是串行关系,但是同层级节点可并行。具体的对于某个节点,节点内选择最佳分裂点,候选分裂点计算增益用多线程并行。训练速度快。
4.添加了对稀疏数据的处理。
5.交叉验证,early stop,当预测结果已经很好的时候可以提前停止建树,加快训练速度。
6.支持设置样本权重,该权重体现在一阶导数g和二阶导数h,通过调整权重可以去更加关注一些样本。
缺点
与LightGBM相比不足之处如下:
1)xgBoosting采用预排序,在迭代之前,对结点的特征做预排序,遍历选择最优分割点,数据量大时,贪心法耗时,LightGBM方法采用histogram算法,占用的内存低,数据分割的复杂度更低;
2)xgBoosting采用level-wise生成决策树,同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合,但很多叶子节点的分裂增益较低,没必要进行跟进一步的分裂,这就带来了不必要的开销;LightGBM采用深度优化,leaf-wise生长策略,每次从当前叶子中选择增益最大的结点进行分裂,循环迭代,但会生长出更深的决策树,产生过拟合,因此引入了一个阈值进行限制,防止过拟合
八、sklearn调参
XGBoost的作者把所有的参数分成了三类:
1、通用参数:宏观函数控制。
2、Booster参数:控制每一步的booster(tree/regression)。
3、学习目标参数:控制训练目标的表现。
8.1 通用参数
这些参数用来控制XGBoost的宏观功能。
1、booster[默认gbtree]
选择每次迭代的模型,有两种选择:
gbtree:基于树的模型
gbliner:线性模型
2、silent[默认0]
当这个参数值为1时,静默模式开启,不会输出任何信息。 一般这个参数就保持默认的0,因为这样能帮我们更好地理解模型.
3、nthread[默认值为最大可能的线程数]
这个参数用来进行多线程控制,应当输入系统的核数。 如果你希望使用CPU全部的核,那就不要输入这个参数,算法会自动检测它。
还有两个参数,XGBoost会自动设置,目前不用管它。
8.2 booster参数
尽管有两种booster可供选择,我这里只介绍tree booster,因为它的表现远远胜过linear booster,所以linear booster很少用到。
1、eta[默认0.3]
和GBM中的 learning rate 参数类似。 通过减少每一步的权重,可以提高模型的鲁棒性。 典型值为0.01-0.2。
2、min_child_weight[默认1]
决定最小叶子节点样本权重和。 和GBM的 min_child_leaf 参数类似,但不完全一样。XGBoost的这个参数是最小样本权重的和,而GBM参数是最小样本总数。 这个参数用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本。 但是如果这个值过高,会导致欠拟合。这个参数需要使用CV来调整。
3、max_depth[默认6]
这个值为树的最大深度。 这个值也是用来避免过拟合的。max_depth越大,模型会学到更具体更局部的样本。 需要使用CV函数来进行调优。 典型值:3-10
4、max_leaf_nodes
树上最大的节点或叶子的数量。 可以替代max_depth的作用。因为如果生成的是二叉树,一个深度为n的树最多生成n2个叶子。 如果定义了这个参数,GBM会忽略max_depth参数。
5、gamma[默认0]
在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值。 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的。
6、max_delta_step[默认0]
这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守。 通常,这个参数不需要设置。但是当各类别的样本十分不平衡时,它对逻辑回归是很有帮助的。 这个参数一般用不到,但是你可以挖掘出来它更多的用处。
7、subsample[默认1]
这个参数控制对于每棵树,随机采样的比例。 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合。 典型值:0.5-1
8、colsample_bytree[默认1]
和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)。 典型值:0.5-1
9、colsample_bylevel[默认1]
用来控制树的每一级的每一次分裂,对列数的采样的占比。 我个人一般不太用这个参数,因为subsample参数和colsample_bytree参数可以起到相同的作用。但是如果感兴趣,可以挖掘这个参数更多的用处。
10、lambda[默认1]
权重的L2正则化项。(和Ridge regression类似)。 这个参数是用来控制XGBoost的正则化部分的。虽然大部分数据科学家很少用到这个参数,但是这个参数在减少过拟合上还是可以挖掘出更多用处的。
11、alpha[默认1]
权重的L1正则化项。(和Lasso regression类似)。 可以应用在很高维度的情况下,使得算法的速度更快。
12、scale_pos_weight[默认1]
在各类别样本十分不平衡时,把这个参数设定为一个正值,可以使算法更快收敛。
8.3 学习目标参数
这个参数用来控制理想的优化目标和每一步结果的度量方法。
1、objective[默认reg:linear]
这个参数定义需要被最小化的损失函数。最常用的值有:
binary:logistic 二分类的逻辑回归,返回预测的概率(不是类别)。 multi:softmax 使用softmax的多分类器,返回预测的类别(不是概率)。
在这种情况下,你还需要多设一个参数:num_class(类别数目)。 multi:softprob 和multi:softmax参数一样,但是返回的是每个数据属于各个类别的概率。
2、eval_metric[默认值取决于objective参数的取值]
对于有效数据的度量方法。 对于回归问题,默认值是rmse,对于分类问题,默认值是error。 典型值有:
rmse 均方根误差(∑Ni=1?2N???√) mae 平均绝对误差(∑Ni=1|?|N) logloss 负对数似然函数值 error 二分类错误率(阈值为0.5) merror 多分类错误率 mlogloss 多分类logloss损失函数 auc 曲线下面积
3、seed(默认0)
随机数的种子 设置它可以复现随机数据的结果,也可以用于调整参数
九、应用场景
应用于各种不规则数据,同样适用于GBDT能够适用的数据集。
文章参考:《统计学原理》–李航
XGBoost参数调优完全指南(附Python代码)