机器学习——boosting之XGBoost(未完)

划水一整天,模型看了仨!不错,虽然现在在打哈欠,还是很想把XGBoost梳理梳理
先从名字开始

XGBoost,eXtreme Gradient Boosting: em。。。。不理解

书上说,XGBoost有很好的性能,在各大比赛中大放异彩,行吧,冲这句,好好看看!

看了几篇,总感觉这个XGBoost不仅仅是对GBDT的改进版,还包含了对CART决策树的改进

1. 首先,GBDT是经过泰勒一阶导出来的,XGBoost则是经过泰勒二阶导,越高阶导越接近原函数值

初始的平方损失函数为 L o r i g i n a l = ( y i − y p r e ) 2 L_{original} = (y_i-y_{pre})^2 Loriginal=(yiypre)2,由于 y p r e y_{pre} ypre是由 y p r e = f ( x ) = ∑ i = 1 m f i ( x ) y_{pre}=f(x)=∑_{i=1}^mf_i(x) ypre=f(x)=i=1mfi(x)

因此, L o r i g i n a l = L ( y , f ( x ) ) ,表示由 y 和 f ( x ) 影响 L 值 L_{original}=L(y,f(x)),表示由y和f(x)影响L值 Loriginal=L(y,f(x)),表示由yf(x)影响L

L ( y , f ( x ) ) = L m − 1 ( y , f m − 1 ( x ) ) + ə L ( y , f m − 1 ( x ) ) ə f m − 1 ( x ) ∗ [ f ( x ) − f m − 1 ( x ) ] + 1 2 ∗ ə L ( y , f m − 1 ( x ) ) 2 ə f m − 1 ( x ) 2 ∗ ( f ( x ) − f m − 1 ( x ) ) 2 L(y,f(x)) = L_{m-1}(y,f_{m-1}(x))+\frac{ə_{L(y,f_{m-1}(x))}}{ə_{f_{m-1}(x)}}*[f(x)-f_{m-1}(x)]+\frac{1}{2}*\frac{ə^2_{L(y,f_{m-1}(x))}}{ə^2_{f_{m-1}(x)}}*(f(x)-f_{m-1}(x))^2 L(y,f(x))=Lm1(y,fm1(x))+əfm1(x)əL(y,fm1(x))[f(x)fm1(x)]+21əfm1(x)2əL(y,fm1(x))2(f(x)fm1(x))2

g i = ə L ( y i , f m − 1 ( x i ) ) ə f m − 1 ( x i ) g_i = \frac{ə_{L(y_i,f_{m-1}(x_i))}}{ə_{f_{m-1}(x_i)}} gi=əfm1(xi)əL(yi,fm1(xi)) h i = ə L ( y , f m − 1 ( x i ) ) 2 ə f m − 1 ( x i ) 2 h_i = \frac{ə^2_{L(y,f_{m-1}(x_i))}}{ə^2_{f_{m-1}(x_i)}} hi=əfm1(xi)2əL(y,fm1(xi))2 L ( y , f m − 1 ( x ) ) L(y,f_{m-1}(x)) L(y,fm1(x))这仨都是前m-1轮的,相当于常数

f ( x ) = f m ( x ) f(x)=f_m(x) f(x)=fm(x),则有 T m = f m ( x ) − f m − 1 ( x ) T_m = f_m(x)-f_{m-1}(x) Tm=fm(x)fm1(x)

L m ( y , f m ( x ) ) = L m − 1 ( y , f m − 1 ( x ) ) + ∑ i = 1 N d a t a g i ∗ T m ( x i , θ m ) + 1 2 ∑ i = 1 N d a t a h i ∗ T m 2 ( x i , θ m ) L_m(y,f_m(x)) = L_{m-1}(y,f_{m-1}(x))+∑_{i=1}^{N_{data}}g_i*T_m(x_i,θ_m)+\frac{1}{2}∑_{i=1}^{N_{data}}h_i*T^2_m(x_i,θ_m) Lm(y,fm(x))=Lm1(y,fm1(x))+i=1NdatagiTm(xi,θm)+21i=1NdatahiTm2(xi,θm)

2. 其次,XGBoost的优化①:增加正则化项 Ω ( T m ( x ) ) Ω(T_m(x)) Ω(Tm(x))

晕了…明天再说!
本来周末把书带回家,准备要看看…果然,美男误我…

这里的 Ω ( T m ( x ) ) = γ ∗ N 叶 + λ ∑ i = 1 N 叶 C i 2 ( x ) Ω(T_m(x)) = γ*N_{叶}+λ∑_{i=1}^{N_{叶}}C_{i}^2(x) Ω(Tm(x))=γN+λi=1NCi2(x),这里的 N 叶 N_叶 N表示所有叶子节点的个数, C i ( x ) C_{i}(x) Ci(x)是叶子节点的均值

γ ∗ N 叶 γ*N_{叶} γN是对叶子节点个数的惩罚,毕竟如果分裂太多,容易过拟合

λ ∑ i = 1 N 叶 C i 2 ( x ) λ∑_{i=1}^{N_{叶}}C_{i}^2(x) λi=1NCi2(x)是为什么要对叶子均值进行惩罚呢?

哦!

因为在XGBoost中,每个叶子节点的均值,其实都是这组叶子节点的残差均值

但有些残差是正的,有些是负的,那要衡量拟合效果是否好,应该看与0的差距。

  • 残差为0,表示完美拟合
  • 残差为正,表示大于原值
  • 残差为负,表示小于原值

那么为了统一表示拟合效果,直接求平方,可避免正、负判别,且计算起来比绝对值更方便。

因此, λ ∑ i = 1 N 叶 C i 2 ( x ) λ∑_{i=1}^{N_{叶}}C_{i}^2(x) λi=1NCi2(x)主要是对残差的惩罚

所以有 Ω ( T m ( x ) ) = γ ∗ N 叶 + λ ∑ i = 1 N 叶 C i 2 ( x ) Ω(T_m(x)) = γ*N_{叶}+λ∑_{i=1}^{N_{叶}}C_{i}^2(x) Ω(Tm(x))=γN+λi=1NCi2(x),完成了对叶子数量和残差的惩罚

惩罚项也加入到 L K L_K LK损失函数里

L m ( y , f m ( x ) ) = L m − 1 ( y , f m − 1 ( x ) ) + ∑ i = 1 N d a t a g i ∗ T m ( x i , θ m ) + 1 2 ∑ i = 1 N d a t a h i ∗ T m 2 ( x i , θ m ) + γ ∗ N 叶 + λ ∑ i = 1 N 叶 C i 2 ( x ) L_m(y,f_m(x)) = L_{m-1}(y,f_{m-1}(x))+∑_{i=1}^{N_{data}}g_i*T_m(x_i,θ_m)+\frac{1}{2}∑_{i=1}^{N_{data}}h_i*T^2_m(x_i,θ_m)+ γ*N_{叶}+λ∑_{i=1}^{N_{叶}}C_{i}^2(x) Lm(y,fm(x))=Lm1(y,fm1(x))+i=1NdatagiTm(xi,θm)+21i=1NdatahiTm2(xi,θm)+γN+λi=1NCi2(x)

求这个损失函数的极小值,求极值的时候,常数项不需要参与运算,因此函数里可以去掉常数项 L m − 1 ( y , f m − 1 ( x ) ) L_{m-1}(y,f_{m-1}(x)) Lm1(y,fm1(x)),并且为了求极值计算方便,还可以将平方项 λ ∑ i = 1 N 叶 C i 2 ( x ) λ∑_{i=1}^{N_{叶}}C_{i}^2(x) λi=1NCi2(x)的系数,设为 1 2 \frac{1}{2} 21这样后续求极值时可以化简运算

最终 L m ( y , f m ( x ) ) = ∑ i = 1 N d a t a g i ∗ T m ( x i , θ m ) + 1 2 ∑ i = 1 N d a t a h i ∗ T m 2 ( x i , θ m ) + γ ∗ N 叶 + 1 2 λ ∑ i = 1 N 叶 C i 2 ( x ) L_m(y,f_m(x)) =∑_{i=1}^{N_{data}}g_i*T_m(x_i,θ_m)+\frac{1}{2}∑_{i=1}^{N_{data}}h_i*T^2_m(x_i,θ_m)+ γ*N_{叶}+\frac{1}{2}λ∑_{i=1}^{N_{叶}}C_{i}^2(x) Lm(y,fm(x))=i=1NdatagiTm(xi,θm)+21i=1NdatahiTm2(xi,θm)+γN+21λi=1NCi2(x)

这里要梳理一下 N d a t a 和 N 叶 N_{data}和N_{叶} NdataN的关系
在这里插入图片描述
所以,可以将损失函数里式子进行转化

  • ∑ i = 1 N d a t a g i ∗ T m ( x i , θ m ) = ∑ j = 1 N 叶 ( ∑ i ∈ I ( j ) g i ) C j ( x ) ∑_{i=1}^{N_{data}}g_i*T_m(x_i,θ_m)=∑_{j=1}^{N_{叶}}(∑_{i∈I(j)}g_i)C_{j}(x) i=1NdatagiTm(xi,θm)=j=1NiI(j)giCj(x),用 G j 表示 ∑ i ∈ I ( j ) g i G_j表示∑_{i∈I(j)}g_i Gj表示iI(j)gi
  • ∑ i = 1 N d a t a h i ∗ T m 2 ( x i , θ m ) = ∑ j = 1 N 叶 ( ∑ i ∈ I ( j ) h i ) C j 2 ( x ) ∑_{i=1}^{N_{data}}h_i*T^2_m(x_i,θ_m)=∑_{j=1}^{N_{叶}}(∑_{i∈I(j)}h_i)C_{j}^2(x) i=1NdatahiTm2(xi,θm)=j=1NiI(j)hiCj2(x),用 H j 表示 ∑ i ∈ I ( j ) h i H_j表示∑_{i∈I(j)}h_i Hj表示iI(j)hi

则损失函数为
L m ( y , f m ( x ) ) = ∑ j = 1 N 叶 G j C j ( x ) + 1 2 ∑ j = 1 N 叶 H j C j 2 ( x ) + γ ∗ N 叶 + 1 2 λ ∑ j = 1 N 叶 C j 2 ( x ) + λ N 叶 L_m(y,f_m(x)) =∑_{j=1}^{N_{叶}}G_jC_{j}(x)+\frac{1}{2}∑_{j=1}^{N_{叶}}H_jC_{j}^2(x)+ γ*N_{叶}+\frac{1}{2}λ∑_{j=1}^{N_{叶}}C_{j}^2(x)+λN_{叶} Lm(y,fm(x))=j=1NGjCj(x)+21j=1NHjCj2(x)+γN+21λj=1NCj2(x)+λN

合并同类项:

L m ( y , f m ( x ) ) L_m(y,f_m(x)) Lm(y,fm(x))

= ∑ j = 1 N 叶 G j C j ( x ) + 1 2 ∑ j = 1 N 叶 ( H j + λ ) C j 2 ( x ) + γ ∗ N 叶 =∑_{j=1}^{N_{叶}}G_jC_{j}(x)+\frac{1}{2}∑_{j=1}^{N_{叶}}(H_j+λ)C_{j}^2(x)+ γ*N_{叶} =j=1NGjCj(x)+21j=1NHj+λCj2(x)+γN

= ∑ j = 1 N 叶 [ G j C j ( x ) + 1 2 ( H j + λ ) C j 2 ( x ) + γ ] =∑_{j=1}^{N_{叶}}[G_jC_{j}(x)+\frac{1}{2}(H_j+λ)C_{j}^2(x)+ γ] =j=1N[GjCj(x)+21(Hj+λ)Cj2(x)+γ]

  • G j = ∑ i ∈ I ( j ) g i = ∑ i ∈ I ( j ) ə L ( y i , f m − 1 ( x i ) ) ə f m − 1 ( x i ) G_j=∑_{i∈I(j)}g_i=∑_{i∈I(j)} \frac{ə_{L(y_i,f_{m-1}(x_i))}}{ə_{f_{m-1}(x_i)}} Gj=iI(j)gi=iI(j)əfm1(xi)əL(yi,fm1(xi)),是常数项
  • H j = ∑ i ∈ I ( j ) h i = ∑ i ∈ I ( j ) ə L ( y , f m − 1 ( x i ) ) 2 ə f m − 1 ( x i ) 2 H_j=∑_{i∈I(j)}h_i=∑_{i∈I(j)}\frac{ə^2_{L(y,f_{m-1}(x_i))}}{ə^2_{f_{m-1}(x_i)}} Hj=iI(j)hi=iI(j)əfm1(xi)2əL(y,fm1(xi))2,也是常数项
  • γ也是我们提前设置的常数项
  • 只要计算出每个叶子节点中的 G j C j ( x ) + 1 2 ( H j + λ ) C j 2 ( x ) + γ G_jC_{j}(x)+\frac{1}{2}(H_j+λ)C_{j}^2(x)+ γ GjCj(x)+21(Hj+λ)Cj2(x)+γ极小值,就可以算出所有叶子节点 ∑ j = 1 N 叶 G j C j ( x ) + 1 2 ∑ j = 1 N 叶 ( H j + λ ) C j 2 ( x ) + γ ∗ N 叶 ∑_{j=1}^{N_{叶}}G_jC_{j}(x)+\frac{1}{2}∑_{j=1}^{N_{叶}}(H_j+λ)C_{j}^2(x)+ γ*N_{叶} j=1NGjCj(x)+21j=1NHj+λCj2(x)+γN的极小值
  • L j = 1 2 ( H j + λ ) C j 2 ( x ) + G j C j ( x ) + γ L_j =\frac{1}{2}(H_j+λ)C_{j}^2(x)+ G_jC_{j}(x)+ γ Lj=21(Hj+λ)Cj2(x)+GjCj(x)+γ相当于一元二次方程 y = a x 2 + b x + c y = ax^2+bx+c y=ax2+bx+c,在 x = − b 2 a x=-\frac{b}{2a} x=2ab处可以取到极值 4 a c − b 2 4 a \frac{4ac-b^2}{4a} 4a4acb2
  • 因此当 C j ( x ) = − G j H j + λ C_{j}(x) = -\frac{G_j}{H_j+λ} Cj(x)=Hj+λGj时,可以求到单个叶子节点的损失函数极小值 m i n : L j = 2 γ ( H j + λ ) − G j 2 2 ( H j + λ ) = γ − G j 2 2 ( H j + λ ) min:L_j=\frac{2γ(H_j+λ)-G_j^2}{2(H_j+λ)}=γ-\frac{G_j^2}{2(H_j+λ)} min:Lj=2(Hj+λ)2γ(Hj+λ)Gj2=γ2(Hj+λ)Gj2
  • 那么第m次迭代时所有样本的损失函数为, m i n : L m ( y , f m ( x ) ) = ∑ j = 1 N 叶 [ γ − G j 2 2 ( H j + λ ) ] min:L_m(y,f_m(x))=∑_{j=1}^{N_{叶}}[γ-\frac{G_j^2}{2(H_j+λ)}] min:Lm(y,fm(x))=j=1N[γ2(Hj+λ)Gj2]

3. 最后,XGBoost的决策树分裂的特征及特征值,与CART决策树选取标准是不同的

CART决策树是根据基尼系数最小,选取的特征及特征值来分裂树
而XGBoost是可以采用贪心算法,根据特征及特征值分裂后的损失函数增益最大值,来选取的特征及特征值来分裂树

  • 损失函数增益,指的是,每次分裂一个节点时,损失值减小的程度
    • 当前节点的损失值会发生改变,而其他节点的损失值不变。
    • 如果当前节点的损失值比分裂前非常非常小,说明整体的损失值也会变小,增益程度也会更大
    • 如果当前节点的损失值比分裂前差不多,说明整体的损失值没有太大改变,增益程度不大
    • 因此,应该选择损失值增益最大的特征及特征值,作为分裂的节点
      在这里插入图片描述

因此,
G a i n = [ γ − G j 父 2 2 ( H j 父 + λ ) ] − [ γ − G j 左 2 2 ( H j 左 + λ ) ] − [ γ − G j 右 2 2 ( H j 右 + λ ) ] Gain =[γ-\frac{G_{j父}^2}{2(H_{j父}+λ)}]-[γ-\frac{G_{j左}^2}{2(H_{j左}+λ)}]-[γ-\frac{G_{j右}^2}{2(H_{j右}+λ)}] Gain=[γ2(Hj+λ)Gj2][γ2(Hj+λ)Gj2][γ2(Hj+λ)Gj2]

= G j 左 2 2 ( H j 左 + λ ) + G j 右 2 2 ( H j 右 + λ ) − G j 父 2 2 ( H j 父 + λ ) − γ =\frac{G_{j左}^2}{2(H_{j左}+λ)}+\frac{G_{j右}^2}{2(H_{j右}+λ)}-\frac{G_{j父}^2}{2(H_{j父}+λ)}-γ =2(Hj+λ)Gj2+2(Hj+λ)Gj22(Hj+λ)Gj2γ

其中 G j 父 2 2 ( H j 父 + λ ) \frac{G_{j父}^2}{2(H_{j父}+λ)} 2(Hj+λ)Gj2

G j 父 = ∑ i ∈ I ( j 左 + j 右 ) g i = ∑ i ∈ I ( j 左 ) g i + ∑ i ∈ I ( j 右 ) g i = G j 左 + G j 右 G_{j父}=∑_{i∈I(j左+j右)}g_i=∑_{i∈I(j左)}g_i+∑_{i∈I(j右)}g_i = G_{j左}+G_{j右} Gj=iI(j+j)gi=iI(j)gi+iI(j)gi=Gj+Gj
H j 父 = ∑ i ∈ I ( j 左 + j 右 ) h i = ∑ i ∈ I ( j 左 ) h i + ∑ i ∈ I ( j 右 ) h i = H j 左 + H j 右 H_{j父}=∑_{i∈I(j左+j右)}h_i=∑_{i∈I(j左)}h_i+∑_{i∈I(j右)}h_i = H_{j左}+H_{j右} Hj=iI(j+j)hi=iI(j)hi+iI(j)hi=Hj+Hj

因此, G j 父 2 2 ( H j 父 + λ ) = ( G j 左 + G j 右 ) 2 2 ( H j 左 + H j 右 + λ ) \frac{G_{j父}^2}{2(H_{j父}+λ)}=\frac{(G_{j左}+G_{j右})^2}{2(H_{j左}+H_{j右}+λ)} 2(Hj+λ)Gj2=2(Hj+Hj+λ)(Gj+Gj)2

所以最终的
G a i n = G j 左 2 2 ( H j 左 + λ ) + G j 右 2 2 ( H j 右 + λ ) − G j 父 2 2 ( H j 父 + λ ) − γ Gain=\frac{G_{j左}^2}{2(H_{j左}+λ)}+\frac{G_{j右}^2}{2(H_{j右}+λ)}-\frac{G_{j父}^2}{2(H_{j父}+λ)}-γ Gain=2(Hj+λ)Gj2+2(Hj+λ)Gj22(Hj+λ)Gj2γ

= G j 左 2 2 ( H j 左 + λ ) + G j 右 2 2 ( H j 右 + λ ) − ( G j 左 + G j 右 ) 2 2 ( H j 左 + H j 右 + λ ) − γ =\frac{G_{j左}^2}{2(H_{j左}+λ)}+\frac{G_{j右}^2}{2(H_{j右}+λ)}-\frac{(G_{j左}+G_{j右})^2}{2(H_{j左}+H_{j右}+λ)}-γ =2(Hj+λ)Gj2+2(Hj+λ)Gj22(Hj+Hj+λ)(Gj+Gj)2γ

因此,最终是根据Gain最大的结果,来选取最优的分裂特征及特征值

完美!

程序设计

1. 数据结构:一棵二叉树

  • 每个节点存储的数据:
    • 当前节点的样本残差集
    • 选择分裂的特征及特征值

2. 实现流程:核心步骤

  • 获取当前节点的所有特征及特征值

  • 遍历每个特征及特征值

    • 根据当前特征及特征值分两组
    • 计算G左、G右
      • G i = ∑ i ∈ I ( j ) ə L ( y i , f m − 1 ( x i ) ) ə f m − 1 ( x i ) G_i=∑_{i∈I(j)} \frac{ə_{L(y_i,f_{m-1}(x_i))}}{ə_{f_{m-1}(x_i)}} Gi=iI(j)əfm1(xi)əL(yi,fm1(xi))
      • L ( y i , f m − 1 ( x i ) ) = ( y i − y p r e ) 2 = [ y i − f m − 1 ( x i ) ] 2 L(y_i,f_{m-1}(x_i))=(y_i-y_{pre})^2=[y_i-f_{m-1}(x_i)]^2 L(yi,fm1(xi))=(yiypre)2=[yifm1(xi)]2
      • G i = ∑ i ∈ I ( j ) ə L ( y i , f m − 1 ( x i ) ) ə f m − 1 ( x i ) = ∑ i ∈ I ( j ) [ − 2 ( y i − f m − 1 ( x i ) ) ] G_i=∑_{i∈I(j)} \frac{ə_{L(y_i,f_{m-1}(x_i))}}{ə_{f_{m-1}(x_i)}}=∑_{i∈I(j)} [-2(y_i-f_{m-1}(x_i))] Gi=iI(j)əfm1(xi)əL(yi,fm1(xi))=iI(j)[2(yifm1(xi))]
    • 计算H左、H右
      • H i = ∑ i ∈ I ( j ) ə L ( y i , f m − 1 ( x i ) ) 2 ə f m − 1 ( x i ) = ∑ i ∈ I ( j ) [ − 2 ( y i − f m − 1 ( x i ) ) ] ′ = ∑ i ∈ I ( j ) 2 y i H_i=∑_{i∈I(j)} \frac{ə^2_{L(y_i,f_{m-1}(x_i))}}{ə_{f_{m-1}(x_i)}}=∑_{i∈I(j)} [-2(y_i-f_{m-1}(x_i))]'=∑_{i∈I(j)} 2y_i Hi=iI(j)əfm1(xi)əL(yi,fm1(xi))2=iI(j)[2(yifm1(xi))]=iI(j)2yi
    • 计算分组后的Gain值,记录最大值及对应的特征、特征值
      • G a i n = G j 左 2 2 ( H j 左 + λ ) + G j 右 2 2 ( H j 右 + λ ) − ( G j 左 + G j 右 ) 2 2 ( H j 左 + H j 右 + λ ) − γ Gain=\frac{G_{j左}^2}{2(H_{j左}+λ)}+\frac{G_{j右}^2}{2(H_{j右}+λ)}-\frac{(G_{j左}+G_{j右})^2}{2(H_{j左}+H_{j右}+λ)}-γ Gain=2(Hj+λ)Gj2+2(Hj+λ)Gj22(Hj+Hj+λ)(Gj+Gj)2γ
  • 判断Gain最大值情况下,是否可以分裂左右组

    • 条件:Gain大于0 则可以分裂,否则停止分裂
  • 将最终划分的两个组,设置为左右节点分裂,再分别递归划分

实践遇到的问题

问题1:XGBoost到底是一棵树还是多棵树?

显然是多棵树

问题2:那第一棵树的第一个分裂节点,没有 y p r e y_{pre} ypre怎么计算G值,怎么计算Gain值?
没有Gain值,怎么选择分裂节点?

直击灵魂深处,万事开头难,古人诚不欺我也

所以,为了踏出第一步,需要提前设置一个 y p r e 0 y_{pre0} ypre0初始预测值
这里,可以设置为 y p r e 0 = a v e r a g e ( y t r u e ) y_{pre0}=average(y_{true}) ypre0=average(ytrue),表示第0棵树的所有样本预测值为所有样本真实值的均值,并记录当前预测值 f 0 ( x ) = y p r e 0 f_0(x)=y_{pre0} f0(x)=ypre0,计算出初始残差值 r 0 r_0 r0

  • 1、计算出初始残差值 r 0 r_0 r0后,开始建立第一棵树

    • 先分裂节点:
      • ①获取当前节点的所有特征及特征值
      • ②遍历特征及特征值,计算出最大gain
      • ③判断是否可以分裂
      • ④完成分裂,左右树递归
    • 再进行预测:
      • ①预测所有样本的预测值 y p r e 1 y_{pre1} ypre1
      • ②计算当前所有树的预测结果 f 1 ( x ) = f 0 ( x ) + y p r e 1 f_{1}(x)=f_0(x)+y_{pre1} f1(x)=f0(x)+ypre1
  • 2、计算出第一棵树的残差值 r 1 = y − f 1 ( x ) r_1=y-f_{1}(x) r1=yf1(x)后,开始建立第二棵树

    • 先分裂节点:
      • ①获取当前节点的所有特征及特征值
      • ②遍历特征及特征值,计算出最大gain
      • ③判断是否可以分裂
      • ④完成分裂,左右树递归
    • 再进行预测:
      • ①预测所有样本的预测值 y p r e 2 y_{pre2} ypre2
      • ②计算当前所有树的预测结果 f 2 = f 1 ( x ) + y p r e 2 f_{2}=f_1(x)+y_{pre2} f2=f1(x)+ypre2
  • 这里要区分 f m ( x ) 和 y p r e f_m(x)和y_{pre} fm(x)ypre的定义

    • f m ( x ) f_m(x) fm(x)是对实际y值拟合的预测值, y p r e y_{pre} ypre是对上一轮的残差拟合的预测值, T ( x ) = y p r e T(x)=y_{pre} T(x)=ypre

应该是这样的,估计要创建树的多个对象,然后维护一个全局的数据样本残差表,然后依次根据每棵树对象来更新这个样本残差表

最后模型保留的,就是每棵树以及树的结构,树里每个节点都保留分裂的特征及特征值,保留叶子节点的均值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/133370.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从头开始制作扩散模型(实现快速扩散模型的简单方法)

一、说明 本文是关于自己从头开始构建扩散模型的教程。我总是喜欢让事情变得简单易行,所以在这里,我们避免了复杂的数学。这不是一个正常的扩散模型。相反,我称之为快速扩散模型。将仅使用卷积神经网络(CNN)来制作扩散…

API(九)基于协程的并发编程SDK

一 基于协程的并发编程SDK 场景: 收到一个请求会并发发起多个请求,使用openresty提供的协程说明: 这个是高级课程,如果不理解可以先跳过遗留: APSIX和Kong深入理解openresty 标准lua的协程 ① 早期提供的轻量级协程SDK ngx.thread ngx…

数据结构——【堆】

一、堆的相关概念 1.1、堆的概念 1、堆在逻辑上是一颗完全二叉树(类似于一颗满二叉树只缺了右下角)。 2、堆的实现利用的是数组,我们通常会利用动态数组来存放元素,这样可以快速拓容也不会很浪费空间,我们是将这颗完…

【C++】构造函数调用规则 ( 默认构造函数 | 默认无参构造函数 | 默认拷贝构造函数 | 构造函数调用规则说明 )

文章目录 一、默认构造函数1、默认无参构造函数2、默认拷贝构造函数 二、构造函数调用规则1、构造函数规则说明2、代码示例 - 只定义拷贝构造函数3、代码示例 - 只定义有参构造函数 一、默认构造函数 C 类中 2 种特殊的构造函数 , 分别是 : 默认无参构造函数 : 如果 C 类中 没…

PyTorch实现注意力机制及使用方法汇总,附30篇attention论文

还记得鼎鼎大名的《Attention is All You Need》吗?不过我们今天要聊的重点不是transformer,而是注意力机制。 注意力机制最早应用于计算机视觉领域,后来也逐渐在NLP领域广泛应用,它克服了传统的神经网络的的一些局限&#xff0c…

sqlserver存储过程报错:当前事务无法提交,而且无法支持写入日志文件的操作。请回滚该事务。

现象: 系统出现异常,手动执行过程提示如上。 问题排查: 1.直接执行的过程事务挂起(排除) 2.重启数据库实例(重启后无效) 3.过程中套用过程,套用的过程中使用事务,因为…

STM32-HAL库06-硬件IIC驱动FM24CL16B非易失存储器

STM32-HAL库06-IIC驱动FM24CL16B非易失存储器 一、所用材料: STM32VGT6自制控制板 STM32CUBEMX(HAL库软件) MDK5 二、所学内容: 通过HAL库的硬件IIC对FM24CL16B存储器进行写与读取操作。 三、CUBEMX配置: 第一步…

Virtualbox中Ubuntu根目录空间不足

现象 Virtualbox中Ubuntu根目录空间不足 解决 动态存储 虚拟机关闭先在虚拟介质管理里把硬盘Size调大开启Ubuntu用Disks或者GParted重新调整分区大小重新启动 步骤参考: https://zhuanlan.zhihu.com/p/319431032 https://blog.csdn.net/ningmengzhihe/article/details/1272…

Java 毕业设计-基于SpringBoot的在线文档管理系统

基于SpringBoot的在线文档管理系统 博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 技术栈简介 文末获取源码 开发语言:Java 框架:sp…

rocketmq

🍓代码仓库 https://gitee.com/xuhx615/rocket-mqdemo.git 🍓基本概念 ⭐生产者(Producer):消息发布者⭐主题(Topic):topic用于标识同一类业务类型的消息⭐消息队列(MessageQueue&#xff09…

VirtualBox宿主机和虚拟机文件互传设置

一、如图1、2、3步骤,设置共享粘贴板和拖放为双向 二、 在启动的虚拟机设置的里面,安装增强插件,然后重启虚拟机。 三、在网络位置就可以看到了

Java基于SpringBoot的闲一品交易平台

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 大家好,我是程序员徐师兄、今天给大家谈谈基于android的app开发毕设题目,以及基于an…

学习Bootstrap 5的第八天

目录 加载器 彩色加载器 实例 闪烁加载器 实例 加载器大小 实例 加载器按钮 实例 分页 分页的基本结构 实例 活动状态 实例 禁用状态 实例 分页大小 实例 分页对齐 实例 面包屑(Breadcrumbs) 实例 加载器 彩色加载器 在 Bootstr…

竞赛 基于情感分析的网络舆情热点分析系统

文章目录 0 前言1 课题背景2 数据处理3 文本情感分析3.1 情感分析-词库搭建3.2 文本情感分析实现3.3 建立情感倾向性分析模型 4 数据可视化工具4.1 django框架介绍4.2 ECharts 5 Django使用echarts进行可视化展示5.1 修改setting.py连接mysql数据库5.2 导入数据5.3 使用echarts…

GeoSOS-FLUS未来土地利用变化情景模拟模型

软件简介 适用场景 GeoSOS-FLUS软件能较好的应用于土地利用变化模拟与未来土地利用情景 的预测和分析中,是进行地理空间模拟、参与空间优化、辅助决策制定的有效工 具。FLUS 模型可直接用于: 城市发展模拟及城市增长边界划定;城市内 部高分…

Debian 12快速安装图解

文章目录 Debian 12安装图解创建虚拟机安装系统登录并用光盘离线安装sudo、curl解决Linux下sudo更改文件权限报错保存快照debain添加在线源(配置清华源)参考 Debian 12安装图解 Debian选择CD安装非常慢,本次安装选择DVD离线安装。 下载 https://www.debian.org/CD…

Swift如何使用Vision来识别获取图片中的文字(OCR),通过SwiftUI视图和终端命令行,以及一系列注意事项

在过去的一年里,我发现苹果系统中的“文字搜图片”功能非常好用,这个功能不光 iPhone/iPad,Mac 也有,找一些图片真的很好用。但是遇到了一个问题:这个功能需要一段时间才能找到新的图片,而且没法手动刷新&a…

从一到无穷大 #15 Gorilla,论黄金26H与时序数据库缓存系统的可行性

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。 本作品 (李兆龙 博文, 由 李兆龙 创作),由 李兆龙 确认,转载请注明版权。 引言 缓存系统的高效存在前提,在满足前提的情况下可以接受缺陷便没有理由不引入缓…

pdf添加水印

给pdf文件添加水印 引入依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency>添加水印 package com.it2.pdfdemo02.util;import com.itextpdf.tex…

Qt应用程序连接达梦数据库-飞腾PC麒麟V10

目录 前言1 安装ODBC1.1 下载unixODBC源码1.2 编译安装1.4 测试 2 编译QODBC2.1 修改 qsqldriverbase.pri 文件2.2 修改 odbc.pro 文件2.3 编译并安装QODBC 3 Qt应用程序连接达梦数据库测试4 优化ODBC配置&#xff0c;方便程序部署4.1 修改pro文件&#xff0c;增加DESTDIR 变量…