文章目录

  • 一、xgboost简介
  • 二、xgboost原理
    • 1.从目标函数生成一棵树
      • 1.1学习第t颗树
      • 1.2xgboost的目标函数
      • 1.3泰勒公式展开
      • 1.4定义一棵树
      • 1.5定义树的复杂度
      • 1.6叶子节点归组
      • 1.7树结构打分
    • 2.一棵树的生成细节
      • 2.1最优切分点划分算法
        • 2.1.1贪心算法
        • 2.1.2近似算法
      • 2.2加权分位数缩略图
      • 2.3稀疏感知算法
  • 三、xgboost的工程实现
    • 3.1列块并行学习
    • 3.2缓存访问
    • 3.3 “核外”块计算
  • 四、xgboost的优缺点
    • 4.1优点
    • 4.2缺点

一、xgboost简介

  XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不错的成绩。XGBoost本质上还是一个GBDT,但是力争把速度和效率发挥到极致,所以叫X (Extreme) GBoosted。XGBoost是一个优化的分布式梯度增强库,旨在实现高效,灵活和便携。 它在Gradient Boosting框架下实现机器学习算法。 XGBoost提供了并行树提升(也称为GBDT,GBM),可以快速准确地解决许多数据科学问题。在数据科学方面,有大量的Kaggle选手选用XGBoost进行数据挖掘比赛,是各大数据科学比赛的必杀武器;在工业界大规模数据方面,XGBoost的分布式版本有广泛的可移植性,支持在Kubernetes、Hadoop、SGE、MPI、 Dask等各个分布式环境上运行,使得它可以很好地解决工业界大规模数据的问题。XGBoost利用了核外计算并且能够使数据科学家在一个主机上处理数亿的样本数据。最终,将这些技术进行结合来做一个端到端的系统以最少的集群系统来扩展到更大的数据集上。Xgboost以CART决策树为子模型,通过Gradient Tree Boosting实现多棵CART树的集成学习,得到最终模型。

二、xgboost原理

1.从目标函数生成一棵树

  XGBoost和GBDT两者都是boosting方法,boosting方法实际采用加法模型(基函数的线性组合)与前向分布算法。XGBoost和GBDT除了工程实现、解决问题上的一些差异外,最大的不同就是目标函数的定义。因此,本文我们从目标函数开始探究XGBoost的基本原理。

1.1学习第t颗树

  XGBoost是由 kkk 个基模型组成的一个加法模型,假设我们第ttt 次迭代要训练的树模型是 ft(x)f_{t}(x)ft​(x) ,则有:

1.2xgboost的目标函数

  损失函数可由预测值 y^i\hat{y}_{i}y^​i​ 与真实值yi{y}_{i}yi​进行表示:

其中,nnn为样本数量。
  模型的预测精度是由模型的偏差与方差共同决定的,损失函数代表了模型的偏差,想要方差小则需要在目标函数中添加正则项,用于防止过拟合。
所以目标函数由模型的损失函数LLL与抑制模型复杂度的正则项 ΩΩΩ组成,目标函数的定义如下:

其中,∑i=1tΩ(fi)\sum_{i=1}^{t}{\Omega(f_{i})}∑i=1t​Ω(fi​)是将全部ttt颗树的复杂度进行求和,添加到目标函数作为正则项,用于防止模型过拟合。
  由于xgboost是boosting方法,实际采用了加法模型与前向分布算法,以第ttt个模型为例,模型对第iii个样本xix_ixi​的预测值为:

其中,y^it−1\hat{y}_{i}^{t-1}y^​it−1​是由第t−1t-1t−1个模型给出的预测值,是已知常数,ft(xi)f_{t}(x_i)ft​(xi​)是第ttt个模型的预测值。此时,目标函数写成:

注意:上式中,只有ft(xi)f_{t}(x_i)ft​(xi​)是变量,其余的都是已知量或可以通过已知量来计算出来的,上式中第二行到第三行的变形是将正则化项进行了拆分,由于前t−1t-1t−1颗树的结构已经确定,因此将前t−1t-1t−1颗树的复杂度之和用一个常量来表示。表示如下:

1.3泰勒公式展开

  泰勒公式是将一个在x=x0x=x_0x=x0​处具有nnn阶导数的函数f(x)f(x)f(x)利用关于(x−x0)(x-x_0)(x−x0​)的nnn次多项式来逼近函数的方法。若函数f(x)f(x)f(x)在包含x0x_0x0​的某个闭区间[a,b][a,b][a,b]上具有nnn阶导数,且在开区间(a,b)(a,b)(a,b)上具有n+1n+1n+1阶导数,则对闭区间[a,b][a,b][a,b]上任意一点xxx来说有:

其中多项式称为函数在x0x_0x0​处的泰勒展开式,Rn(x)R_{n}(x)Rn​(x)是泰勒公式的余项,且是(x−x0)(x-x_0)(x−x0​)的高阶无穷小。
  根据泰勒公式,把函数f(x+Δx)f(x+Δx)f(x+Δx)在xxx处进行泰勒的二阶展开,可得如下等式:

  回到xgboost的目标函数上来,f(x)f(x)f(x)对应的损失函数l(yi,y^i(t−1)+ft(xi))l(y_i,\hat{y}_{i}^{(t-1)}+f_{t}(x_i))l(yi​,y^​i(t−1)​+ft​(xi​)),与f(x+Δx)f(x+Δx)f(x+Δx)相比,xxx对应前t−1t-1t−1颗树的预测值y^i(t−1)\hat{y}_{i}^{(t-1)}y^​i(t−1)​,ΔxΔxΔx对应于正在训练的第ttt颗树ft(xi)f_{t}(x_i)ft​(xi​),损失函数可写为:

其中,gig_igi​是损失函数的一阶导,hih_ihi​是损失函数的二阶导,这里的导是指对y^i(t−1)\hat{y}_{i}^{(t-1)}y^​i(t−1)​求导。以平方损失函数为例:

  将上述的泰勒二阶展开式,带入到xgboost的目标函数中,得到的目标函数近似值为:

由于第ttt步时,y^i(t−1)\hat{y}_{i}^{(t-1)}y^​i(t−1)​已经是一个已知值,所以l(yi,y^i(t−1))l(y_i,\hat{y}_{i}^{(t-1)})l(yi​,y^​i(t−1)​)是一个常数,其对函数优化不会产生影响。去掉全部常数项,得到的目标函数为:

我们可以得到,我们只需要求出每一步损失函数的一阶导和二阶导的值(在每一步求损失函数时,前一步的y^i(t−1)\hat{y}_{i}^{(t-1)}y^​i(t−1)​是一个已知值,一阶导与二阶导都是常数)然后最优化目标函数,就可以得到每一步的f(x)f(x)f(x),最后根据加法模型得到一个整体模型。

1.4定义一棵树

  我们知道XGBoost的基模型不仅支持决策树,还支持线性模型,本文我们主要介绍基于决策树的目标函数。我们可以重新定义一棵决策树,其包括两个部分:

  • 叶子节点的权重向量www
  • 实例(样本)到叶子节点的映射关系qqq(本质是数的分支结构)

1.5定义树的复杂度

  决策树的复杂度 Ω\OmegaΩ 可由叶子数TTT 组成,叶子节点越少模型越简单,此外叶子节点也不应该含有过高的权重 www(类比 LR 的每个变量的权重),所以目标函数的正则项由生成的所有决策树的叶子节点数量,和所有节点权重所组成的向量的 L2L 2L2范式共同决定。

1.6叶子节点归组

  我们将属于第 jjj个叶子结点的所有样本xix_{i}xi​划入到一个叶子结点的样本集合中,数学表示为:Ij={i∣q(xi)=j}I_{j} = \left\{ i|q(x_{i}) = j \right\}Ij​={i∣q(xi​)=j},那么XGBoost的目标函数可以写成:
上式中第二行到第三行的解释:第二行是遍历所有样本后求每一个样本的损失函数。但是样本最终会落在叶子节点上,所以我们可以遍历叶子节点,然后获取叶子节点上的样本集合,最后再求损失函数。即我们之前是单个样本,现在改成了叶子节点集合,由于一个叶子节点有多个样本存在,因此有了∑i∈Ijgi\sum_{i\in{I_j}}g_i∑i∈Ij​​gi​和∑i∈Ijhi\sum_{i\in{I_j}}h_i∑i∈Ij​​hi​这两项,wjw_jwj​是第jjj个叶子节点的权重
  为了简化表达式,我们定义Gi=∑i∈IjgiG_i=\sum_{i\in{I_j}}g_iGi​=∑i∈Ij​​gi​,Hj=∑i∈IjhiH_j=\sum_{i\in{I_j}}h_iHj​=∑i∈Ij​​hi​,含义如下:

  • GiG_iGi​是叶子节点jjj所包含样本的一阶偏导数累加之和,是一个常量
  • HiH_iHi​是叶子节点jjj所包含样本的二阶偏导数累加之和,是一个常量

将GiG_iGi​和HiH_iHi​代入目标函数,则最终目标函数的表达式为:

这里我们要注意 GiG_iGi​和HiH_iHi​是前 t−1t − 1t−1 步得到的结果,其值已知可视为常数,只有最后一棵树的叶子节点wjw_jwj​不确定。

1.7树结构打分

  假如有一个一元二次函数形式如下:

利用一元二次函数最值公式很容易得到最值点:

那么xgboost的最终目标函数Obj(t)Obj^{(t)}Obj(t),该如何求出它的最值?

  • 对于每个叶子节点jjj,可以将其从目标函数中拆解出来:

    GiG_iGi​和HiH_iHi​是前 t−1t − 1t−1 步得到的结果,其值已知可视为常数,只有最后一棵树的叶子节点wjw_jwj​不确定,这个式子就可以看做是只含叶子节点wjw_jwj​的一元二次函数,我们可以通过最值公式求出它的最值点。
  • 对于目标函数Obj(t)Obj^{(t)}Obj(t),可以发现,各个叶子节点的目标子式是相互独立的,即每一个叶子节点的子式都达到最值点时,整个目标函数Obj(t)Obj^{(t)}Obj(t)才达到最值点。

那么,假设目前树的结构已经固定,套用一元二次函数的最值公式,将目标函数对wjw_jwj​求一阶导,并令其等于0,则可以求得叶子节点jjj对应的权值:

目标函数可以化简为:

上图给出目标函数计算的例子,求每个节点每个样本的一阶导数gig_{i}gi​和二阶导数hih_{i}hi​,然后针对每个节点对所含样本求和得到 GjG_{j}Gj​和HjH_{j}Hj​,最后遍历决策树的节点即可得到目标函数。

2.一棵树的生成细节

2.1最优切分点划分算法

  在实际训练过程中,当建立第ttt颗树时,一个最关键的问题是如何找到叶子节点的最优切分点,xgboost支持两种分裂节点的方法—贪心法和近似算法。

2.1.1贪心算法

从树的深度为0开始:

  1. 对每个叶结点枚举所有的可用特征
  2. 针对每个特征,把属于该节点的训练样本根据该特征值进行升序排列,通过线性扫描的方式来决定该特征的最佳分裂点,并记录该特征的分裂收益
  3. 选择收益最大的特征作为分裂特征,用该特征的最佳分裂点作为分裂位置,在该节点上分裂出左右两个新节点,并为每个新节点关联对应的样本集
  4. 回到第一步,递归执行直到满足特定条件为止。

那么如何计算每一个特征的分裂收益呢?
  假设我们在某一个节点完成特征分裂,则分裂前的目标函数为:

分裂后的目标函数为:

则对于目标函数来说,分裂后的收益为:

观察分裂后的收益,我们会发现节点划分不一定会使得结果变好,因为我们有一个引入新叶子的惩罚项,也就是说引入的分割带来的增益如果小于一个阀值的时候,我们可以剪掉这个分割。
注意:该特征收益可以作为特征重要性输出的重要依据

对于每次分裂,我们需要枚举出所有特征可能的分割方案,如何高效地枚举所有的分割呢
  假设我们要枚举某个特征所有x<ax<ax<a条件的样本,对于某个特征的分割点aaa,我们要计算aaa左边与右边的导数和。

我们可以发现对于所有的分裂点aaa ,只要做一遍从左到右的扫描就可以枚举出所有分割的梯度和 GL、GRG_L、G_RGL​、GR​。然后用上面的公式计算每个分割方案的收益就可以了。

2.1.2近似算法

  贪心算法可以给出精确解,但是当数据不能完全加载到内存时,精确贪心算法会变得 非常低效,算法在计算过程中需要不断在内存与磁盘之间进行数据交换,这是个非常耗时的过程, 并且在分布式环境中面临同样的问题。为了能够更高效地选 择最优特征及切分点, XGBoost提出一种近似算法来解决该问题。 基于直方图的近似算法的主要思想是:对某一特征寻找最优切分点时,首先对该特征的所有切分点按分位数 (如百分位) 分桶, 得到一个候选切分点集。特征的每一个切分点都可以分到对应的分桶; 然后,对每个桶计算特征统计G和H得到直方图, G为该桶内所有样本一阶特征统计g之和, H为该桶内所有样本二阶特征统计h之和; 最后,选择所有候选特征及候选切分点中对应桶的特征统计收益最大的作为最优特征及最优切分点。
  对于每个特征,只考察分位点可以减小计算复杂度。近似算法首先根据特征分布的分位数提出了候选划分点,然后将连续型特征映射到由这些候选点划分的中(分桶),然后聚合统计信息找到所有区间的最佳分裂点。在提出候选划分点时有两种策略

  • Global:全局策略是在树构建的初始阶段对每一个特征确定一个候选切分点的集合, 并在该树每一层的节点分裂中均采用此集合计算收益, 整个过程候选切分点集合不改变。
  • Local:本地策略则是在每一次节点分裂时均重新确定候选切分点。
    直观上来看,Local策略需要更多的计算步骤,而Global策略因为节点已有划分所以需要更多的候选点。

下图给出不同种分裂策略的AUC变化曲线,横坐标为迭代次数,纵坐标为测试集AUC,eps为近似算法的精度,其倒数为桶的数量。

从上图我们可以看到, Global 策略在候选点数多时(eps 小)可以和 Local 策略在候选点少时(eps 大)具有相似的精度。此外我们还发现,在eps取值合理的情况下,分位数策略可以获得与贪心算法相同的精度。全局策略需要更细的分桶才能达到本地策略的精确度, 但全局策略在选取候选切分点集合时比本地策略更简单。在XGBoost系统中, 用户可以根据需求自由选择使用精确贪心算法、近似算法全局策略、近似算法本地策略, 算法均可通过参数进行配置。
  近似算法简单来说,就是根据特征kkk的分布来确定lll个候选分位点Sk={sk1,sk2,...,skl}S_k=\left\{s_{k1},s_{k2},...,s_{kl}\right\}Sk​={sk1​,sk2​,...,skl​},然后根据这些候选切分点把相应的样本放入对应的桶中,对每个桶的G、HG、HG、H进行累加,最后在候选集合上贪心查找。该算法描述如下:

算法讲解:

  • 第一个for循环:对特征kkk根据该特征分布的分位数找到切割点的候选集合 Sk={sk1,sk2,...,skl}S_k=\left\{s_{k1},s_{k2},...,s_{kl}\right\}Sk​={sk1​,sk2​,...,skl​}。这样做的目的是提取出部分的切分点不用遍历所有的切分点。其中获取某个特征kkk的候选切割点的方式叫proposal(策略)。XGBoost 支持 Global 策略和 Local 策略。
  • 第二个for循环:将每个特征的取值映射到由该特征对应的候选点集划分的分桶区间,即 sk,v>=xj,k>sk,v−1s_{k,v}>=x_{j,k}>s_{k,v-1}sk,v​>=xj,k​>sk,v−1​。对每个桶区间内的样本统计值G、HG、HG、H进行累加,最后在这些累积统计的统计量上寻找最佳分裂点。这样做的目的是获取每个特征的候选分割点的G、HG、HG、H值

下图给出近似算法的具体例子,以三分位为例:


根据样本特征进行排序,然后基于分位数进行划分,并统计三个桶内的G、HG、HG、H值,最终求解节点划分的增益。

2.2加权分位数缩略图

  实际上,XGBoost不是简单地按照样本个数进行分位,而是以二阶导数值hih_ihi​作为样本的权重进行划分。为了处理带权重的候选切分点的选取,作者提出了Weighted Quantile Sketch算法。加权分位数略图算法提出了一种数据结构,这种数据结构支持merge和prune操作。在arXiv的最新版XGBoost论文中APPENDIX部分有该算法详细的描述,地址:https://arxiv.org/abs/1603.02754 。现在我们简单介绍加权分位数略图侯选点的选取方式,如下:

那么为什么要用二阶梯度hih_ihi​进行样本加权呢?

我们知道模型的目标函数为:

我们把目标函数配方整理成以下形式,可以看出hih_ihi​有对loss的加权作用。

其中,加入12gi2hi\frac{1}{2}\frac{g_i^2}{h_i}21​hi​gi2​​是因为gig_igi​和hih_ihi​是上一轮的损失函数求导是常数。我们可以看到hih_ihi​就是平方损失函数中样本的权重。

2.3稀疏感知算法

  实际工程中一般会出现输入值稀疏的情况。比如数据的缺失、one-hot编码都会造成输入数据稀疏。XGBoost在构建树的节点过程中只考虑非缺失值的数据遍历,而为每个节点增加了一个缺省方向,当样本相应的特征值缺失时,可以被归类到缺省方向上,最优的缺省方向可以从数据中学到。至于如何学到缺省值的分支,其实很简单,分别枚举特征缺省的样本归为左右分支后的增益,选择增益最大的枚举项即为最优缺省方向。
  在构建树的过程中需要枚举特征缺失的样本,乍一看这个算法会多出相当于一倍的计算量,但其实不是的。因为在算法的迭代中只考虑了非缺失值数据的遍历,缺失值数据直接被分配到左右节点,所需要遍历的样本量大大减小。作者通过在Allstate-10K数据集上进行了实验,从结果可以看到稀疏算法比普通算法在处理数据上快了超过50倍。

三、xgboost的工程实现

3.1列块并行学习

  在树的生成过程中,最耗时的一个步骤是在每次寻找最佳分裂点时都需要对特征的值进行排序。而xgboost在训练之前会根据特征对数据进行排序,然后保存到块结构中,并在每个块结构中都采用了稀疏矩阵存储格式(CSC)进行存储,后面的训练过程中会重复的使用块结构,可以大大减小工作量。
  作者提出通过按特征进行分块并排序,在块里面保存排序后的特征值及对应样本的引用,以便于获取样本的一阶、二阶导数值。具体方式如图:

通过顺序访问排序后的块遍历样本特征的特征值,方便进行切分点的查找。此外分块存储后多个特征之间互不干涉,可以使用多线程同时对不同的特征进行切分点查找,即特征的并行化处理。在对节点进行分裂时需要选择增益最大的特征作为分裂,这时各个特征的增益计算可以同时进行,这也是 XGBoost 能够实现分布式或者多线程计算的原因。

3.2缓存访问

  列块并行学习的设计可以减少节点分裂时的计算量,在顺序访问特征值时,访问的是一块连续的内存空间,但通过特征值持有的索引(样本索引)访问样本获取一阶、二阶导数时,这个访问操作访问的内存空间并不连续,这样可能造成cpu缓存命中率低,影响算法效率。
  为了解决缓存命中率低的问题,XGBoost 提出了缓存访问算法:为每个线程分配一个连续的缓存区,将需要的梯度信息存放在缓冲区中,这样就实现了非连续空间到连续空间的转换,提高了算法效率。此外适当调整块大小,也可以有助于缓存优化。

3.3 “核外”块计算

  当数据量非常大时,我们不能把所有的数据都加载到内存中。那么就必须将一部分需要加载进内存的数据先存放在硬盘中,当需要时再加载进内存。这样操作具有很明显的瓶颈,即硬盘的IO操作速度远远低于内存的处理速度,肯定会存在大量等待硬盘IO操作的情况。针对这个问题作者提出了“核外”计算的优化方法。具体操作为,将数据集分成多个块存放在硬盘中,使用一个独立的线程专门从硬盘读取数据,加载到内存中,这样算法在内存中处理数据就可以和从硬盘读取数据同时进行。此外,XGBoost 还用了两种方法来降低硬盘读写的开销:

  • 块压缩(Block Compression)。论文使用的是按列进行压缩,读取的时候用另外的线程解压。对于行索引,只保存第一个索引值,然后用16位的整数保存与该block第一个索引的差值。作者通过测试在block设置为 2162^{16}216个样本大小时,压缩比率几乎达到 26%∼29%26\% \sim 29\%26%∼29%
  • 块分区(Block Sharding )。块分区是将特征block分区存放在不同的硬盘上,以此来增加硬盘IO的吞吐量。

四、xgboost的优缺点

4.1优点

  • 精度更高
    GBDT 只用到一阶泰勒展开,而 XGBoost 对损失函数进行了二阶泰勒展开。XGBoost 引入二阶导一方面是为了增加精度,另一方面也是为了能够自定义损失函数,二阶泰勒展开可以近似大量损失函数;
  • 灵活性更强
    GBDT 以 CART 作为基分类器,XGBoost 不仅支持 CART 还支持线性分类器,使用线性分类器的 XGBoost 相当于带L1L1L1和L2L2L2 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)。此外,XGBoost 工具支持自定义损失函数,只需函数支持一阶和二阶求导;
  • 正则化
    XGBoost 在目标函数中加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、叶子节点权重的L2L2L2范式。正则项降低了模型的方差,使学习出来的模型更加简单,有助于防止过拟合,这也是XGBoost优于传统GBDT的一个特性。
  • Shrinkage(缩减)
    相当于学习速率。XGBoost 在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。传统GBDT的实现也有学习速率;
  • 列抽样
    XGBoost 借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算。这也是XGBoost异于传统GBDT的一个特性;
  • 缺失值处理
    对于特征的值有缺失的样本,XGBoost 采用的稀疏感知算法可以自动学习出它的分裂方向;
  • XGBoost工具支持并行
    boosting不是一种串行的结构吗?怎么并行的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t tt次迭代的代价函数里包含了前面t−1t-1t−1次迭代的预测值)。XGBoost的并行是在特征粒度上的。我们知道决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
  • 可并行的近似算法
    树节点在进行分裂时,我们需要计算每个特征的每个分割点对应的增益,即用贪心法枚举所有可能的分割点。当数据无法一次载入内存或者在分布式情况下,贪心算法效率就会变得很低,所以XGBoost还提出了一种可并行的近似算法,用于高效地生成候选的分割点。
  • 剪枝
    xgboost先从顶到底,建立所有可以建立的子树,再从底到顶进行反向剪枝。比起GBM,这样不容易陷入局部最优解
  • 内置交叉验证
    xgboost允许在每一轮boosting迭代中使用交叉验证。因此,我们可以方便的获取最优迭代次数。而GBM使用网格搜索,只能检测有限个值。

4.2缺点

  • 虽然利用预排序和近似算法可以降低寻找最佳分裂点的计算量,但在节点分裂过程中仍需要遍历数据集
  • 预排序过程的空间复杂度过高,不仅需要存储特征值,还需要存储特征对应样本的梯度统计值的索引,相当于消耗了两倍的内存。

附:
上文转载于深入了解XGBoost


如果对您有帮助,麻烦点赞关注,这真的对我很重要!!!如果需要互关,请评论留言!


机器学习—XGboost的原理、工程实现与优缺点相关推荐

  1. 机器学习算法原理:详细介绍各种机器学习算法的原理、优缺点和适用场景

    目录 引言 二.线性回归 三.逻辑回归 四.支持向量机 五.决策树 六.随机森林 七.K-均值聚类 八.主成分分析(PCA) 九.K近邻算法 十.朴素贝叶斯分类器 十一.神经网络 十二.AdaBoos ...

  2. xgboost参数原理详解,适合入门新人

    sklearn集成方法 bagging 常见变体(按照样本采样方式的不同划分) Pasting:直接从样本集里随机抽取的到训练样本子集 Bagging:自助采样(有放回的抽样)得到训练子集 Rando ...

  3. 机器学习中的特征工程

    机器学习中的特征工程 什么是特征工程 数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.特征工程指的是把原始数据转变为模型的训练数据的过程,它的目的就是获取更好的训练数据特征,使得机器 ...

  4. 加载svr模型_机器学习XGBoost实战,网格搜索自动调参,对比随机森林,线性回归,SVR【完整代码(含注释)+数据集见原文链接】...

    建议:阅读2020.8.7的文章,完全了解GDBT和XGBT的原理. 机器学习- XGBoost,GDBT[过程:决策树,集成学习,随机森林,GDBT,XGBT,LightGBM] 本次实践内容: 数 ...

  5. 机器学习从理论到工程的第二步-开发环境与工具篇

    在<第一步-编程语言篇>中,小夕为大家较为详细的介绍了做机器学习(及其相关应用方向)的编程语言的选择问题,这一篇便是小夕为大家推荐的各个编程语言的开发环境/工具. 习惯性扫盲开篇.鉴于可能 ...

  6. xgboost算法原理_从XGB到SecureBoost:看联邦学习XGB的算法原理

    摘要: 最近与某厂完成基于FATE的联邦学习框架的一个项目,第一次实践了一把联邦学习在实际业务场景中的应用,从模型评估结果来看,效果还不错.因此,本文将完成对于其中实现的提升算法SecureBoost ...

  7. 【机器学习】算法原理详细推导与实现(七):决策树算法

    [机器学习]算法原理详细推导与实现(七):决策树算法 在之前的文章中,对于介绍的分类算法有逻辑回归算法和朴素贝叶斯算法,这类算法都是二分类的分类器,但是往往只实际问题中yyy不仅仅只有{0,1}\{0 ...

  8. 机器学习之决策树原理

    机器学习之决策树原理 1 决策树简介 2 数学知识 ① 信息熵 ② 条件熵 ③ 信息增益 ④ 信息增益比(信息增益率) ⑤ 基尼指数(基尼系数) 3 决策树的构建过程 4 三种决策树算法 ① ID3 ...

  9. 机器学习中的特征工程——分类变量的处理

    出品 | CDA数据分析研究院,转载需授权 文章目录 分类变量 概念 判断 类型 少类别分类变量处理方法 独热编码(One-hot encoding) 虚拟编码(Dummy coding) 效应编码( ...

  10. XGBoost算法原理解释(转载)

    1.XGBoost算法原理 参考文章1 参考文章2 2.代码实战 train = pd.read_csv(r"./dataset/train.csv") train.head() ...

最新文章

  1. 想学习linux服务器、做运维、部署项目的同学看这,linux部署
  2. mysql 批量更新语句
  3. Code Issues 2,637 Pull requests 0 Projects 1 Wiki Security Insights Settings 使用filter node快速找到XML f
  4. Java 0xffffffff隐式类型转换的坑
  5. 使用Gradle引导旧式Ant构建
  6. SQL--Chapter8--Working with Triggers and Transactions
  7. python celery应用场景_python celery 模块
  8. C++函数申明对函数模板实例化的屏蔽
  9. python怎么读取dat类型文件_基于python批量处理dat文件及科学计算方法详解
  10. ClickHouse 实时数据去重final+group by
  11. 2022-07-25
  12. P1843 奶牛晒衣服
  13. 实现导出excel,pdf功能
  14. 谷歌浏览器截取整个网页为图片(无需插件)
  15. 计算机二级C语言选择题——01
  16. Unity利用JsonFX解析Json格式文本
  17. 学生成绩排名预测(DC)
  18. js + jquery 两栏Tab鼠标移入显示/隐藏的效果(详)
  19. 四相八拍步进c语言程序,四相八拍的步进电机简单的驱动
  20. NYOJ-20 吝啬的国度 AC

热门文章

  1. [物理学与PDEs]第2章第4节 激波 4.2 熵条件
  2. Visual Studio的.NET内存分配分析器解析
  3. 解题报告 noi 2005 智慧珠游戏(BT 搜索)
  4. vue-awesome-swiper 的安装和使用
  5. 【项目管理】------九大项目管理框架 (
  6. Memcache的 简介
  7. 一笔期货成交的始末(可能有问题)
  8. mysql限制用户只能访问指定数据库
  9. hdu 2670 01背包变形
  10. sdut Message Flood(c++ map)