LightGBM算法与XGboost对比

文章最前: 我是Octopus,这个名字来源于我的中文名–章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

论文地址:《LightGBM: A Highly Efficient Gradient Boosting Decision Tree》:https://proceedings.neurips.cc/paper_files/paper/2017/file/6449f44a102fde848669bdd9eb6b76fa-Paper.pdf

LightGBM算法速度

从 LightGBM 名字我们可以看出其是轻量级(Light)的梯度提升机(GBM),其相对 XGBoost 具有训练速度快、内存占用低的特点。下图分别显示了 XGBoost、XGBoost_hist(利用梯度直方图的 XGBoost) 和 LightGBM 三者之间针对不同数据集情况下的内存和训练时间的对比:

那么 LightGBM 到底如何做到更快的训练速度和更低的内存使用的呢?

我们刚刚分析了 XGBoost 的缺点,LightGBM 为了解决这些问题提出了以下几点解决方案:

  1. 单边梯度抽样算法;
  2. 直方图算法;
  3. 互斥特征捆绑算法;
  4. 基于最大深度的 Leaf-wise 的垂直生长算法;
  5. 类别特征最优分割;
  6. 特征并行和数据并行;
  7. 缓存优化。

2.1 单边梯度抽样算法

GBDT 算法的梯度大小可以反应样本的权重,梯度越小说明模型拟合的越好,单边梯度抽样算法(Gradient-based One-Side Sampling, GOSS)利用这一信息对样本进行抽样,减少了大量梯度小的样本,在接下来的计算锅中只需关注梯度高的样本,极大的减少了计算量。

GOSS 算法保留了梯度大的样本,并对梯度小的样本进行随机抽样,为了不改变样本的数据分布,在计算增益时为梯度小的样本引入一个常数进行平衡。具体算法如下所示:

在这里插入图片描述

我们可以看到 GOSS 事先基于梯度的绝对值对样本进行排序(无需保存排序后结果),然后拿到前 a% 的梯度大的样本,和剩下样本的 b%,在计算增益时,通过乘上

### LightGBMXGBoost的性能和特性比较 #### 性能表现 LightGBM展示了超越其他现有提升算法的结果,尤其在精度方面超过了XGBoost,并且所需的时间更少[^2]。GPU加速版本的LightGBM进一步提升了速度优势,相比之前的版本有了显著改进[^3]。 #### 用户基数发展前景 目前,LightGBM的应用不如XGBoost广泛,主要因为其可用文档较少,这限制了用户的增长。不过,随着更多实践者的尝试以及社区支持的增长,这一状况预计会有所改善。 #### 参数调整的重要性 无论是哪种模型,在应用前都需要仔细调参以达到最佳效果。不恰当的参数设置可能会严重影响最终的效果,因此建议使用者充分理解并合理配置各项参数。 #### 模型尺寸管理 有报告指出LightGBM保存后的模型文件可能较大,这对于部署环境有一定影响;而XGBoost在这方面则相对较好控制。如果项目对存储空间敏感,则需考虑这一点[^4]。 ```python import lightgbm as lgb import xgboost as xgb from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score # 创建虚拟分类数据集 X, y = make_classification(n_samples=1000, n_features=20) # 划分训练集测试集 X_train, X_test, y_train, y_test = train_test_split(X, y) # 训练LightGBM模型 lgb_train = lgb.Dataset(X_train, y_train) params_lgb = {'objective': 'binary'} bst_lgb = lgb.train(params_lgb, lgb_train) # 预测并计算准确率 preds_prob_lgb = bst_lgb.predict(X_test) preds_label_lgb = [round(x) for x in preds_prob_lgb] acc_lgb = accuracy_score(y_test, preds_label_lgb) print(f'LightGBM Accuracy: {acc_lgb}') # 训练XGBoost模型 dtrain = xgb.DMatrix(X_train, label=y_train) param_xgb = { "max_depth": 6, "eta": 0.3, "objective": "binary:logistic", } num_round = 10 bst_xgb = xgb.train(param_xgb, dtrain, num_round) # 测试集预测 dtest = xgb.DMatrix(X_test) preds_prob_xgb = bst_xgb.predict(dtest) preds_label_xgb = [int(pred >= 0.5) for pred in preds_prob_xgb] acc_xgb = accuracy_score(y_test, preds_label_xgb) print(f'XGBoost Accuracy: {acc_xgb}') ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值