树模型集成学习(Tree Embedding)

2023-10-26

树模型集成学习

集成学习主要有两个思想,分别是bagging和boosting。树模型的集成模型都是使用树作为基模型,最常用的cart树,常见的集成模型有RandomForest、GBDT、Xgboost、Lightgbm、Catboost。

概要介绍

RandomForest

随机森林(Random Forest,RF)是Bagging的一个扩展变体。RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。既然模型叫做随机森林,森林我们可以理解为是多棵树的集合就是森林,随机主要有两个点进行有放回的采样,

  1. 每次建树特征个数随机选择
  2. 每次建树样本个数随机选择

随机森林中基学习器的多样性不仅来自样本扰动,还来自属性扰动,这就使得最终集成得泛化性能可通过个体学习器之间差异度得增加而进一步提升。使得模型更加鲁棒。

GBDT

GBDT使用的是加法模型和前向分布算法,而AdaBoost算法是前向分布加法算法的特例,前向分布算法学习的是加法模型,当基函数为基本分类器时,该加法模型等价于Adaboost的最终分类器。
GBDT也是迭代,使用了前向分布算法,但是弱学习器限定了只能使用CART回归树模型,同时迭代思路和Adaboost也有所不同。在GBDT的迭代中,假设我们前一轮迭代得到的强学习器是, 损失函数是, 我们本轮迭代的目标是找到一个CART回归树模型的弱学习器,让本轮的损失函数最小。也就是说,本轮迭代找到决策树,要让样本的损失尽量变得更小。GBDT本轮迭代只需拟合当前模型的残差。

Xgboost

Xgboost是gbdt的改进或者说是梯度提升树的一种,Xgb可以说是工程上的最佳实践模型,简单的说xgb=gbdt+二阶梯度信息+随机特征和样本选择+特征百分位值加速+空值特征自动划分。还有必要的正则项和最优特征选择时的并行计算等。

Lightgbm

首先,GBDT是一个非常流行的机器学习算法,另外基于GBDT实现的XGBoost也被广泛使用。但是当面对高纬度和大数据量时,其效率和可扩展性很难满足要求。主要的原因是对于每个特征,我们需要浏览所有的数据去计算每个可能分裂点的信息增益,真是非常耗时的。基于此,提出了两大技术:Gradient-based One-Side Sampling (GOSS) and Exclusive Feature Bundling (EFB).

catboost

CatBoost = Category + Boosting.
2017年7月21日,俄罗斯Yandex开源CatBoost,亮点是在模型中可直接使用Categorical特征并减少了tuning的参数。

核心公式

gbdt的前向分布公式
  1. gbdt的前向分布公式
    (1) f m ( x ) = f m − 1 ( x ) + β m b ( x ; γ m ) f_m(x)=f_{m-1}(x)+\beta_m b(x;\gamma_m) \tag{1} fm(x)=fm1(x)+βmb(x;γm)(1)
  2. gbdt的第m轮的扶梯度公式
    (2) − [ ∂ L ( y , f ( x i ) ) ∂ f ( x i ) ] f ( x ) = f m − 1 ( x ) -\left[ \frac{\partial L(y,f(x_i))}{\partial f(x_i)} \right]{f(x)=f{m-1}(x)} \tag{2} [f(xi)L(y,f(xi))]f(x)=fm1(x)(2)
  3. gbdt格式化损失函数
    (3) L ( y , f m ( x ) ) = L ( y , f m − 1 ( x ) + β m b ( x ; γ m ) ) L(y,f_m(x))=L(y,f_{m-1}(x)+\beta_m b(x;\gamma_m)) \tag{3} L(y,fm(x))=L(y,fm1(x)+βmb(x;γm))(3)
  4. 泰勒展开式
    若函数f(x)在包含x0的某个闭区间[a,b]上具有n阶导数,且在开区间(a,b)上具有(n+1)阶导数,则对闭区间[a,b]上任意一点x,成立下式:
    (4) f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + . . . + f ( n ) ( x 0 ) n ! ( x − x 0 ) n + R n ( x ) f(x)=f(x_0)+f'(x_0)(x-x_0)+\frac{f''(x0)}{2!}(x-x_0)^2+ ... + \frac{f^{(n)}(x_0)}{n!}(x-x_0)^n+R_n(x) \tag{4} f(x)=f(x0)+f(x0)(xx0)+2!f(x0)(xx0)2+...+n!f(n)(x0)(xx0)n+Rn(x)(4) (5) f ( x + Δ x ) = f ( x ) + f ′ ( x ) Δ x + 1 2 ! f ′ ′ ( x ) Δ x 2 + . . . + 1 n ! f ( n ) ( x ) Δ x n + R n ( x ) f(x+\Delta x)=f(x)+f'(x)\Delta x + \frac{1}{2!}f''(x)\Delta x^2+...+\frac{1}{n!}f^{(n)}(x)\Delta x^n+R_n(x) \tag{5} f(x+Δx)=f(x)+f(x)Δx+2!1f(x)Δx2+...+n!1f(n)(x)Δxn+Rn(x)(5)
    其中, R n ( x ) R_n(x) Rn(x) ( x − x 0 ) n (x-x_0)^n (xx0)n的高阶无穷小.
  5. xgboost的目标公式(t轮迭代)
    (6) o b j ( t ) = ∑ i = 1 n l ( y i , y ^ i t ) + ∑ i = 1 t Ω ( f i ) obj^{(t)}=\sum_{i=1}^{n}l(y_i,\hat{y}_i^t)+\sum_{i=1}^{t}\Omega(f_i) \tag{6} obj(t)=i=1nl(yi,y^it)+i=1tΩ(fi)(6)
    (7) = ∑ i = 1 n l ( y , y ^ i ( t − 1 ) + f t ( x i ) ) + Ω ( f t ) + c o n s t a n t =\sum_{i=1}^{n}l(y,\hat y_{i}^{(t-1)}+f_t(x_i))+\Omega(f_t)+constant \tag{7} =i=1nl(y,y^i(t1)+ft(xi))+Ω(ft)+constant(7)
  6. xgboost损失函数的泰勒二阶展开
    (8) l ( t ) ≂ ∑ i = 1 n [ l ( y i , y ^ ( t − 1 ) ) + g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) l^{(t)} \eqsim \sum_{i=1}^{n}[l(y_i,\hat y ^{(t-1)})+g_i f_t(x_i) + \frac{1}{2}h_i f_t^2(x_i)]+\Omega(f_t) \tag{8} l(t)i=1n[l(yi,y^(t1))+gift(xi)+21hift2(xi)]+Ω(ft)(8)
    其中,其中, l ( y i , y ^ ( t − 1 ) ) l(y_i,\hat y ^{(t-1)}) l(yi,y^(t1))是常数, g i = ∂ y ^ ( t − 1 ) l ( y i , y ^ ( t − 1 ) ) g_i=\partial_{\hat{y}^{(t-1)}}l(y_i, \hat{y}^{(t-1)}) gi=y^(t1)l(yi,y^(t1)), h i = ∂ y ^ ( t − 1 ) 2 l ( y i , y ^ ( t − 1 ) ) h_i=\partial_{\hat{y}^{(t-1)}}^2l(y_i, \hat{y}^{(t-1)}) hi=y^(t1)2l(yi,y^(t1)). . 常数对目标函数的优化不相关,于是可以将目标函数转化为如下:
    (9) l ( t ) = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) l^{(t)} = \sum_{i=1}^{n}[g_i f_t(x_i) + \frac{1}{2}h_i f_t^2(x_i)]+\Omega(f_t) \tag{9} l(t)=i=1n[gift(xi)+21hift2(xi)]+Ω(ft)(9)
    (10) = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + λ T + 1 2 ∑ j = 1 T ω j 2 =\sum_{i=1}^{n}[g_i f_t(x_i) + \frac{1}{2}h_i f_t^2(x_i)]+\lambda T+\frac{1}{2}\sum_{j=1}^{T}\omega_j^2 \tag{10} =i=1n[gift(xi)+21hift2(xi)]+λT+21j=1Tωj2(10)
    (11) = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) ω j + 1 2 ( ∑ i ∈ I j h i ) ω j 2 ] + λ T + 1 2 ∑ i = 1 T ω j 2 =\sum_{j=1}^{T}[(\sum_{i \in I_j}g_i) \omega_j + \frac{1}{2}(\sum_{i \in I_j}h_i) \omega_j^2] + \lambda T + \frac{1}{2}\sum_{i=1}^{T} \omega_j^2 \tag{11} =j=1T[(iIjgi)ωj+21(iIjhi)ωj2]+λT+21i=1Tωj2(11)
    (12) = ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + λ T + 1 2 ∑ j = 1 T ω j 2 =\sum_{i=1}^{n}[g_i f_t(x_i) + \frac{1}{2}h_i f_t^2(x_i)]+\lambda T+\frac{1}{2}\sum_{j=1}^{T}\omega_j^2 \tag{12} =i=1n[gift(xi)+21hift2(xi)]+λT+21j=1Tωj2(12)
    (13) = ∑ j = 1 T [ ( ∑ i ∈ I j g i ) ω j + 1 2 ( ∑ i ∈ I j h i + λ ) ω j 2 ] + λ T =\sum_{j=1}^{T}[(\sum_{i \in I_j}g_i) \omega_j + \frac{1}{2}(\sum_{i \in I_j}h_i+\lambda) \omega_j^2] + \lambda T \tag{13} =j=1T[(iIjgi)ωj+21(iIjhi+λ)ωj2]+λT(13)
    求上式最小化的参数,对\omega求导数并另其等于0,得到下式:
    (14) ∂ l ( t ) ∂ ω j = 0 \frac{\partial l^{(t)}}{\partial \omega_j}=0 \tag{14} ωjl(t)=0(14)
    (15) ∑ i ∈ I j + ( ∑ i ∈ I j h i + λ ) ω j = 0 \sum_{i \in I_j}+(\sum_{i \in I_j}h_i + \lambda) \omega_j=0 \tag{15} iIj+(iIjhi+λ)ωj=0(15)
    (16) ω j ∗ = − ∑ i ∈ I j g i ∑ i ∈ I j h i + λ \omega_j^*=-\frac{\sum_{i \in I_j}g_i}{\sum_{i \in I_j}h_i + \lambda} \tag{16} ωj=iIjhi+λiIjgi(16)
    将上式带入损失函数,得到最小损失:
    (17) l ^ ( t ) ( q ) = − 1 2 ∑ j = 1 T ( ∑ i ∈ I j g i ) 2 ∑ i ∈ I j h i + λ + γ T \hat{l}^{(t)}(q)=-\frac{1}{2}\sum_{j=1}^{T}\frac{(\sum_{i \in I_j}g_i)^2}{\sum_{i \in I_j}h_i+ \lambda}+\gamma T \tag{17} l^(t)(q)=21j=1TiIjhi+λ(iIjgi)2+γT(17)
    根据公式(17)可以作为特征分裂的指标.计算公式如下(这个值越大越好):
    (18) L s p l i t = 1 2 [ ( ∑ i ∈ I L g i ) 2 ∑ i ∈ I L h i + λ + ( ∑ i ∈ I R g i ) 2 ∑ i ∈ I R h i + λ − ( ∑ i ∈ I g i ) 2 ∑ i ∈ I h i + λ ] − λ L_{split}=\frac{1}{2} \left[ \frac{(\sum_{i \in I_L}g_i)^2}{\sum_{i \in I_L}h_i+\lambda} + \frac{(\sum_{i \in I_R}g_i)^2}{\sum_{i \in I_R}h_i+\lambda} - \frac{(\sum_{i \in I}g_i)^2}{\sum_{i \in I}h_i+\lambda} \right ] - \lambda \tag{18} Lsplit=21[iILhi+λiILgi)2+iIRhi+λiIRgi)2iIhi+λiIgi)2]λ(18)

算法十问

1.随机森林为什么能够更鲁棒?

由于随机森林使用了使用了行采样和列采样技术,是的每棵树不容易过拟合;并且是基于树的集成算法,由于使用了采用数据是的每棵树的差别较大,在进行embedding的时候可以更好的降低模型的方差,整体而言是的RF是一个鲁棒的模型。

2.RF分类和回归问题如何预测y值?

RF是一个加权平均的模型,是进行分类问题的时候,使用的个k个树的投票策略,多数服从少数。在回归的使用是使用的k个树的平均。可以看出来rf的训练和预测过程都可以进行并行处理。

3.相同数据量,训练RF和gbdt谁可以更快?谁对异常值不敏感?

gbdt是前向加法模型,由于第i棵树需要用到前i-1树的残差,所有在再整个建立过程是串行处理的,RF整体是bagging算法的一种,是k个树的加权平均,k棵树可以并行处理,因此可能得到更快的速度。需要指出在gbdt的原始算法中没有使用行列的随机采样,相反rf使用了随机采样。由于gbdt当前的误差会延续给下一棵树,而RF每次都是独立的随机采样,随机森林对异常值不敏感,GBDT对异常值非常敏感。

4.解释一个什么是gb,什么是dt,即为什么叫做gbdt?

gbdt(Gradient Boosting Decision Tree),dt是指Decision Tree表示使用决策树作为基学习器,使用的cart树,gb表示梯度提升,因为在传统的gbdt中在第i轮的迭代中,使用前i-1的梯度作为当前残差进行拟合。

5.gbdt为什么用负梯度代表残差?

上文公式(3)是gbdt的损失函数,对公式(3)进行在$f_{m-1}(x)处进行
泰勒的一阶展开:
L ( y , f m ( x ) ) = L ( y , f m − 1 ( x ) + β m b ( x ; γ m ) ) L(y,f_m(x))=L(y,f_{m-1}(x)+\beta_m b(x;\gamma_m)) L(y,fm(x))=L(y,fm1(x)+βmb(x;γm))
= L ( y , f m − 1 ( x ) ) + ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) ( f m ( x ) − f m − 1 ( x ) ) =L(y,f_{m-1}(x))+\frac{\partial L(y, f_{m-1}(x))}{\partial f_{m-1}(x)}(f_{m}(x)-f_{m-1}(x)) =L(y,fm1(x))+fm1(x)L(y,fm1(x))(fm(x)fm1(x))
(19) = L ( y , f m − 1 ( x ) ) + ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) ( β m b ( x ; γ m ) ) =L(y,f_{m-1}(x))+\frac{\partial L(y, f_{m-1}(x))}{\partial f_{m-1}(x)}(\beta_m b(x;\gamma_m)) \tag{19} =L(y,fm1(x))+fm1(x)L(y,fm1(x))(βmb(x;γm))(19)
从我们的目标是损失函数最小化,使公式(19)最小化,由于是个常数,所以我们的损失函数最小化可以转化为:
(20) a r g m i n ( β m , γ m ) = m i n ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) ( β m b ( x ; γ m ) ) argmin_{(\beta_m,\gamma_m)}=min \frac{\partial L(y, f_{m-1}(x))}{\partial f_{m-1}(x)}(\beta_m b(x;\gamma_m)) \tag{20} argmin(βm,γm)=minfm1(x)L(y,fm1(x))(βmb(x;γm))(20)
将上述式子的两项都看做是向量,为了是相乘之后最小,一定是向量之间的异号,因此得到:
(21) ( β m b ( x ; γ m ) ) = − ∂ L ( y , f m − 1 ( x ) ) ∂ f m − 1 ( x ) (\beta_m b(x;\gamma_m)) = - \frac{\partial L(y, f_{m-1}(x))}{\partial f_{m-1}(x)} \tag{21} (βmb(x;γm))=fm1(x)L(y,fm1(x))(21)
从公式(20)可以看出第m棵树使用前m-1的负梯度作为残差,所有每次都是拟合的负梯度.

6.gbdt是训练过程如何选择特征?

gbdt使用基学习器是CART树,CART树是二叉树,每次使用yes or no进行特征选择,数值连续特征使用的最小均方误差,离散值使用的gini指数。在每次划分特征的时候会遍历所有可能的划分点找到最有的特征分裂点,这是用为什么gbdt会比rf慢的主要原因之一。

7.gbdt应用在多分类问题?

  • 对于多分类任务,GDBT的做法是采用一对多的策略也就是说,对每个类别训练M个分类器。假设有K个类别,那么训练完之后总共有M*K颗树。
  • 两层循环的顺序不能改变。也就是说,K个类别都拟合完第一颗树之后才开始拟合第二颗树,不允许先把某一个类别的M颗树学习完,再学习另外一个类别。
    在这里插入图片描述

8.RF和GBDT的区别?

GBDT是采用boosing方法,降低偏差;RF采用的是baggging方法,降低方差。其中GBDT中的核心是通过用分类器(如CART、RF)拟合损失函数梯度,而损失函数的定义就决定了在子区域内各个步长,其中就是期望输出与分类器预测输出的查,即bias;而RF的核心就是自采样(样本随机)和属性随机(所有样本中随机选择K个子样本选择最优属性来划分),样本数相同下的不同训练集产生的各个分类器,即数据的扰动导致模型学习性能的变化,即variance。

9.Xgboost相对gbdt做了哪些改进?

  • 传统GBDT以CART作为基分类器,xgboost还支持线性分类器,这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。
  • 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。顺便提一下,xgboost工具支持自定义代价函数,只要函数可一阶和二阶求导。
  • xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
  • 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
    对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
  • xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
  • 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

10.xgb如何在计算特征时加速的?

  • xgboost工具支持并行。boosting不是一种串行的结构吗?怎么并行的?注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
  • 可并行的近似直方图算法。树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以xgboost还提出了一种可并行的近似直方图算法,用于高效地生成候选的分割点。

11.xgb为什么使用二阶梯度信息,为什么不使用三阶或者更高梯度信息?

  • xgb之所以使用二阶梯度信息,是因为从泰勒展开式来看,gbdt使用的一阶梯度的泰勒展开式,丢失了很多的信息,使用二阶可以使损失函数更加准确。从泰勒展开的角度来看展开的次数越多越能更精准的表示损失函数的值,但是如果我们使用二阶梯度就要要求损失函数二阶可导,如果使用n阶展开就要求损失函数n阶可导,但是有很多损失函数不是n阶可导的,比如均方误差,因此使用二阶梯度信息是一个泰勒展开和损失函数选择的折中。

12.lgb相对xgb做了哪些改进?

  • 直方图算法,LightGBM提供一种数据类型的封装相对Numpy,Pandas,Array等数据对象而言节省了内存的使用,原因在于他只需要保存离散的直方图,LightGBM里默认的训练决策树时使用直方图算法,XGBoost里现在也提供了这一选项,不过默认的方法是对特征预排序,直方图算法是一种牺牲了一定的切分准确性而换取训练速度以及节省内存空间消耗的算法.
  • 在训练决策树计算切分点的增益时,预排序需要对每个样本的切分位置计算,所以时间复杂度是O(#data)而LightGBM则是计算将样本离散化为直方图后的直方图切割位置的增益即可,时间复杂度为O(#bins),时间效率上大大提高了(初始构造直方图是需要一次O(#data)的时间复杂度,不过这里只涉及到加和操作).
  • 直方图做差进一步提高效率,计算某一节点的叶节点的直方图可以通过将该节点的直方图与另一子节点的直方图做差得到,所以每次分裂只需计算分裂后样本数较少的子节点的直方图然后通过做差的方式获得另一个子节点的直方图,进一步提高效率
  • 节省内存,将连续数据离散化为直方图的形式,对于数据量较小的情形可以使用小型的数据类型来保存训练数据
    不必像预排序一样保留额外的对特征值进行预排序的信息
    减少了并行训练的通信代价.
  • 稀疏特征优化、直接支持类别特征、网络通信优化

13.比较一下catboost、lgb和xgb?

  • catboost自动采用特殊的方式处理类别型特征(categorical features)。首先对categorical features做一些统计,计算某个类别特征(category)出现的频率,之后加上超参数,生成新的数值型特征(numerical features)。这也是我在这里介绍这个算法最大的motivtion,有了catboost,再也不用手动处理类别型特征了。
  • catboost还使用了组合类别特征,可以利用到特征之间的联系,这极大的丰富了特征维度。
  • catboost的基模型采用的是对称树,同时计算leaf-value方式和传统的boosting算法也不一样,传统的boosting算法计算的是平均数,而catboost在这方面做了优化采用了其他的算法,这些改进都能防止模型过拟合。

14.如果将所有数据复制一倍放入训练数据集,RF和GBDT分别有什么表现?

RF可能出现过拟合? GBDT没有任何改变?(请思考)

15.gbdt如何防止过拟合?由于gbdt是前向加法模型,前面的树往往起到决定性的作用,如何改进这个问题?

一般使用缩减因子对每棵树进行降权,可以使用带有dropout的gbdt算法,dart树,随机丢弃生成的决策树,然后再从剩下的决策树集中迭代优化提升树。

16.RF/GBDT/XGB/lightGBM ?
在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

面试真题

  1. RF和GBDT能够并行吗?
  2. 写一个gbdt的损失函数?
  3. 为什么要拟合负梯度?
  4. xgboost如何进行参数更新的?
  5. xgboost为什么使用二阶梯度信息?
  6. gbdt对异常值敏感吗?为什么?

参考

  1. https://www.cnblogs.com/fujian-code/p/9018114.html
  2. https://blog.csdn.net/u010398493/article/details/77587749
  3. https://www.jianshu.com/p/49ab87122562
  4. https://blog.csdn.net/qq_22238533/article/details/79199605
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树模型集成学习(Tree Embedding) 的相关文章

  • openshift搭建Istio

    本文档覆盖了官方文档的Setup的所有章节 一 安装Istio 本次安装的Istio版本为1 7 0 环境为openshift 4 3 注 不建议使用openshift 1 11 即kubernetes 3 11 安装istio 可能会出现
  • HBase简介(很好的梳理资料)

    http jiajun iteye com blog 899632 一 简介 history started by chad walters and jim 2006 11 G release paper on BigTable 2007
  • 腾讯云如何修改域名DNS服务器

    当你在腾讯云购买域名后 如果 DNS 服务器不正确 要把域名 DNS 修改为提示的 DNS 地址 解析后才生效 下面老魏说下操作步骤 一 通过以下步骤查看 DNS 服务器是否正确 登录腾讯云控制台 选择 云产品 gt 域名与网站 gt 云解
  • 短视频seo矩阵系统源码开发与部署全解析

    在这个数字化快速发展的时代 短视频已经成为人们获取娱乐 学习 商业信息的主要途径之一 对于企业来说 利用短视频矩阵进行高效且精准的营销推广 无疑是一个重要的战略方向 本文将详细介绍如何进行短视频矩阵源码的开发与部署 一 开发篇 短视频矩阵源
  • linux 常用语句 grep、awk、sed

    复习资料 一 find grep 管道符 1 find 路径 name 文件名 查找文件 2 grep sex true 文本包含sex true 的行显示出来 3 grep sex true grep o age 18 对grep sex
  • 【Kettle】将【MySQL表按字段同步、更新】【脚本运行】

    前提数据 转换 1 表输入设置 2 插入 更新设置 作业 模块设置 SQL设置 手动输入脚本内容 每次运行都会运行此脚本
  • 十、工业相机与SCARA机械臂的坐标系标定

    注 感谢固高长江研究院徐工程师的技术讲解 以及matlab程序 机器人系统程序的提供 在工业现场当中 相机拍摄到的图像有一个相机坐标系 而机器人自身也有一个机器人自身的坐标系 两者互相独立 当我们通过相机进行对物体进行拍摄 通过模式识别得到
  • pygame 学习记录

    话不多说上代码 import pygame import sys pygame init size width height 900 700 speed 2 1 bg 255 255 255 RGB screen pygame displa
  • 文件上传的各种绕过方式

    1 前端绕过 更改前端的过滤方法进行绕过 1 通过浏览器插件来删除检查后援js代码 然后上传webshell 2 上传文件时把后缀名改成png格式 上传时在通过抓包工具把后缀名改回来 3 更改Content Tybe为image jpeg
  • C#连接sqlServer数据库详解

    C 是如何跟SQL Server进行连接的 在C NET程序设计中 离不开ADO NET ADO NET是 NET连接数据库的重要组件 使用其可以很方便地访问数据库 ADO NET还可以访问Oracle数据库 Access数据库 SQL S
  • Echarts dataZoom x轴横坐标缩放

    https echarts apache org zh option html dataZoom Echarts dataZoom x轴横坐标缩放 把 dataZoom 房子 option下的第一级 和 xAxis yAxis series
  • SpringBoot 启动成功监听

    CommandLineRunner 接口 启动成功后的回调 接口代码 package org springframework boot FunctionalInterface public interface CommandLineRunn
  • MySQL优化(二):MySQL 索引深入解读

    目录 一 索引是什么 1 索引定义 2 索引类型 3 索引的创建 4 索引的删除 二 索引存储模型 2 1 二分查找 2 2 二叉查找树 2 3 平衡二叉树 2 4 多路平衡查找树 B Tree 2 5 加强版多路平衡查找树 B Tree

随机推荐

  • 【统计模拟及其R实现】分层抽样法 / 条件期望法 习题答案(超详细)

    课本 统计模拟及其R实现 肖枝红 朱强 武汉大学出版社 参考资料 方差缩减技术 条件期望法 目录 1 分层抽样法 2 条件期望法 1 分层抽样法 题目1 如何通过分层抽样法得到
  • [人工智能-深度学习-51]:循环神经网络 - RNN基本原理详解

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 121387285 目录 第1章 详解前
  • gmapping 分析

    转载 这一篇先讲我对gmapping源码的理解 难免有错 欢迎指正 相互学习 原博客 https blog csdn net roadseek zw article details 53316177 博客主页 https blog csdn
  • [k8s部署踩过的坑]

    系统环境 系统版本 docker版本 role ip地址 CentOS8 4 2105 Linux version 4 18 0 348 xx Red Hat 8 5 0 4 20 10 12 k8s master 192 168 100
  • 冒泡排序详解

    一 冒泡排序简介 常用排序算法 冒泡排序 Bubble Sort 是一种常见的排序算法 相对来说比较简单 冒泡排序重复地走访需要排序的元素列表 依次比较两个相邻的元素 如果顺序 如从大到小或从小到大 错误就交换它们的位置 重复地进行直到没有
  • python海龟漂亮图案代码大全_带有海龟图案的Python花

    我在高中的编程课上和海龟图形一起工作 这个项目是按照老师演示的一些指导原则和功能制作一朵花 我在一个小时内就完成了 现在我正试图用更多的海龟一次画出多朵花 但我不能让海龟们使用新定义的函数 老师也没有时间和我一对一地讨论我该怎么做 所以 经
  • Cesium:入门教程(二)之数据源加载

    前言 成功运行 helloworld 的例子后 下面对控件 数据源等进一步说明 鼠标 左键单击和拖拽 沿着地球表面平移 调整相机位置 右键单击和拖拽 相机放大缩小 调整相机距离 滚轮 相机放大缩小 调整相机距离 中间按下和拖拽 围绕地球表面
  • Git命令介绍

    1 最小配置 在使用Git之前需要配置User信息 包括user name和user email git config global user name your name git config global user email your
  • openGL之API学习(八十二)glShaderSource

    替换着色器中的代码 任何以前的代码都会被完全替换掉 一次可以上传多段代码进行替换 并不进行代码的扫描和解析 替换完后是否需要重新进行编译和链接呢 因为着色器代码需要编译 连接 最后生成可执行文件才能被CPU GPU调度执行 所以替换完后还是
  • EasyImage简单图床 - 快速搭建私人图床云盘同时远程访问

    文章目录 1 前言 2 EasyImage网站搭建 2 1 EasyImage下载和安装 2 2 EasyImage网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar云端设置 3 2 Cpolar内网穿透本地
  • Maven插件之Dependency:analyze

    前言 完成新功能的开发后 在发包前组长告诉我要检查maven工程的依赖 并告诉我相关指令 此文记录一下使用方式 正文 简介 Maven官网之Dependency插件 Dependency插件提供了操纵artifact的能力 可以复制以及拆包
  • Loadrunner手写接口性能脚本

    Loadrunner手写接口性能脚本 文章目录 概述 脚本录制出现的问题 手写loadrunner脚本 概述 使用Loadrunner进行性能测试分为三步 1 创建 编辑脚本 2 运行负载测试 3 分析测试结果 脚本录制出现的问题 1 录制
  • mybatis如何防止SQL注入?

    sql注入发生的时间 sql注入发生的阶段在sql预编译阶段 当编译完成的sql不会产生sql注入 一 采用jdbc操作数据时候 String sql update ft proposal set id id PreparedStateme
  • 【rust/egui】(十一)使用rfd选择文件并使用serde_json进行序列化

    说在前面 rust新手 egui没啥找到啥教程 这里自己记录下学习过程 环境 windows11 22H2 rust版本 rustc 1 71 1 egui版本 0 22 0 eframe版本 0 22 0 上一篇 这里 rfd Rusty
  • 学习笔记之以太网帧结构

    在TCP IP中 以太网的IP数据报文的封装格式由RFC 894定义 IEEE802 3网络的IP数据报文封装由RFC 1042定义 当今最常使用的封装格式是RFC894定义的格式 通常称为Ethernet II或者Ethernet DIX
  • openGL之API学习(一零零)glProgramParameter

    给着色器程序传递参数 void glProgramParameteri GLuint program GLenum pname GLint value program Specifies the name of a program obje
  • python 散点图_

    Python中绘制散点图常用的函数是 matplotlib pyplot scatter 它的主要参数如下 matplotlib pyplot scatter x y s None c None marker None cmap None
  • 【SpringBoot】1、SpringBoot整合JWT实现Token验证

    这里写目录标题 1 单点登录 1 1 单系统登录 1 1 1 单系统登录流程 使用Session实现单系统登录 1 2 多系统 单点 登录 1 2 1 单点登录实现方案 1 2 1 1 Session跨域 1 2 1 2 Spring Se
  • python迭代器和可迭代对象

    1 迭代器 vs 可迭代对象 python中两个迭代的概念 一个叫做迭代器 Iterator 一个叫做可迭代对象 Iterable 我们可以从collections模块中导入 from collections abc import Iter
  • 树模型集成学习(Tree Embedding)

    树模型集成学习 集成学习主要有两个思想 分别是bagging和boosting 树模型的集成模型都是使用树作为基模型 最常用的cart树 常见的集成模型有RandomForest GBDT Xgboost Lightgbm Catboost