首页 > 试题广场 >

说一说xgboost和lightgbm的区别是什么

[问答题]
说一说xgboost和lightgbm的区别是什么
推荐
LightGBM是Xgboost的更高效实现, 由微软发布。
XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。
LightGBM相比于Xgboost,添加了很多新的方法来改进模型,包括:并行方案、基于梯度的单边检测(GOSS)、排他性特征捆绑等。
LightGBM的设计思路主要是两点:1. 减小数据对内存的使用,保证单个机器在不牺牲速度的情况下,尽可能地用上更多的数据;2. 减小通信的代价,提升多机并行时的效率,实现在计算上的线性加速。由此可见,LightGBM的设计初衷就是提供一个快速高效、低内存占用、高准确度、支持并行和大规模数据处理的数据科学工具。
LightGBM并没有垂直的切分数据集,而是每个worker都有全量的训练数据,因此最优的特征分裂结果不需要传输到其他worker中,只需要将最优特征以及分裂点告诉其他worker,worker随后本地自己进行处理。处理过程如下:
  1. 每个worker在基于局部的特征集合找到最优分裂特征。
  2. workder间传输最优分裂信息,并得到全局最优分裂信息。
  3. 每个worker基于全局最优分裂信息,在本地进行数据分裂,生成决策树。
在AdaBoost中,采样权重作为数据实例重要性的衡量指标。然而在GBDT中,没有内含的样本权重,于是基于采样方法的权重不能应用于GBDT中。但如果实例梯度值小,误差就小,说明这个实例已经训练的很好了,直接的想法就是抛弃小梯度的数据,这样一来数据的分布就会发生改变,会损失学到的模型的精确度。
而LightGBM为了避免这个问题,提出了一种叫做GOSS的方法。GOSS保持有较大梯度的实例,在小梯度数据上运行随机采样。为了弥补这样做造成的数据分布的影响,当计算信息增益的时候,对于小梯度的数据,GOSS引入了常量乘法器。具体做法为,GOSS首先根据梯度绝对值排序,再选出a * 100%大梯度实例数据。之后在余下的数据随机采样b * 100%。经过这个过程,当计算信息增益时,GO***小梯度放大了采样数据1-a/b。这样做的好处在于,可以把更多的注意力放在训练实例上,而没有改变原始数据的分布。
总结起来,LightGBM相较于XGBoost的提升主要在于:
  1. 支持类别特征,无需one-hot编码;
  2. 采用叶节点分裂而非层分裂,学习精度更高;
  3. GOSS(基于梯度的单边采样),对海量学习数据,根据其梯度,筛除绝大部分的小梯度样本(几乎无更新作用),保持精度的同时加快速度;
  4. EFB(独立特征合并),针对海量稀疏数据,根据数据间的冲突度(如cos夹角,0101和1010的冲突很小,因为非零位不相同,非零位不相同的占比越高,冲突度越少),对冲突度小的特征进行合并,变稀疏矩阵为稠密矩阵,减少特征维度;
  5. 在直方图加速算法中,支持直方图减法,对下一层样本的直方图绘制,减少时间(右孩子直方图=父节点直方图-左孩子直方图);
  6. 优化了多线程加速问题。

XGBoost 使用示例

# XGBoost 使用示例
import xgboost as xgb
from sklearn import metrics
from sklearn.model_selection import GridSearchCV

def auc(m, train, test): 
    return (metrics.roc_auc_score(y_train,m.predict_proba(train)[:,1]),
           metrics.roc_auc_score(y_test,m.predict_proba(test)[:,1]))

# xgb 分类器
model = xgb.XGBClassifier()
param_dist = {"max_depth": [10,30,50],
              "min_child_weight" : [1,3,6],
              "n_estimators": [200],
              "learning_rate": [0.05, 0.1,0.16],}
# 网格法搜索超参
grid_search = GridSearchCV(model, param_grid=param_dist, cv = 3, 
                                   verbose=10, n_jobs=-1)
grid_search.fit(train, y_train)

grid_search.best_estimator_

model = xgb.XGBClassifier(max_depth=50, min_child_weight=1,  n_estimators=200,                    n_jobs=-1 , verbose=1,learning_rate=0.16)
model.fit(train,y_train)

auc(model, train, test)

Light GBM 使用示例

# Light GBM 使用示例
import lightgbm as lgb
from sklearn import metrics
from sklearn.model_selection import GridSearchCV

def auc2(m, train, test): 
    return (metrics.roc_auc_score(y_train,m.predict(train)),
                            metrics.roc_auc_score(y_test,m.predict(test)))

# 定义 lgb 分类器
lg = lgb.LGBMClassifier(silent=False)
param_dist = {"max_depth": [25,50, 75],
              "learning_rate" : [0.01,0.05,0.1],
              "num_leaves": [300,900,1200],
              "n_estimators": [200]
             }
             
# 网格法搜索超参
grid_search = GridSearchCV(lg, n_jobs=-1, param_grid=param_dist, cv = 3, scoring="roc_auc", verbose=5)
grid_search.fit(train,y_train)
grid_search.best_estimator_

d_train = lgb.Dataset(train, label=y_train)
params = {"max_depth": 50, "learning_rate" : 0.1, "num_leaves": 900,  "n_estimators": 300}

model2 = lgb.train(params, d_train)
auc2(model2, train, test)


编辑于 2021-09-15 18:17:58 回复(0)

t屠龙刀--XGBoost

XGBoost作为一款经过优化的分布式梯度提升(Gradient Boosting)库,具有高效,灵活和高可移植性的特点。基于梯度提升框架,XGBoost实现了并行方式的决策树提升(Tree Boosting),从而能够快速准确地解决各种数据科学问题。XGBoost不仅支持各种单机操作系统(如:Windows,Linus和OS X),而且支持集群分布式计算(如:AWS,GCE,Azure和Yarn)和云数据流系统(如:Flink和Spark)。

XGBoost是由华盛顿大学(University of Washington)的陈天奇作为 Distributed (Deep) Machine Learning Community (DMLC) 组员所开发的一个研究项目。在陈天奇与队友一起赢得了Higgs Machine Learning Challenge后,许多的数据科学竞赛队伍使用XGBoost并获得了冠军,促进了该工具在数据科学应用中的广泛使用。

倚天剑——LightGBM


LightGBM(Light Gradient Boosting Machine)同样是一款基于决策树算法的分布式梯度提升框架。为了满足工业界缩短模型计算时间的需求,LightGBM的设计思路主要是两点:1. 减小数据对内存的使用,保证单个机器在不牺牲速度的情况下,尽可能地用上更多的数据;2. 减小通信的代价,提升多机并行时的效率,实现在计算上的线性加速。由此可见,LightGBM的设计初衷就是提供一个快速高效、低内存占用、高准确度、支持并行和大规模数据处理的数据科学工具。

LightGBM是微软旗下的Distributed Machine Learning Toolkit (DMKT)的一个项目,由2014年首届阿里巴巴大数据竞赛获胜者之一柯国霖主持开发。虽然其开源时间才仅仅2个月,但是其快速高效的特点已经在数据科学竞赛中崭露头角。Allstate Claims Severity竞赛中的冠军解决方案里就使用了LightGBM,并对其大嘉赞赏。

屠龙刀VS倚天剑

首先谈谈他们的相同之处。简单来说,XGBoost和LightGBM都是基于决策树提升(Tree Boosting)的工具,都拥有对输入要求不敏感、计算复杂度不高和效果好的特点,适合在工业界中进行大量的应用。

其不同之处在于:XGBoost作为屠龙刀,刚劲有力,无坚不摧;LightGBM作为倚天剑,剑如飞风,唯快不破。

  • 决策树算法

XGBoost使用的是pre-sorted算法,能够更精确的找到数据分隔点;LightGBM使用的是histogram算法,占用的内存更低,数据分隔的复杂度更低。

  • 决策树生长策略

XGBoost采用的是level(depth)-wise生长策略,如Figure 1所示,能够同时分裂同一层的叶子,从而进行多线程优化,不容易过拟合;但不加区分的对待同一层的叶子,带来了很多没必要的开销。

发表于 2022-01-04 18:31:03 回复(0)