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

总结起来,LightGBM相较于XGBoost的提升主要在于:

支持类别特征,无需one-hot编码;

采用叶节点分裂而非层分裂,学习精度更高;

GOSS(基于梯度的单边采样),对海量学习数据,根据其梯度,筛除绝大部分的小梯度样本(几乎无更新作用),保持精度的同时加快速度;

EFB(独立特征合并),针对海量稀疏数据,根据数据间的冲突度(如cos夹角,0101和1010的冲突很小,因为非零位不相同,非零位不相同的占比越高,冲突度越少),对冲突度小的特征进行合并,变稀疏矩阵为稠密矩阵,减少特征维度;

在直方图加速算法中,支持直方图减法,对下一层样本的直方图绘制,减少时间(右孩子直方图=父节点直方图-左孩子直方图);

优化了多线程加速问题。

解题思路

前面提到了,LightGBM是Xgboost的更高效实现, 由微软发布。

XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

LightGBM相比于Xgboost,添加了很多新的方法来改进模型,包括:并行方案、基于梯度的单边检测(GOSS)、排他性特征捆绑等。

LightGBM的设计思路主要是两点:1.减小数据对内存的使用,保证单个机器在不牺牲速度的情况下,尽可能地用上更多的数据;2.减小通信的代价,提升多机并行时的效率,实现在计算上的线性加速。由此可见,LightGBM的设计初衷就是提供一个快速高效、低内存占用、高准确度、支持并行和大规模数据处理的数据科学工具。

LightGBM并没有垂直的切分数据集,而是每个worker都有全量的训练数据,因此最优的特征分裂结果不需要传输到其他worker中,只需要将最优特征以及分裂点告诉其他worker,worker随后本地自己进行处理。处理过程如下:

每个worker在基于局部的特征集合找到最优分裂特征。

workder间传输最优分裂信息,并得到全局最优分裂信息。

每个worker基于全局最优分裂信息,在本地进行数据分裂,生成决策树。

在AdaBoost中,采样权重作为数据实例重要性的衡量指标。然而在GBDT中,没有内含的样本权重,于是基于采样方法的权重不能应用于GBDT中。但如果实例梯度值小,误差就小,说明这个实例已经训练的很好了,直接的想法就是抛弃小梯度的数据,这样一来数据的分布就会发生改变,会损失学到的模型的精确度。

而LightGBM为了避免这个问题,提出了一种叫做GOSS的方法。GOSS保持有较大梯度的实例,在小梯度数据上运行随机采样。为了弥补这样做造成的数据分布的影响,当计算信息增益的时候,对于小梯度的数据,GOSS引入了常量乘法器。具体做法为,GOSS首先根据梯度绝对值排序,再选出a * 100%大梯度实例数据。之后在余下的数据随机采样b * 100%。经过这个过程,当计算信息增益时,GO小梯度放大了采样数据1-a/b。这样做的好处在于,可以把更多的注意力放在训练实例上,而没有改变原始数据的分布。

总结起来,LightGBM相较于XGBoost的提升主要在于:

支持类别特征,无需one-hot编码;

采用叶节点分裂而非层分裂,学习精度更高;

GOSS(基于梯度的单边采样),对海量学习数据,根据其梯度,筛除绝大部分的小梯度样本(几乎无更新作用),保持精度的同时加快速度;

EFB(独立特征合并),针对海量稀疏数据,根据数据间的冲突度(如cos夹角,0101和1010的冲突很小,因为非零位不相同,非零位不相同的占比越高,冲突度越少),对冲突度小的特征进行合并,变稀疏矩阵为稠密矩阵,减少特征维度;

在直方图加速算法中,支持直方图减法,对下一层样本的直方图绘制,减少时间(右孩子直方图=父节点直方图-左孩子直方图);

优化了多线程加速问题。

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) 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值