基本构成
boosted tree作为有监督学习算法有几个重要部分:模型、参数、目标函数、优化算法
模型
模型指给定输入x如何去预测输出y
参数
参数指我们需要学习的东西,在线性模型中,参数指我们的线性系数w
目标函数
目标函数:损失 + 正则,教我们如何去寻找一个比较好的参数
一般的目标函数包含下面两项:
Bias-variance tradeoff,Bias可以理解为假设我们有无限多数据的时候,可以训练出最好的模型所拿到的误差。而Variance是因为我们只有有限数据,其中随机性带来的误差。
误差函数尽量去拟合训练数据,正则化项则鼓励更加简单的模型。因为当模型简单之后,有限数据拟合出来结果的随机性比较小,不容易过拟合,使得最后模型的预测更加稳定。
优化算法
给定目标函数之后怎么学的问题
Boosted Tree
###1、基学习器:分类和回归树(CART)
CART会把输入根据输入的属性分配到各个叶子节点,而每个叶子节点上面都会对应一个实数分数。
Tree Ensemble构成
一个CART往往过于简单无法有效地预测,因此一个更加强力的模型叫做tree ensemble。
用两棵树来进行预测。我们对于每个样本的预测结果就是每棵树预测分数的和。
tree ensemble
预测函数:
y i ^ = ∑ k = 1 K f k ( x i ) , f k ∈ f \hat{y_i}=\sum_{k=1}^Kf_k(x_i),f_k \in f yi^=k=1∑Kfk(xi),fk∈f
目标函数:
O b j ( Θ ) = ∑ i n l ( y i , y i ^ ) + ∑ k = 1 K Ω ( f k ) Obj(\Theta)=\sum_{i}^nl(y_i,\hat{y_i})+\sum_{k=1}^K\Omega(f_k) Obj(Θ)=i∑nl(yi,yi^)+k=1∑KΩ(fk)
模型学习:additive training
第一部分是训练误差,第二部分是每棵树的复杂度的和。
每一次保留原来的模型不变,加入一个新的函数f到我们的模型中。
如何选择每一轮加入什么f呢?
选取一个f来使得我们的目标函数尽量最大地降低(加入f后的预测结果与实际结果误差减少)。
对于l是平方误差时:
对于l不是平方误差的情况:
采用如下的泰勒展开近似来定义一个近似的目标函数
移除常数项(真实值与上一轮的预测值之差),目标函数只依赖于每个数据点的在误差函数上的一阶导数和二阶导数
树的复杂度
以上是目标函数中训练误差的部分,接下来定义树的复杂度。
对于f的定义做一下细化,把树拆分成结构函数q(输入x输出叶子节点索引)和叶子权重部分w(输入叶子节点索引输出叶子节点分数),结构函数q把输入映射到叶子的索引号上面去,而w给定了每个索引号对应的叶子分数是什么。
定义一棵树的复杂度如下:
一棵树里面叶子节点的个数,以及每个树叶子节点上面输出分数的L2模平方。
目标函数改写:
其中I被定义为每个叶子上面样本集合Ij={i|q(xi)=ji} (每个叶子节点里面样本集合);
f(xi)等价于求出w(q(xi))的值(每一个样本所在叶子索引的分数) ;T为叶子节点数量。
定义Gj(每个叶子节点里面一阶梯度的和)Hj(每个叶子节点里面二阶梯度的和)
G j = ∑ i ∈ I j g i , H j = ∑ i ∈ I j h j G_j=\sum_{i\in I_j}g_i ,\ \ H_j=\sum_{i \in I_j}h_j Gj=i∈Ij∑gi, Hj=i∈Ij∑hj
目标函数改写:
求偏导得出:
w j ∗ = − G j H j + λ w_j^*=-\frac{G_j}{H_j+\lambda} wj∗=−Hj+λGj O b j = − 1 2 ∑ j = 1 T G j 2 H j + λ + λ T Obj=-\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\lambda T Obj=−21j=1∑THj+λGj2+λT
Obj代表了当我们指定一个树的结构的时候,我们在目标上面最多减少多少,可叫做结构分数(structure score),Obj计算示例:
枚举所有不同树结构的贪心法
exact greedy algorithm 贪心算法获取最优切分点
利用这个打分函数来寻找出一个最优结构的树,加入到我们的模型中,再重复这样的操作。
常用的方法是贪心法,每一次尝试去对已有的叶子加入一个分割。对于一个具体的分割方案,计算增益:
对于每次扩展,如何高效地枚举所有的分割呢
假设我们要枚举所有 x
引入新叶子的惩罚项
优化这个目标对应了树的剪枝, 当引入的分割带来的增益小于一个阀值的时候,我们可以剪掉这个分割。
这样根据推导引入了分裂节点的选取计算分数和叶子的惩罚项,替代了回归树的基尼系数与剪枝操作。
当我们正式地推导目标的时候,像计算分数和剪枝这样的策略都会自然地出现,而不再是一种因为heuristic(启发式)而进行的操作了。
缩减与列抽样
缩减,每一个树生成结果乘以一个步长系数 防止过拟合
列采样样 类似随机森林每个树特征抽样 防止过拟合
以上来自:https://blog.csdn.net/q383700092/article/details/60954996
随便找一个曲线上的A点(为什么随便找,根据切线是切点附近的曲线的近似,应该在根点附近找,但是很显然我们现在还不知道根点在哪里),做一个切线,切线的根(就是和x轴的交点)与曲线的根,还有一定的距离。此时从这个切线的根出发,做一根垂线,和曲线相交于B点,继续上面的步骤:
经过多次迭代后,很明显越来越接近曲线的根了(但只会更接近根),此时称为迭代收敛了。
牛顿法的代数解法:当曲线方程为f(x) ,我们在xn点做切线,求xn+1:
此时容易得出,xn点的切线方程为: f ( x n ) + f ′ ( x n ) ( x − x n ) f(x_n)+f'(x_n)(x-x_n) f(xn)+f′(xn)(x−xn)要求 x n + 1 x_n+1 xn+1,即相当于求 f ( x n ) + f ′ ( x n ) ( x − x n ) = 0 f(x_n)+f'(x_n)(x-x_n)=0 f(xn)+f′(xn)(x−xn)=0的解,即 f ( x n ) + f ′ ( x n ) ( x n + 1 − x n ) = 0    ⟹    x n + 1 = x n − f ( x n ) f ′ ( x n ) f(x_n)+f'(x_n)(x_{n+1}-x_n)=0\implies x_{n+1}=x_{n}-{\frac {f(x_{n})}{f'(x_{n})}} f(xn)+f′(xn)(xn+1−xn)=0⟹xn+1=xn−f′(xn)f(xn)
但还有一些形式的函数是不收敛的,所以要注意以下问题:
牛顿法的基本思想是:在现有极小点估计值的附近对f(x)做二阶泰勒展开,进而找到极小点的下一个估计值。设xk为当前的极小点估计值,则:
φ ( x ) = f ( x k ) + f ′ ( x k ) ( x − x k ) + 1 2 f ′ ′ ( x k ) ( x − x k ) 2 \varphi(x)=f(x_k)+f'(x_k)(x-x_k)+\frac{1}{2}f''(x_k)(x-x_k)^2 φ(x)=f(xk)+f′(xk)(x−xk)+21f′′(xk)(x−xk)2
表示f(x)在xk附近的二阶泰勒展开式(略去了关于 x − x k x−x_k x−xk的高阶项),由于求的是最值,由极值必要条件可知,φ(x)应满足 φ ′ ( x ) = 0 φ'(x)=0 φ′(x)=0,即 f ′ ( x k ) + f ′ ′ ( x k ) ( x − x k ) = 0 f'(x_k)+f''(x_k)(x-x_k)=0 f′(xk)+f′′(xk)(x−xk)=0
从而得到
x = x k − f ′ ( x k ) f ′ ′ ( x k ) x=x_k-\frac{f'(x_k)}{f''(x_k)} x=xk−f′′(xk)f′(xk)
于是,若给定初始值x0,则可以构造如下的迭代格式
x k + 1 = x k − f ′ ( x k ) f ′ ′ ( x k ) , k = 0 , 1.... x_{k+1}=x_k-\frac{f'(x_k)}{f''(x_k)}, k=0,1.... xk+1=xk−f′′(xk)f′(xk),k=0,1....
可通过产生序列 x k {x_k} xk来逼近f(x)的极小点.在一定条件下, x k {x_k} xk可以收敛到f(x)的极小点。
对于N>1的情形,二阶泰勒展开式可以做推广,此时
φ ( X ) = f ( X k ) + ▽ f ( X k ) ( X − X k ) + 1 2 ( X − X k ) T ▽ 2 f ( X k ) ( X − X k ) \varphi(X)=f(X_k)+\bigtriangledown f(X_k)(X-X_k)+\frac{1}{2}(X-X_k)^T\bigtriangledown ^2f(X_k)(X-X_k) φ(X)=f(Xk)+▽f(Xk)(X−Xk)+21(X−Xk)T▽2f(Xk)(X−Xk)
其中▽f为f的梯度向量,▽2f为f的海森矩阵,其定义如下:
注意,▽f和▽2f中的元素均为关于X的函数,以下简记为g和H.特别是若f的混合偏导数可交换次序,则海森矩阵为对称矩阵。而 ▽ f ( X k ) 和 ▽ 2 f ( X k ) ▽f(X_k)和▽2f(X_k) ▽f(Xk)和▽2f(Xk)则表示将X取为 x k x_k xk后得到的实值向量和矩阵,以下分别将其简记为 g k g_k gk和 H k H_k Hk
同样的,由于是求极小点,极值必要条件 要求它为φ(X)的驻点,即 ▽ φ ( X ) = 0 ▽φ(X)=0 ▽φ(X)=0
通过在上式中两边作用一个梯度算子,得到:
g k + H k ( X − X k ) = 0 g_k+H_k(X-X_k)=0 gk+Hk(X−Xk)=0
此时若矩阵Hk非奇异,可解得
X = X k − H k − 1 g k X=X_k-H_k^{-1}g_k X=Xk−Hk−1gk
若给定初始值X0,则可同样构造出迭代格式
X k + 1 = X k − H k − 1 g k X_{k+1}=X_k-H_k^{-1}g_k Xk+1=Xk−Hk−1gk
这就是牛顿迭代法,其迭代格式中的搜索方向为 − H k − 1 g k -H_k^{-1}g_k −Hk−1gk称为牛顿方向。
当目标函数是二次函数时,由于二次泰勒展开函数与原目标函数不是近似而是完全相同的二次式,海森矩阵退化为一个常数矩阵,从任一初始点出发,只需一步迭代即可达到极小点,因此牛顿法是一种具有二次收敛的算法。对于非二次函数,若函数的二次性态较强,或迭代点已进入极小点的邻域,则其收敛速度也是很快的。
牛顿法来自:https://blog.csdn.net/lilong117194/article/details/78111779