精华内容
下载资源
问答
  • LightGBM详解--原理+技巧+参数
    千次阅读
    2020-02-12 15:36:04


      尽管XGBoost和pGBRT等对GBDT有所改善,但是LightGBM认为在数据量大、特征多的时候,XGBoost和pGBRT等的有效性和可拓展性仍然不被满足。一个最主要的原因是对于每一个特征,都需要遍历所有的数据样例,来估计所有可能分裂点的信息增益(这里叫增益比较恰当),正因如此,非常耗时。
      
      故LightGBM提出了两个改进思路,GOSS(Gradient-based One-Side Sampling,基于梯度的单边采样)和EFB(Exclusive Feature Bundling,互斥特征捆绑)。
         GOSS: 每个样本在计算信息增益过程中,有不同的梯度,由信息增益的定义可知,梯度大的样本会贡献较大的梯度。因此排除很大比例的梯度小的数据样例,用剩下的数据样本估计信息增益,证明梯度大的样本更重要。
         EFB:捆绑互斥的特征来减少特征数,尽管这是个NP问题,但一个贪心算法仍然能获得一个好的近似分数。因此,可以在不损失准确率的前提下,降低特征的个数。
      LightGBM可以认为是GBDT加入了GOSS和EFB的改善。在大量公开数据集的实验表明,LightGBM比GBDT快20多倍,并且准确率相当。
      
      GBDT+pre-sorted:通过忽略特征中的零值(稀疏性导致),来降低训练成本;
      GBDT+Histogram-based:无有效的稀疏优化方法,因为无论特征是否为0,都需要找到条件的箱值。
      

    LightGBM原理

    GOSS

      AdaBoost中每个样本有权重,但是GBDT中每个样本没有权重,因此AdaBoost中的抽样方法不能直接在GBDT中应用。但是GBDT的每个样本含有的梯度对数据抽样具有有用的信息。样本的梯度小,那么它的训练误差就小,总是训练的很好。一个直接的方法就是丢弃这些梯度小的样本,但是会导致数据分布变化,会损坏学习器的精度。为了避免这个问题,提出GOSS。
      正如上所述,GOSS为了避免数据分布改变的问题,其目的是选择梯度大的样本,对于梯度小的样本,采用下采样的方式,但在下采样过程中,仅仅随机地排除梯度小的样本,而仅仅随机排除,达到的效果比随机均匀下采样更好(疑问,梯度大小的判断标准是什么?)。
      GOSS先根据所有样本的梯度绝对值进行排序,选取前 a ∗ 100 % a*100\% a100%个样本(称为集合 A A A),在剩下的 ( 1 − a ) ∗ 100 % (1-a)*100\% (1a)100%个样本(称为集合 A c A^c Ac)中,随机抽取 b ∗ 100 % b*100\% b100%个样本(称为集合 B B B B B B的大小为 b ∗ ∣ A c ∣ b*|A^c| bAc)(则一共随机选取的梯度小的样本占比 b ∗ ( 1 − a ) ∗ 100 % b*(1-a)*100\% b(1a)100%)生成一个小梯度样本集。在小梯度样本计算信息增益时,乘以一个常数系数 1 − a b \frac{1-a}{b} b1a。这样,只需要更多的关注训练不足的样本,而没有较多的改变原始数据分布。
      
      GBDT的分裂准则:令 O O O为决策树的一个分裂节点上的训练数据,在这个分裂节点上,特征 j j j在点 d d d上分裂的方差增益为:
    V j ∣ O ( d ) = 1 n O ( ( ∑ { x i ∈ O : x i j ≤ d } g i ) 2 n l ∣ O j ( d ) + ( ∑ { x i ∈ O : x i j > d } g i ) 2 n r ∣ O j ( d ) ) V_{j | O}(d)=\frac{1}{n_{O}}\left(\frac{\left(\sum_{\left\{x_{i} \in O: x_{i j} \leq d\right\}} g_{i}\right)^{2}}{n_{l | O}^{j}(d)}+\frac{\left(\sum_{\left\{x_{i} \in O: x_{i j}>d\right\}} g_{i}\right)^{2}}{n_{r | O}^{j}(d)}\right) VjO(d)=nO1nlOj(d)({xiO:xijd}gi)2+nrOj(d)({xiO:xij>d}gi)2  where  n O = ∑ I [ x i ∈ O ] , n l ∣ O j ( d ) = ∑ I [ x i ∈ O : x i j ≤ d ]  and  n r ∣ O j ( d ) = ∑ I [ x i ∈ O : x i j > d ] \text { where } n_{O}=\sum I\left[x_{i} \in O\right], n_{l | O}^{j}(d)=\sum I\left[x_{i} \in O: x_{i j} \leq d\right] \text { and } n_{r | O}^{j}(d)=\sum I\left[x_{i} \in O: x_{i j}>d\right]  where nO=I[xiO],nlOj(d)=I[xiO:xijd] and nrOj(d)=I[xiO:xij>d]
      对于特征 j j j,决策树算法选择最优的分裂点 d j ∗ = a r g m a x d V j ( d ) d^*_j=argmax_dV_j(d) dj=argmaxdVj(d),然后计算最大的增益 V j ( d j ∗ ) V_j(d^*_j) Vj(dj),然后根据特征 j ∗ j^* j在点 d j ∗ d_{j^*} dj处将数据分裂为左右子节点。
      对于GOSS,在 A ∪ B A∪B AB集合上,通过估计方差增益 V ~ j ( d ) \tilde V_j(d) V~j(d)来划分数据, V ~ j ( d ) = 1 n ( ( ∑ x i ∈ A i g i + 1 − α b ∑ x i ∈ B l g i ) 2 n i j ( d ) + ( ∑ x i ∈ A r g i + 1 − a b ∑ x i ∈ B r g i ) 2 n r j ( d ) ) \tilde{V}_{j}(d)=\frac{1}{n}\left(\frac{\left(\sum_{x_{i} \in A_{i}} g_{i}+\frac{1-\alpha}{b} \sum_{x_{i} \in B_{l}} g_{i}\right)^{2}}{n_{i}^{j}(d)}+\frac{\left(\sum_{x_{i} \in A_{r}} g_{i}+\frac{1-a}{b} \sum_{x_{i} \in B_{r}} g_{i}\right)^{2}}{n_{r}^{j}(d)}\right) V~j(d)=n1(nij(d)(xiAigi+b1αxiBlgi)2+nrj(d)(xiArgi+b1axiBrgi)2)  where  A l = { x i ∈ A : x i j ≤ d } , A r = { x i ∈ A : x i j > d } , B l = { x i ∈ B : x i j ≤ d } , B r = { x i ∈ B : x i j > d } \text { where } A_{l}=\{x_i∈A:x_{ij}≤d\},A_r=\{x_i∈A:x_{ij}>d\},B_l=\{x_i∈B:x_{ij}≤d\},B_r=\{x_i∈B:x_{ij}>d\}  where Al={xiAxijd},Ar={xiA:xij>d},Bl={xiBxijd},Br={xiBxij>d}
      同时 1 − a b \frac {1-a}{b} b1a被用来归一化数据集 B B B的梯度之和。
      因此,通过GOSS,我们只需要在较小数据集上计算 V ~ j ( d ) \tilde V_j(d) V~j(d)来决定分裂点即可,而不需要在完整数据集计算。这样做的优点是(1)大幅降低计算成本;(2)不会损失多少训练准确性;(3)比随机抽样本表现更好。

      令 ε ( d ) = ∣ V ~ j ( d ) − V j ( d ) ∣ ε(d)=|\tilde V_j(d)-V_j(d)| ε(d)=V~j(d)Vj(d)作为GOSS的近似误差, g ˉ l j ( d ) = ∑ x i ∈ ( A ∪ A c ) l ∣ g i ∣ n l j ( d ) \bar{g}_{l}^{j}(d)=\frac{\sum_{x_{i} \in\left(A \cup A^{c}\right)_{l}}\left|g_{i}\right|}{n_{l}^{j}(d)} gˉlj(d)=nlj(d)xi(AAc)lgi g ˉ r j ( d ) = ∑ x i ∈ ( A ∪ A c ) r ∣ g i ∣ n r j ( d ) \bar{g}_{r}^{j}(d)=\frac{\sum_{x_{i} \in\left(A \cup A^{c}\right)_{r}}\left|g_{i}\right|}{n_{r}^{j}(d)} gˉrj(d)=nrj(d)xi(AAc)rgi,则 E ( d ) ≤ C a , b 2 ln ⁡ 1 / δ ⋅ max ⁡ { 1 n l j ( d ) , 1 n r j ( d ) } + 2 D C a , b ln ⁡ 1 / δ n , ( 1 ) \mathcal{E}(d) \leq C_{a, b}^{2} \ln 1 / \delta \cdot \max \left\{\frac{1}{n_{l}^{j}(d)}, \frac{1}{n_{r}^{j}(d)}\right\}+2 D C_{a, b} \sqrt{\frac{\ln 1 / \delta}{n}}, \quad \quad\quad (1) E(d)Ca,b2ln1/δmax{nlj(d)1,nrj(d)1}+2DCa,bnln1/δ ,(1)  where  C a , b = 1 − a b max ⁡ x i ∈ A c ∣ g i ∣ ,  and  D = max ⁡ ( g ˉ l j ( d ) , g ˉ r j ( d ) ) \text { where } C_{a, b}=\frac{1-a}{\sqrt{b}} \max _{x_{i} \in A^{c}}\left|g_{i}\right|, \text { and } D=\max \left(\bar{g}_{l}^{j}(d), \bar{g}_{r}^{j}(d)\right)  where Ca,b=b 1axiAcmaxgi, and D=max(gˉlj(d),gˉrj(d))
      基于此,有如下结论:(1)GOSS的渐近近似几率为 O ( 1 n l j ( d ) + 1 n r j ( d ) + 1 √ n ) O(\frac{1}{n_l^j(d)}+\frac{1}{n_r^j(d)}+\frac{1}{√n}) O(nlj(d)1+nrj(d)1+n1),如果分裂不平衡(例如 n l j ( d ) ≥ O ( √ n ) {n_l^j(d)}≥O(√n) nlj(d)O(n)或者 n r j ( d ) ≥ O ( √ n ) {n_r^j(d)}≥O({√n}) nrj(d)O(n)),则近似几率取决于式(1)的第二项(当n->∞,第二项趋向于0),这意味着当样本数量很大时,近似几率相当准确。(2)当 a = 0 a=0 a=0时,GOSS退化为随机采样算法,当 a = 1 a=1 a=1时,GOSS算法变为采取整个样本的算法。

      GOSS的泛化性能。令泛化误差为 ε g e n G O S S ( d ) = ∣ V ~ j ( d ) − V ∗ ( d ) ∣ ε^{GOSS}_{gen}(d)=|\tilde{V}_{j}(d)-V_*(d)| εgenGOSS(d)=V~j(d)V(d)(为抽样的训练样本方差增益与真实的方差增益之差) ≤ ∣ V ~ j ( d ) − V j ( d ) ∣ + ∣ V j ( d ) − V ∗ ( d ) ∣ ≜ ε G O S S ( d ) + ε g e n ( d ) ≤|\tilde{V}_{j}(d)-V_j(d)|+|V_{j}(d)-V_*(d)|≜ε_{GOSS}(d)+ε_{gen}(d) V~j(d)Vj(d)+Vj(d)V(d)εGOSS(d)+εgen(d),则采样可提高基学习器的多样性(潜在改善泛化表现)。

      以上说的是GOSS的样本采样的方式(不同于平常的随机抽样)。下面阐述EFB的特征采样方式(不同于一般的特征抽样方法)

    EFB

      实际应用过程中,尽管有大量的特征,但是很多特征都是相当稀疏的,这提供了一个几乎无损的方法来减少有效特征的数量的可能性。将互斥的特征捆绑为一个特征,设计一个有效的算法,将优化捆绑问题作为图着色问题,使用贪心算法,近似求解。对特征捆绑,可将复杂度从 O ( d a t a ∗ f e a t u r e ) O(data*feature) O(datafeature)降到 O ( d a t a ∗ b u n d l e ) O(data*bundle) O(databundle),其中 b u n d l e bundle bundle远远小于 f e a t u r e feature feature,这就是加速的原因。
      这涉及两个问题,(1)如何确定哪些特征应该被捆绑?(2)如何去构造这些捆绑?
      对于第一个问题,是一个 N P − h a r d NP-hard NPhard,即在多项式时间内,无法找到一个精确方式。因此找到一个近似算法。 a a a、将最优的捆绑问题转化为图着色问题(特征为点,如果任何两个特征之间不互斥,则添加边); b b b、用贪心的算法可产生合理的捆绑(一个常数逼近比率); c c c、因为有少部分特征,不是 100 % 100\% 100%互斥,若允许小的冲突,可以得到更小度量的特征绑定和提高计算效率(选择合适小的冲突比率,能平衡准确率和效率)。
      贪心算法:(1)构建带权重的边,该权重依赖于所以特征之间的总冲突;(2)根据特征度降序排序特征;(3)检查每个特征(排序列表中的),然后指派特征到一个存在的捆绑(包含小的冲突)或创建一个新的捆绑。其时间复杂度为 O ( f e a t u r e 2 ) O(feature^2) O(feature2)。特征数多时,时间复杂度较高,仍然不可接受,故可提出一个更高效的无图有序策略以进一步提升效率,依靠非零值的数量排序(和度排序非常相似),非零值呢个导致更高概率的冲突。
      对于第二个问题,为了降低训练复杂度,需要在同一个捆绑中,将特征进行整合。关键是确保原始特征能从特征捆绑中区分出来。由于基于直方图的算法将特征值以离散箱的形式存储而不是连续值存储,因此可以利用不同箱中的排他特征来构建特征捆绑。通过增加偏移估计,可以实现的这样的特征捆绑,达到减少特征的目的。
      EFB可以捆绑很多互斥特征至更稀疏的特征,对于零值特征可以避免不必要的计算。通过用表标记非零值来直接忽视零值特征以优化基础的直方图算法,可使直方图构建成本从 O ( d a t a ) O(data) O(data)降至 O ( n o n _ z e r o _ d a t a ) O(non\_zero\_data) O(non_zero_data),但值得注意的是,在整个树的生长过程中,用表标记的方法需要额外的内存和计算成本。

    直方图算法

      LIghtGBM选择了基于Histogram的决策树算法,相比于XGBoost采用预排序处理分裂节点,LightGBM的Histogram算法在内存消耗和计算代价上都有很多优势。
      直方图算法的原理:对于连续特征,先将连续的浮点特征值离散化为k整数,同时构造成一个宽度为k的直方图(bins);对于分类特征,每一种取值放入一个bin,且当取值的个数大于max bin数时,忽略那些很少出现的category值。在遍历数据的时候,根据离散化后的值作为索引,在直方图中累积统计量,然后根据直方图的离散值,遍历寻找最优的分割点(在XGBoost中需要遍历所有离散化的值,而LightGBM通过建立直方图只需要遍历k个直方图的值)。
      因此,在节点分裂的时候,不需要按照预排序算法那样对每个特征计算#data遍,仅需要计算#bins遍,大大加快了训练速度。
      直方图优化算法需要在训练前预先将特征值转化为bin value,也就是对每个特征的取值做个分段函数,将所有样本在该特征上划分到某一段(bin)中,最终把特征值从连续值转化成了离散值。值得注意的是,特征值对应的bin value在整个训练过程中是不会改变的。
      直方图优化算法过程:
      (1)对每个特征,为其创建一个直方图,这个直方图存储两类信息,分别是每个bin中样本的梯度之和,以及每个bin中样本数量。
      (2)对于每个特征,遍历所有的样本,累积上述的两类统计值到样本所属的bin中,即直方图的每个bin中包含了一定的样本,在此计算每个bin中的样本梯度之和并对bin中的样本计数。
      (3)对于某个叶节点,遍历所有的bin,分别以当前bin作为分割点,累加其左边的bin至当前bin的梯度和以及样本数量,并与父节点上的总梯度和以及总样本数量相减,得到右边所有bin的梯度和以及样本数量,并以此计算增益,在遍历过程中,取最大的增益,以此时的特征和bin的特征值作为分裂节点的特征和分裂特征取值。
      (4)对所有的叶节点,重复上述操作,遍历所有的特征,找到增益最大的特征及其划分值,以此来分裂该叶节点。
      从以上分析可知,有如下两个问题:

    问题一:如何将特征值映射到bin中?

      由于LightGBM可以处理类别特征,因此对连续特征和类别特征的处理方式是不一样的。
      (1)对于连续特征,可以得到数值型特征取值(负数,0,正数)的各个bin的切分点。
      (2)对于离散特征(LightGBM支持类别特征,采用many vs many方式,不需要做One-Hot编码),先对特征取值出现的次数排序(从大到小),忽略一些出现次数很少的特征取值,为每一个特征值建立一个bin容器,对于在bin容器内出现次数较少的特征值直接过滤掉,不建立bin容器。

    问题二:如何构建直方图

      对于离散特征或者连续特征,每一个划分阈值对应着一个bin容器编号,根据不同的bin容器,构建直方图,累加一阶和二阶梯度还有count。
      

    直方图作差加速

      对于Histogram算法,有一个技巧就是直方图作差加速:一个叶节点的直方图(梯度之和以及样本数量)可以由它的父节点的直方图与它兄弟的直方图作差得到。利用这个方法,LightGBM可以在构造一个叶节点(含有较少数据)的直方图后,可使用非常微小的代价就可以得到它兄弟叶节点(含有较多数据)的直方图。
      因为构建兄弟叶节点的直方图是作差得到的,时间复杂度仅为 O ( b i n s ) O(bins) O(bins),几乎可以忽略,比起不作差得到的兄弟节点的直方图,速可以提升一倍。

    leaf-wise分裂策略

      level-wise(XGBoost的)是指对每一层所有的节点做无差别分裂,尽管部分节点的增益比较小,依然会进行分裂,带来了不必要的开销(值得注意的是它容易多线程优化,方便控制模型复杂度,不容易过拟合)。
    在这里插入图片描述
      leaf-wise(LightGBM的)是指在当前所有叶节点中选择分类增益最大的节点进行分裂,并进行最大深度限制,避免过拟合。
    在这里插入图片描述
      在分裂次数相同的情况下,leaf-wise可以降低更多的误差,得到更好的精度。但leaf-wise的缺点是可能会长出比较深的决策树,容易过拟合,因此在leaf-wise之上增加了一个最大深度的限制,在保证高效的同时防止过拟合。

    LightGBM加速的原因

      LightGBM的加速主要来自于GOSS+EFB,以及并行处理,并且不会损失准确率。
      GOSS加速的原因:根据梯度抽样,用抽样后的数据训练树。但速度并未如抽样比例那样,因为抽样之前要对全样本进行梯度计算,并对全样本进行预测。值得注意的是,GOSS抽样方式优于随机抽样。
      EFB加速的原因:合并许多稀疏特征(包括One-Hot和隐式排他特征)为更少的特征(在捆绑过程中),基于直方图算法,其也改善了内存(许多先验的孤立特征被捆绑在一起)。
      高效并行加速:(1)特征并行,在不同的机器上的不同特征集上分别寻找最优的分割点,在机器间同步最优的分割点,其通过本地保存全部数据避免对数据切分结果的通信;(2)数据并行:不同的机器先在本地构造直方图,然后进行全局合并,最后在合并的直方图上寻找最优分割点,其使用分散规约(Reduce scatter)把直方图合并的任务分摊到不同的机器上,并利用直方图作差,降低了通信量,减少了通信时间。
      LightGBM的GOSS和EFB改进能处理大量数据和大量特征,能显著提高算力和降低内存消耗。

    LightGBM的优劣点

    优点

      1、由于使用基于直方图算法,效率高、内存使用低(内存消耗仅是预排序算法的1/8);
      2、用直方图算法的数据并行时,数据间通信代价低(值得注意的是,XGBoost也使用直方图来降低通信代价);
      3、计算上的优势是大幅减少了计算分割点增益的次数。对每个特征,预排序需要对每一个不同的特征值都计算一次分割增益,而直方图算法只需要计算#bins次;
      4、cache-miss。预排序中,对梯度的访问以及对于索引表的访问,造成严重的cache-miss问题。但直方图算法,在计算增益的时候,只需要对bin进行访问,造成的cache-miss问题小的多。

    劣处

      直方图算法不能找到很精确的分割点,因为它访问的是bins,但从实验结果来看,直方图算法的测试误差效果甚至更好。因为决策树对分割点的精确程度不太敏感,并且较“粗”的分割点也自带正则化的效果,再加上boosting算法本身就是弱分类器的集成。

      后续工作:对于GOSS,需要优化 a a a b b b的选择;对于EFB,需要优化处理更多的特征无论是否稀疏。

    LightGBM的参数

      控制参数
      max_depth:树的最大深度。当模型过拟合时,可以考虑首先降低max_depth。
      min_data_in_leaf:叶子可能具有的最小记录数。默认是20,过拟合时使用。
      feature_fraction:例如为0.8时,意味着在每次迭代中随机选择80%的参数来构建树。boosting为random forest时使用。
      bagging_fraction:每次迭代时用的数据比例。用于加快训练速度和缓解过拟合。
      early_stopping_round:如果一次验证数据的一个度量在最近的early_stopping_round回合中没有提高,模型将停止训练。加速分析,减少过多迭代。
      lambda_l1:L1正则化,也称reg_alpha,0~1。
      lambda_l2:L2正则化,也称reg_lambda,0~1。
      main_gain_to_split:描述分裂的最小gain。控制树有用的分裂。
      max_cat_group:在group边界上找到分割点。当类别数量很多的时候,找分割点容易过拟合。
      cat_smooth:default=10,用于分类特征,降低噪声在分类特征中的影响,尤其是对数据很少的类别。
      
      核心参数
      boosting:default=gbdt,还有rf,dart,doss。可选参数比XGBoost中多。
      num_thread:指定线程的个数,数字设置成CPU内核数比线程数训练更快,并行学习不应该设置成全部线程,这反而使得训练速度不佳。
      application:学习目标和损失函数,default=regression。
        regression:
          regression_l2:L2 loss, alias=regression, mean_squared_error, mse
          regression_l1:L1 loss, alias=mean_absolute_error, mae
          huber:Huber loss
          fair:Fair loss
          possion:Possion regression
          quartile:Quartile regression
          quartile_l2:类似于quartile,但使用了L2 loss
        binary: binary log loss classification application
        multi-class: classification
          multiclass:softmax目标函数,应该设置好num_class
          multiclassova:One-vs-All,二分类目标函数,应该设置好mun_class
        cross-entropy: application,取值为[0,1]
          xentropy:目标函数为cross-entropy(同时有可选择的线性权重),alias=cross_entropy
          xentlambda:替代参数化的cross-entropy,alias=cross_entropy_lambda
        lambdarank: lambdarank application
          在lambdarank任务中标签应该为int type,数值越大代表相关性越高(例如 0:bad,1:fair,2:good,3:perfect)
          label_gain:可以用来设置int标签的增益(权重)
      vaild:验证集选用,支持多验证集,以,分割
      learning_rate:梯度下降的步长,default=0.1,一般在0.05~0.2之间。
      num_leaves:default=31,这代表的是一棵树上的叶子树。
      device:default=cpu,options=cpu、gpu
        - 为树学习选择合适的设备,可以使用GPU来获得更快的学习速度。GPU默认使用32位浮点数来求和,也可以设置gpu_use_dp=tree来启用64位浮点数,但其训练速度更低;
        - 建议使用较小的max_bin(例如63)来获得更快的速度;
        参考相关指南构建GPU版本。
      
      度量参数
      metric:default={l2 for regression},{binary_logloss for binary classification},{ndcg for lambdarank}
        l1: absolute loss, alias=mean_absolute_error, mae
        l2: square loss, alias=mean_squared_error, mse
        l2_root: root square loss, alias=root_mean_squared_error, rmse
        quantile: Quantile regression
        huber: Huber loss
        fair: Fair loss
        possion Poisson regression
        ndcg: NDCG
        map: MAP
        auc: AUC
        binary_logloss: log loss
        binary_error: 样本: 0 的正确分类, 1 错误分类
        multi_logloss: mulit-class 损失日志分类
        multi_error: error rate for mulit-class 出错率分类
        xentropy: cross-entropy (与可选的线性权重), alias=cross_entropy
        xentlambda: “intensity-weighted” 交叉熵, alias=cross_entropy_lambda
        kldiv: Kullback-Leibler divergence, alias=kullback_leibler
        支持多指标,使用,分隔

    更多相关内容
  • 说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取。 1.项目背景 ...本项目提出一种基于集成学习的房价预测模型:LightGBM回归模...

    说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取。

    1.项目背景

           房地产不仅是国民经济的支柱产业,更和民生问题密不可分,随着房产越炒越热,人们对于房价的关注度也持续变高,因此能够较为精准地对房价进行预测也变得越来越有意义。房价作为多指标影响因子,不仅受时间,区域的影响,房屋年龄、附近地理条件、人文、交通等等因素也同样会对房价产生不同程度的影响。本项目提出一种基于集成学习的房价预测模型:LightGBM回归模型,使用LGBMRegressor算法。

    2.数据获取

    本次建模数据来源于网络(本项目撰写人整理而成),数据项统计如下:

    上述表格罗列了部分属性进行展示。

    数据详情如下(部分展示):

    3.数据预处理

    真实数据中可能包含了大量的缺失值和噪音数据或人工录入错误导致有异常点存在,非常不利于算法模型的训练。数据清洗的结果是对各种脏数据进行对应方式的处理,得到标准的、干净的、连续的数据,提供给数据统计、数据挖掘等使用。数据预处理通常包含数据清洗、归约、聚合、转换、抽样等方式,数据预处理质量决定了后续数据分析挖掘及建模工作的精度和泛化价值。以下简要介绍数据预处理工作中主要的预处理方法:

    3.1 用Pandas工具查看数据

    使用Pandas工具的head()方法查看前五行数据: 

    从上图可以看到,总共有81个字段:特征变量79个,其中Id只是一个索引,建模时我们要去掉它;另外,此数据集中有很多缺失数据。

    关键代码:

    3.2计算每个特征缺失值的百分比

    使用Pandas工具的isna() mean()方法计算每个特征缺失数据的百分比:计算出数据缺失超过50%的特征变量:

    从上图可以看到,总共有5个特征变量数据缺失超过80%,接下来本项目中将会删掉这些特征变量,不参与后面的建模。

    关键代码:

    3.3区分数值型特征和分类型特征

    通过Pandas工具的select_dtypes()方法来选择区分数值型特征和分类型特征,分类型特征需要进行相应的处理,以满足机器建模的需要。

    分类型特征如下: 

     数值型特征如下:

    关键代码如下:

     3.4特征变量空值情况统计

     

     通过上图可以看到,一些字段存在空值:针对

    'BsmtQual','BsmtCond','BsmtExposure','BsmtFinType1','BsmtFinType2','GarageType','GarageFinish','GarageQual','FireplaceQu','GarageCond' 这些字段用”None”值填充。

    针对'MSZoning', 'Utilities', 'Exterior1st', 'Exterior2nd', 'MasVnrType', 'Electrical', 'KitchenQual','Functional', 'SaleType' 这些字段用本数据项最频繁的数值进行填充。

    关键代码如下:

    4.探索性数据分析

    4.1 Utilities特征分布分析

    用Pandas工具的value_counts().plot()方法进行统计绘图,输出结果如下:

     图形化展示如下:

     从上面两个图中可以看到,分类为AllPub的有1459条,分类为NoSeWa的有1条,数据偏差非常大。

    4.2 Street特征分布分析

     

    从上面两个图中可以看到,分类为Pave的有1454条,分类为Grvl的有6条,数据偏差非常大。

    4.3 Condition2特征分布分析

     

    从上面两个图中可以看到,分类为Norm的有1445条,为其它类型的非常少,数据偏差非常大。

    4.4 RoofMatl特征分布分析

     

    从上面两个图中可以看到,分类为CompShg的有1434条,为其它类型的非常少,数据偏差非常大。

    4.5 Heating特征分布分析

     

    从上面两个图中可以看到,分类为GasA的有1428条,为其它类型的非常少,数据偏差非常大。

    4.6 房屋年龄的描述性统计分析

    首先通过YrSold和YearBuilt构造出房屋的年龄,然后通过Pandas工具的describe()方法进行描述性统计分析:

    从上图可以看到房屋年龄最小不到1年,最大136年,平均年龄在36年左右。

    4.7构造 TotalBsmtBath TotalBath TotalSA特征

    通过Pandas工具的head()方法进行查看如下:

     

    4.8分类特征的处理

    特征的处理分为两类:一种是有序的特征,针对这种特征直接进行数值的映射;另一种是编码类别特征,针对这种特征进行One Hot编码处理;处理结果如下:

    5.特征工程

    5.1 建立特征数据和标签数据

    SalePrice为标签数据,除 SalePrice之外的为特征数据。关键代码如下:

     

    5.2 数据集拆分

    训练集拆分,分为训练集和验证集,70%训练集和30%验证集。关键代码如下:

     

    6.构建lightgbm回归模型

    主要使用LGBMRegressor算法,用于目标回归。

    6.1模型参数

    关键代码如下:

    7.模型评估

    7.1评估指标及结果

    评估指标主要包括可解释方差值、平均绝对误差、均方误差、R方值等等。

     从上表可以看出,R方为89%  可解释方差值为89%,lightgbm回归模型比较优秀,效果非常好。

    关键代码如下:

    7.2 模型特征重要性

    由于特征比较多,选取前20个特征进行绘图展示: 

     

    从上图可以看到特征变量对此模型的重要性依次为:TotalSA、LotArea、1stFlrSF、GarageArea、TotalBsmtSF、GrLivArea、BsmtFinSF1、BsmtUnfSF、LotFrontage、OpenPorchSF、MasVnrArea、GarageYrBlt等等。

    7.3 真实值与预测值对比图

     

     从上图可以看出真实值和预测值波动基本一致,模型拟合效果非常棒。

    8.结论与展望

    综上所述,本文采用了lightgbm回归模型,最终证明了我们提出的模型效果良好。可用于日常金融中房屋销售价格的预测。

    本次机器学习项目实战所需的资料,项目资源如下:

    项目说明:
    链接:https://pan.baidu.com/s/1dW3S1a6KGdUHK90W-lmA4w 
    提取码:bcbp

    网盘如果失效,可以添加博主微信:zy10178083

    展开全文
  • Boosting算法(GBDT,XGBoost,LightGBM

    千次阅读 2018-11-25 21:15:13
    提升(Boosting)是一种机器学习技术,可以用于回归和分类问题,它每一步产生一个弱预测模型(如决策树),并加权累加到总模型加权累加到总模型;如果每一步的弱预测模型生成都是依据损失函数的梯度方向,则称之...

    1. 引言

    提升(Boosting)是一种机器学习技术,可以用于回归和分类问题,它每一步产生一个弱预测模型(如决策树),并加权累加到总模型中加权累加到总模型中;如果每一步的弱预测模型生成都是依据损失函数的梯度方向,则称之为梯度提升(Gradient Boosting)。
    梯度提升算法首先给定一个目标损失函数,它的定义域是所有可行的弱函数集合(基函数);提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部最小值。这种在函数域的梯度提升观点对机器学习的很多领域都有深刻影响。
    提升的理论意义:如果一个问题存在弱分类器,则可以通过提升的办法得到强分类器。

    2. Boosting算法基本原理

    • 给定输入向量 x 和输出变量 y 组成的若干训练样本(x1,y1)…(xn,yn),目标是找到近似函数F(X), 使得损失函数L (y, F(X))的损失值最小
    • L(y, F(X))的典型定义为
      在这里插入图片描述
      注:我们选择损失函数是和y的分布有关的,我们习惯选择第一个损失函数,这是我们是先验性认为y是服从正态分布的;当我们选择第二个损失函数我们是认为y服从拉布拉斯分布。
    • 确定最优函数F*(X),即(能够使损失函数值最小化的函数):
      Alt 图1 最小化函数
    • 假定F(X)是一组基函数f(X)的加权和:
      在这里插入图片描述

    Boosting算法推导

    目标:梯度提升方法寻找最优解,使得损失函数在训练集上的期望最小。

    1. 给定常函数F0(x):
      在这里插入图片描述

    2. 以贪心的思路扩展得到Fm(x):
      在这里插入图片描述

    3. 因为贪心法在每次选择最优基函数f时仍然困难,在这里使用梯度下降的方法近似计算。将样本带入到基函数f中得到f(x1),f(x2),f(x3)…f(xn),从而L退化为向量L(y1,f(x1)), L(y2, f(x2))…L(yn, f(xn) 在这里插入图片描述

    4. 上式中的权值γ为梯度下降的步长,可使用线性搜索求最优步长:
      在这里插入图片描述

    5. 初始化给定模型为常数
      在这里插入图片描述

    6. 对于m=1到m
      (1) 计算伪残差
      在这里插入图片描述
      (2)使用数据计算拟合残差fm(x)
      (3)计算步长γ:
      在这里插入图片描述
      此时(3)已经转化为一维优化问题
      (4)更新模型
      在这里插入图片描述

    3. GBDT( Gradient Boosting Decison Tree)

    概要

    • 梯度提升的典型基函数即决策树(特别是CART
    • GBDT的提升算法与上类似 f(x)即tm(x):
      在这里插入图片描述
      一个树最重要的就是叶子节点和他的权值,其中bjm的预测值(权值),I表示所属叶子节点。

    算法和上述提升算法类似但更为优化;

    参数设置和正则化

    • 对训练集拟合过高会降低模型的泛化能力,需要使用正则化技术来降低过拟合。对于复杂模型增加惩罚项,如:模型复杂度正比于叶节点数目或者叶节点预测值的平方和等;决策树剪枝。
    • 叶节点数目控制了输的层次,一般选择4<=j<=8
    • 叶节点包含的最少样本数目。防止出现过小的叶节点,降低预测方差
    • 梯度提升迭代次数M。增加M可降低训练集的损失值,担忧过拟合风险。
    • 交叉验证

    衰减因子,降采样

    衰减Shrinkage:
    在这里插入图片描述
    其中v称为学习率,v=1即为原始模型;推荐选择v<0.1的小学习率,单会造成迭代次数增多。

    GBDT小结

    • 损失函数是最小平方误差,绝对值误差等,侧围回归问题;而误差函数换成多类别Logistic似然函数,侧围分类问题。
    • 对目标函数分解成若干基函数的加权和,是最常见的技术手段:神经网络,径向基函数,傅里叶/小波变换,SVM中都有它的影子。

    4. XGBoost

    XGBoost与GBDT

    相比于GBDT总的来说XGBoost的功能更加强大,性能更加问题,适用范围更加广,但它们仍各有优缺点。

    • 传统的GBDT是以CART作为基分类器,特指梯度提升决策树算法。而XGBoost还支持线性分类器(gblinear) 这个时候XGBoost相当于带L1和L2正则化项的logistic回归(分类问题)或者线性回归(回归问题)
    • 传统GBDT在优化时只用到一阶导数信息,xgboost则对代价函数进行了二阶泰勒展开,同时用到了一阶和二阶导数。
    • xgboost在代价函数里加入了正则项,用于控制模型的复杂度。正则项里包含了树的叶子节点个数、每个叶子节点上输出的score的L2模的平方和。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合,这也是xgboost优于传统GBDT的一个特性。
      在这里插入图片描述
      其中正则项控制着模型的复杂度,包括了叶子节点数目T和leaf score的L2的平方: 在这里插入图片描述
    • xgboost中树节点分裂时所采用的公式:
      Shrinkage(缩减),相当于学习速率(xgboost中的eta)。xgboost在进行完一次迭代后,会将叶子节点的权重乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。实际应用中,一般把eta设置得小一点,然后迭代次数设置得大一点。(传统GBDT的实现也有学习速率)
    • 列抽样(column subsampling)。xgboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。
    • 对缺失值的处理。对于特征的值有缺失的样本,xgboost可以自动学习出它的分裂方向。
    • xgboost工具支持并行。注意xgboost的并行不是tree粒度的并行,xgboost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。xgboost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),xgboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。(特征粒度上的并行,block结构,预排序)

    这篇博客对于XGBoost中目标函数的优化原理,计算方法没有详细说明,感兴趣的可以自行查阅资料。

    5. LightGBM

    lightGBM:基于决策树算法的分布式梯度提升框架。lightGBM与XGBoost的区别:

    总的来说相较于XGBoost速度更快,内存消耗更低。

    • 切分算法(切分点的选取)
      占用的内存更低,只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,内存消耗可以降低为原来的1/8。
      降低了计算的代价:预排序算法每遍历一个特征值就需要计算一次分裂的增益,而直方图算法只需要计算k次(k可以认为是常数),时间复杂度从O(#data#feature)优化到O(k#features)。(相当于LightGBM牺牲了一部分切分的精确性来提高切分的效率,实际应用中效果还不错)
      空间消耗大,需要保存数据的特征值以及特征排序的结果(比如排序后的索引,为了后续快速计算分割点),需要消耗两倍于训练数据的内存
      时间上也有较大开销,遍历每个分割点时都需要进行分裂增益的计算,消耗代价大

    • 对cache优化不友好,在预排序后,特征对梯度的访问是一种随机访问,并且不同的特征访问的顺序不一样,无法对cache进行优化。同时,在每一层长树的时候,需要随机访问一个行索引到叶子索引的数组,并且不同特征访问的顺序也不一样,也会造成较大的cache miss。

    • XGBoost使用的是pre-sorted算法(对所有特征都按照特征的数值进行预排序,基本思想是对所有特征都按照特征的数值进行预排序;然后在遍历分割点的时候用O(#data)的代价找到一个特征上的最好分割点最后,找到一个特征的分割点后,将数据分裂成左右子节点。优点是能够更精确的找到数据分隔点;但这种做法有以下缺点
      LightGBM使用的是histogram算法,基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点;优点在于

    • 决策树生长策略上:
      XGBoost采用的是带深度限制的level-wise生长策略,Level-wise过一次数据可以能够同时分裂同一层的叶子,容易进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销(因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂)
      LightGBM采用leaf-wise生长策略,每次从当前所有叶子中找到分裂增益最大(一般也是数据量最大)的一个叶子,然后分裂,如此循环;但会生长出比较深的决策树,产生过拟合(因此 LightGBM 在leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合)。

    • histogram 做差加速。一个容易观察到的现象:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。通常构造直方图,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。利用这个方法,LightGBM可以在构造一个叶子的直方图后,可以用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

    • 直接支持类别特征:LightGBM优化了对类别特征的支持,可以直接输入类别特征,不需要额外的0/1展开。并在决策树算法上增加了类别特征的决策规则。

    • 分布式训练方法上(并行优化)
      在特征并行算法中,通过在本地保存全部数据避免对数据切分结果的通信;
      在数据并行中使用分散规约(Reduce scatter)把直方图合并的任务分摊到不同的机器,降低通信和计算,并利用直方图做差,进一步减少了一半的通信量。基于投票的数据并行(Parallel Voting)则进一步优化数据并行中的通信代价,使通信代价变成常数级别。
      特征并行的主要思想是在不同机器在不同的特征集合上分别寻找最优的分割点,然后在机器间同步最优的分割点。
      数据并行则是让不同的机器先在本地构造直方图,然后进行全局的合并,最后在合并的直方图上面寻找最优分割点。


    小结:算法不分优劣,适合的就是最好的。

    展开全文
  • LightGBM学习笔记

    千次阅读 2019-02-26 11:06:14
    目录 LightGBM简介 ...LightGBM是一个基于决策树学习算法的快速的、支持分布式的、高性能的梯度提升框架。其主要具有以下优点: 速度快 基于直方图算法,直方图做差,加速2倍 直接支持类别特征 bagg...

    目录

    1. LightGBM简介
    2. GOSS算法介绍
    3. EFB算法介绍

      3.1 捆绑簇生成算法
      3.2 互斥特征合并算法

    4. LightGBM参数说明
    5. 补充:直方图算法介绍
    6. 参考文献及链接

    1. LightGBM简介

    LightGBM是一个基于决策树学习算法的快速的、支持分布式的、高性能的梯度提升框架。其主要具有以下优点:

    1. 速度快
    • 基于直方图算法,直方图做差,加速2倍
    • 直接支持类别特征
    • bagging
    • feature sub-sampling
    1. 带深度限制的leaf-wise的树的生长方式
    2. 占用内存小
    3. 支持分布式
    4. 更好的准确率
    5. 支持GPU并行学习
    6. 能够处理大规模数据
    • 支持多种并行学习方式:数据并行、特征并行和投票并行
    1. 支持DART(drop out),避免过拟合

    2. GOSS算法介绍

    1)算法思想

    梯度大的样本贡献更大的信息增益,因此在采样时,为了保证信息增益的精度,保留大梯度的样本,而对小梯度样本进行随机采样

    2)输入

    • 训练集I
    • 大梯度样本采样率 a;小梯度样本采样率 b;权重更新比率$fact=\frac{1-a}{b}$
    • 损失函数 loss
    • 弱学习器 L
    • 学习迭代轮数 d
    • 大梯度样本数topN=a*len(I); 小梯度样本数randN=b*len(I)
    • 样本的权重向量 w

    3)输出

    • 训练好的集成模型 models

    4)算法过程及注释说明
    image

    3. EFB算法介绍

    3.1 捆绑簇生成算法

    1) 算法思想(类比聚类思想)

    冲突小的特征在同一捆绑簇中(同一条数据中很少出现两个特征值均为非零值即为冲突小
    冲突大的特征在不同的捆绑簇中

    2) 输入

    • 特征集合 F
    • 最大冲突数阈值 K
    • 图对象 G(节点表示特征,边表示冲突程度)
    • 按degree排序的节点集合 $searchOrder \leftarrow G.sortByDegree()$
    • 特征冲突数集合$bundlesConflict\leftarrow${}

    3) 输出

    • 捆绑簇集合 bundles(每个元素为一个捆绑簇)

    4) 算法过程及注释
    image

    3.2 互斥特征合并算法(基于直方图算法)

    1) 算法思想

    基于直方图算法,将不同特征的特征值离散化后,通过为特征添加一个偏置offset来区别开不同特征的特征值,从而将这些不同特征合并为一个合并特征。

    2) 输入

    • 训练集数据数 numData
    • 一个捆绑簇的特征集合 F
    • 一个捆绑簇中bins的取值范围 binRanges
    • 一个合并特征的总bins数 totalBin

    3) 输出

    • 合并特征的特征图,具体包括 newBin和binRanges

    4) 算法过程及注释
    image

    4. LightGBM重要参数说明

    4.1 LightGBM的参数简介

    LightGBM的参数主要包括以下几类:

    • Core Parameters
    • Learning Control Parameters
    • IO Parameters
    • Objective Parameters
    • Metric Parameters
    • Network Parameters
    • GPU Parameters

    4.2 Core Parameters参数

    IndexCore Parameters默认值含义用法
    1taskdefault = train数据的用途可以用作train/predict/refit
    2objectivedefault = regression学习的任务类型回归:regression/regression_l2/regression_l1;二分类:binary;多分类:multiclass and so on
    3boostingdefault = gbdt选择要用的集成学习算法gbdt/gbrt/ rf/ random_forest,/dart/ goss
    4datadefault = “”指定训练集的文件路径
    5validdefault = “”指定验证集的文件路径,支持多个验证集
    6num_iterationsdefault = 100训练的迭代次数>=0;通常大于100
    7learning_ratedefault = 0.1收缩因子,类似于学习率,为每一棵树都添加一个收缩因子,从而减少每棵树的影响通常为0.1,0.01,0.003,0.001
    8num_leavesdefault = 31每棵树的最大叶子数防止过拟合
    9tree_learnerdefault = serial控制训练时的并行方式serial:不并行;feature:特征并行;data:数据并行;voting:投票并行
    10device_typedefault = cpu指定训练的硬件设备cpu/gpu
    11seeddefault = None设置随机种子int型

    4.3 Learning Control Parameters

    IndexLearning Control Parameters默认值含义用法注意事项
    1max_depthdefault = -1控制单棵树的最大深度int型,用来避免过拟合;小于0表示对树的深度没有限制
    2min_data_in_leafdefault = 20控制每个叶子节点的最小样本数int型,>=0,用来避免过拟合
    3min_sum_hessian_in_leafdefault = 1e-3控制每个叶子节点的最小二阶梯度和int型,>=0,用来避免过拟合
    4bagging_fractiondefault = 1.0控制抽样的样本数double型,[0,1],用来避免过拟合,同时能够加快训练若想进行bagging操作,bagging_freq应该取非零值
    5bagging_freqdefault = 0控制进行bagging的频率int型,取值为0表示不进行bagging,取值为k表示每k轮迭代进行一次bagging若想进行bagging操作,bagging_fraction取值应该小于等于1
    6bagging_seeddefault = 3控制bagging的随机种子int型
    7feature_fractiondefault = 1.0控制每一轮迭代训练随机选择的特征数double型,[0,1],用来避免过拟合,同时能够加快训练
    8feature_fraction_seeddefault = 2控制随机选择特征的随机种子int型
    9early_stopping_rounddefault = 0控制早停的最近轮数,如果验证集上的某一评价指标在最近的early_stopping_round轮内没有提升,则停止训练int型,<=0表示没有早停控制
    10max_delta_stepdefault = 0.0控制输出的最大叶子数,其最大叶子数为learning_rate * max_delta_stepdouble型,<= 0表示没有限制
    11lambda_l1default = 0.0L-1范数的正则化系数double型,用来控制拟合程度,同时有降维的效果
    12lambda_l2default = 0.0L-2范数的正则化系数double型,用来控制拟合程度
    13min_gain_to_splitdefault = 0.0控制节叶点是否分割的最小增益double型
    14drop_ratedefault = 0.1控制dropout时,前面的树模型被用到的概率double型,[0.0,1.0],用来降低拟合程度只在boosting = dart需要设置
    15max_dropdefault = 50控制在一轮boosting 迭代中,被忽略的树模型的最大值int型,<=0 表示没有限制只在boosting = dart需要设置
    16skip_dropdefault = 0.5控制在一轮boosting 迭代中,不进行dropout的概率double型,[0.0,1.0],只在boosting = dart需要设置
    17xgboost_dart_modedefault = false控制是否使用xgboost中dart的模式bool型只在boosting = dart需要设置
    18drop_seeddefault = 4控制dropout的随机种子int型只在boosting = dart需要设置
    19top_ratedefault = 0.2控制大梯度样本的保留比例double型,只在boosting = goss时需要设置
    20other_ratedefault = 0.1控制小梯度样本的保留比例double型只在boosting = goss时需要设置
    21min_data_per_groupdefault = 100设置每一个类别组的最小样本数int型,>0用在类别特征
    22max_cat_thresholddefault = 32设置类别特征的最大阈值点int型,>0用在类别特征
    23cat_l2default = 10.0在类别分割时设置L-2正则化double 型用在类别特征
    24cat_smoothdefault = 10.0减小类别特征中的噪声的影响,特别是数据量小的时候double型用在类别特征
    25top_kdefault = 20设置该值越大,投票并行时准确率会越高,不过训练时间越长int型用在投票并行中

    4.4 IO Parameters

    IndexIO Parameters默认值含义用法注意事项
    1max_bindefault = 255设置特征值被离散化了的最大bins数int型,>1,较小的值可能会降低训练精度,但却可以加快训练
    2min_data_in_bindefault = 3设置每个bin的最小数据数int型,>0,设置该参数用来避免一个bin一条数据的情况,避免过拟合
    3enable_bundledefault = true设置是否采用互斥特征捆绑算法(EFB)bool,设置为false在训练稀疏数据集时可能会降低训练速度
    4max_conflict_ratedefault = 0.0设置合并特征的最大冲突率double型,[0.0,1.0],取值为0会得到更好的训练精度,取值越大,训练速度越快
    5is_enable_sparsedefault = true设置是否使用稀疏优化bool型
    6use_missingdefault = true设置是否对缺失值进行特殊处理bool型
    7label_columndefault = "指定标记列int or string型
    8categorical_featuredefault = "指定类别特征multi-int or string型

    4.5 Objective Parameters

    IndexObjective Parameters默认值含义用法注意事项
    1num_classdefault = 1设置多分类任务的类别数int型,>0,仅在多分类任务中需要设置
    2is_unbalancedefault = false设置训练集数据是否平衡bool型应用在二分类中,该参数不能和scale_pos_weight参数同时设置,只设置一个
    3scale_pos_weightdefault = 1.0设置正类别的权重double应用在二分类中,该参数不能和is_unbalance参数同时设置,只设置一个

    4.6 Metric Parameters

    • metric:default="",设置验证集的评价指标,LightGBM支持采用多个指标,用逗号分隔。可能的取值包括:
    1. “”:表示性能评估指标会根据不同的任务来进行调整
    2. “None”:表示没有性能评估指标
    3. l1:表示采用绝对值损失
    4. l2:表示采用平方损失
    5. l2_root:表示采用平方根损失
    6. huber:表示采用huber损失
    7. auc:表示采用auc评价指标
    8. binary_logloss:表示采用二分类的对数损失
    9. binary_error:表示采用错误率指标
    10. multi_logloss:表示采用多分类任务的对数损失
    11. multi_error:表示采用多分类任务的错误率指标
      其他指标还包括: quantile、mape、fair、gamma、gamma_deviance、tweedie、ndcg、map、xentropy、xentlambda、kldiv
    • metric_freq: default = 1,设置指标输出的频率

    5. 补充:直方图算法构建决策树

    1)输入

    • 训练集$X$,
    • 当前树模型$T_{C-1}(X)$
    • 样本$x_i$的损失函数$L(y_i,T_{C-2}(x_i))$对前一轮模型的$T_{C-2}(x_i)$的一阶梯度G
    • 样本$x_i$的损失函数$L(y_i,T_{C-2}(x_i))$对前一轮模型的$T_{C-2}(x_i)$的二阶梯度H

    2)输出

    • 信息增益最大的分裂节点$p_m$、分裂特征$f_m$和分裂特征的bin的值(即分裂值)$v_m$
    1. 算法过程及注释说明
      image

    4)基于直方图算法构建决策树的优缺点

    • 优点

    占用内存小,直方图算法不仅不需要额外存储预排序的结果,而且可以只保存特征离散化后的值,而这个值一般用8位整型存储就可以,内存消耗可以降低为原来的1/8

    计算速度快,
    预排序算法每遍历一个特征值就需要计算一轮分裂的增益,而直方图算法只需要计算#bins次,时间复杂度从O(#data*_#features)优化到O(#bins*#features)

    • 缺点

    预处理能够忽略零值特征,减少训练代价;而直方图不能对稀疏特征进行优化,只是计算累加值(累加梯度和样本数)。但是,LightGBM对稀疏特征进行了优化:只用非零特征构建直方图

    6. 参考文献

    1. LightGBM调参
    2. Guolin Ke, Qi Meng, Thomas Finley, Taifeng Wang, Wei Chen, Weidong Ma, Qiwei Ye, Tie-Yan Liu. “LightGBM: A Highly Efficient Gradient Boosting Decision Tree.” Advances in Neural Information Processing Systems 30 (NIPS 2017), pp. 3149-3157.
    3. 直方图优化算法
    4. 玩转LightGBM视频
    展开全文
  • 当数据严重不平衡时,分类算法将开始做出有利于多数类的预测。有几种方法可以解决类别不平衡问题。一种方法是分配与类频率成反比的样本权重,以增加较少频率类在损失函数的贡献。另一种方法是使用过采样/欠采样...
  • 参考原文: 从结构到性能,一文概述XGBoost、Light GBM和CatBoost的同与不同 决策树模型,XGBoost,LightGBM和CatBoost模型可视化 ...它用预排序算法+直方图算法为每一层的叶子找出最佳分裂,简而言之,就是...
  • 尽管近年来神经网络复兴并大为流行,但是 boosting 算法... 算法在数据集上的实现等多个方面对 3 种代表性的 boosting 算法 CatBoost、Light GBM 和 XGBoost 进行了对比;虽然本文结论依据于特定的数据集,但通常...
  • XGBoost、LightGBM、Catboost总结

    千次阅读 2019-03-02 20:25:40
    是针对叶节点优先挑选不纯度下降最多的叶节点,这里有点LightGBM的’leaf-wise’的意味,而按树深分裂则更类似于原始的以及XGBoost的分裂方式) 学习率 learning_rate 对应取值范围在(0,1]之间的超参数对应GBRT...
  • LightGBM与XGBoost原理

    千次阅读 2018-03-02 18:11:54
    LightGBM和XGBoost都是GBDT的高效实现,所以先简单介绍下GBDT。1. Gradient Boosting Decision Tree提升树的学习优化过程,损失函数平方损失和指数损失时候,每一步优化相对简单,但对于一般损失函数优化的问题,...
  • ID3算法使用信息增益指标实现根节点或中间节点的字段选择,那个属性的信息增益大,选择那个属性作为分隔的节点,但是该指标存在一个非常明显的缺点,即信息增益会偏向于取值较多的字段。 C4.5算法 信息增益率,C4.5...
  • XGBoost使用的树构造算法。 可选项:auto,exact,approx,hist,gpu_exact,gpu_hist。 分布式和外部存储器版本仅支持tree_method = approx。 auto:使用启发式方法选择最快的方法。(1)对于小型数据集,将...
  • 2. Light GBM 基于Histogram的决策树算法 离散化每个特征的数据为K个bins,统计每个bins的data数目,再寻找最优的分割点。 优点:1. 内存为1/8。2.计算代价变小(由feature个变为K个) 尽管分割变粗糙,但由于决策...
  • boosting算法:Adaboost&GBDT&Xgboost&LightGBM&CatBoost
  • 向AI转型的程序员都关注了这个号????????????机器学习AI算法工程 公众号:datayx今天介绍一个超级简单并且又极其实用的boosting算法包Catboost,据开发者所说...
  • m}{e_m}} αm​=21​logem​1−em​​ 更新训练数据集的权值分布(这里, z m z_m zm​是归一化因子,为了使样本的概率分布合为1): w m + 1 , i = w m , i z m exp ⁡ ( − α m y i G m ( x i ) ) w_{m+1,i}=\...
  • LearningToRank(LTR)排序算法LGBMRanker的原理和使用

    千次阅读 多人点赞 2020-12-03 14:05:16
    在最近新闻推荐的比赛, 接触到了一个排序模型LGBMRanker, 该模型与普通的分类模型LGBMClassifier不太一样, 普通的分类模型在进行推荐的时候, 往往是先预测某个商品或者文章用户会不会点击, 也就是它的目标是...
  • 文章目录4.lightgbm,light gradient boosting machine4.1 GOSS4.1.1 寻找最佳分裂点算法 histogram-based alogrithm4.1.2 获得新样本训练模型算法 gradient-based one-side sampling4.2 EFB4.2.1 发现互斥特征算法 ...
  • 3.集成学习算法分类 4.Boosting 4.1基本流程 4.2Adaboost实现 4.2.1.分类 4.2.2.回归 4.2.3Adaboost的正则化 4.2.4Adaboost小结 5.Bagging 5.1基本流程 6.随机深林Random Forest 6.1基本流程 7.Stacking...
  • 3.提升之XGBoost+lightgbm

    2019-02-27 00:25:41
    lightgbm通过改变构建树的策略,基于节点来构建树,而不是基于层来构建,针对xgboost来说去掉了很多增益很小的分裂 ps: 从xgboost的bfs转变为了变形的dfs策略。 lightgbm在寻找最优切分点和xgboost的 加权...
  • 最近,我参加了 kaggle ...尽管最近几年神经网络复兴,并变得流行起来,但我还是更加关注 boosting 算法,因为在训练样本量有限、所需训练时间较短、缺乏调参知识的场景,它们依然拥有绝对优势。 2014 年 3...
  • 每一个样本,分为属性(也可称为特征)和label两部分,我们运用决策树处理数据就是为了从样本的这些属性里面找出规则,来建立模型可以去预测样本label,而样本的原label我们称之为ground ...
  • 常见排序算法有:
  • 机器学习领域的一个特点就是日新月异,在数据竞赛,一件趁手的工具对比赛结果有重要影响。boosting是一种将弱分类器组合成强分类器的方法,它包含多种算法,如GDBT、AdaBoost、XGBoost等等。如果你参加过Kaggle之...
  • LightGBM和XGBoost都是GBDT的高效实现,所以先简单介绍下GBDT。 1. Gradient Boosting Decision Tree 提升树的学习优化过程,损失函数平方损失和指数损失时候,每一步优化相对简单,但对于一般损失函数...
  • boosting-adaboost、GBDT、xgboost、lightGBM

    千次阅读 2017-07-17 09:01:10
    强可学习:在概率近似正确学习的框架,一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,这个概念被称为强可学习 弱可学习:一个概念,如果一个多项式学习算法能够学习它,学习的...
  • 本文根据2017年microsoft研究所等人写的论文《LightGBM: A Highly Efficient Gradient Boosting Decision Tree》翻译总结。 Gradient Boosting Decision Tree (GBDT)已是一个流行的机器学习方法,也存在一些实施,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 555
精华内容 222
关键字:

light gbm算法中因子排序

友情链接: watchdog.rar