“`” 参考回答:
XGBoost是一个树集成模型,它使用的是K(树的总数为K)个树的每棵树对样本的预测值的和作为该样本在XGBoost系统中的预测,定义函数如下:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654356997_C14022E909704D601526BE46C12F5B32"">
对于所给的数据集有n个样本,m个特征,定义为:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654336100_D9D86CDDDFD56E5AC66FA7122337BB34"">
其中Xi表示第i个样本,yi表示第i个样本的类别标签。CART树的空间为F,如下:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654318424_C601668340D98EE27A9FD52BE0B41E17"">
其中q表示每棵树的结构映射每个样本到相应的叶节点的分数,即q表示树的模型,输入一个样本,根据模型将样本映射到叶节点输出预测的分数;Wq(x)表示树q的所有叶节点的分数组成集合;T是树q的叶节点数量。
所以,由(1)式可以看出,XGBoost的预测值为每棵树的预测值之和,即每棵树相应的叶节点的得分之和(Wi的和,Wi表示第i个叶节点的得分)。
我们的目标就是学习这样的K个树模型f(x).。为了学习模型f(x),我们定义下面的目标函数:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654218581_DA95B0A56591F1C9282B2990A1722F21"">
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654229021_2B788F295514EACE36B431E4834D5F61"">
其中,(2)式右边第一项为损失函数项,即训练误差,是一个可微的凸函数(比如用于回归的均方误差和用于分类的Logistic误差函数等),第二项为正则化项,即每棵树的复杂度之和,目的是控制模型的复杂度,防止过拟合。我们的目标是在L(φ)取得最小化时得出对应的模型f(x)。
由于XGBoost模型中的优化参数是模型f(x),不是一个具体的值,所以不能用传统的优化方法在欧式空间中进行优化,而是采用additive training的方式去学习模型。每一次保留原来的模型不变,加入一个新的函数f到模型中,如下:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654275454_6D0F9075126C579116BABEBA0744F1BD"">
预测值在每一次迭代中加入一个新的函数f目的是使目标函数尽量最大地降低。
因为我们的目标是最小化L(φ)时得到模型f(x),但是L(φ)中并没有参数f(x),所以,我们将上图中的最后一式代入L(φ)中可得到如下式子:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654545445_AA41B6FD9D442CD3F1BD7E58A9FADF6E"">
对于平方误差(用于回归)来说(3)式转换成如下形式:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654531702_8C8E87DEB95D4EE1251D4C1727E6E338"">
对于不是平方误差的情况下,一般会采用泰勒展开式来定义一个近似的目标函数,以方便我们的进一步计算。
根据如下的泰勒展开式,移除高阶无穷小项,得:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654515691_247EF8F9FB11113DF4095C2AF693DB7E"">
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654498504_E74F441D04F2B635B26975278595311D"">
(3)式等价于下面的式子:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654483338_BA4FD8E055E6CC4DDBA93F9774B548A4"">
由于我们的目标是求L(φ)最小化时的模型f(x)(也是变量),当移除常数项时模型的最小值变化,但是取最小值的变量不变(比如:y=x^2+C,无论C去何值,x都在0处取最小值)。所以,为了简化计算,我们移除常数项,得到如下的目标函数:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654469172_F531D4625946FBDE30017CF92A508DD8"">
定义<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654451035_2DB3B28ECCF5B5A190EDE8F315E673D9""> 为叶节点j的实例,重写(4)式,将关于树模型的迭代转换为关于树的叶子节点的迭代,得到如下过程:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654624457_DADDD0F0171B5F2ADFDC767043C36B94"">
此时我们的目标是求每棵树的叶节点j的分数Wj,求出Wj后,将每棵树的Wj相加,即可得到最终的预测的分数。而要想得到最优的Wj的值,即最小化我们的目标函数,所以上式对Wj求偏导,并令偏导数为0,算出此时的W*j为:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654685059_2842BAC8D592204451186D4BB0281E21"">
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654671657_8915C25DF2078E084BCD9002BE3FADB9"">
将W*j代入原式得:
<img alt=""img"" referrerpolicy=""no-referrer"" src=""https://uploadfiles.nowcoder.com/images/20190315/311436_1552654657763_0C64F280CB46F2223B5E422CD44DDDCA"">
方程(5)可以用作得分(score)函数来测量树结构q的质量。该得分类似于评估决策树的不纯度得分,除了它是针对更广泛的目标函数得出的。
在xgboost调中,一般有两种方式用于控制过拟合:1)直接控制参数的复杂度:包括max_depth min_child_weight gamma;2)add randomness来使得对训练对噪声鲁棒。包括subsample colsample_bytree,或者也可以减小步长 eta,但是需要增加num_round,来平衡步长因子的减小。
<pre><code> "“`
Was this helpful?
0 /
0