XGBoost过时了?LightGBM核心解析

栏目: 编程工具 · 发布时间: 6年前

内容简介:LightGBM 作为近两年微软开源的模型,相比XGBoost有如下优点:我们都知道,XGBoost 一共有三类参数总的来说,我还是觉得LightGBM比XGBoost用法上差距不大。参数也有很多重叠的地方。很多XGBoost的核心原理放在LightGBM上同样适用。 同样的,Lgb也是有train()函数和LGBClassifier()与LGBRegressor()函数。后两个主要是为了更加贴合sklearn的用法,这一点和XGBoost一样。

LightGBM 作为近两年微软开源的模型,相比XGBoost有如下优点:

  • 更快的训练速度和更高的效率: LightGBM使用基于直方图的算法 。例如,它将连续的特征值分桶(buckets)装进离散的箱子(bins),这是的训练过程中变得更快。还有一点是 LightGBM的分裂节点的方式与XGBoost不一样 。LGB避免了对整层节点分裂法,而采用了对增益最大的节点进行深入分解的方法。这样节省了大量分裂节点的资源。下图一是XGBoost的分裂方式,图二是LightGBM的分裂方式。

    XGBoost过时了?LightGBM核心解析
    XGBoost过时了?LightGBM核心解析
  • 更低的内存占用:使用离散的箱子(bins)保存并替换连续值导致更少的内存占用。

  • 更高的准确率(相比于其他任何提升算法):它通过leaf-wise分裂方法产生比level-wise分裂方法更复杂的树,这就是实现更高准确率的主要因素。然而,它有时候或导致过拟合,但是我们可以通过设置 max-depth 参数来防止过拟合的发生。

  • 大数据处理能力:相比于XGBoost,由于它在训练时间上的缩减,它同样能够具有处理大数据的能力。

  • 支持并行学习

LightGBM 核心参数介绍

我们都知道,XGBoost 一共有三类参数 通用参数,学习目标参数,Booster参数 ,那么对于LightGBM,我们有核心参数,学习控制参数,IO参数,目标参数,度量参数,网络参数,GPU参数,模型参数,这里我常修改的便是 核心参数,学习控制参数,度量参数 等。更详细的请看LightGBM中文文档

核心参数

  1. boosting :也称 boostboosting_type .默认是 gbdt

    LGB里面的boosting参数要比xgb多不少,我们有传统的 gbdt ,也有 rfdartdoss ,最后两种不太深入理解,但是试过,还是gbdt的效果比较经典稳定

  2. num_thread :也称作 num_thread , nthread .指定线程的个数。

    这里官方文档提到,数字设置成cpu内核数比线程数训练效更快(考虑到现在cpu大多超线程)。并行学习不应该设置成全部线程,这反而使得训练速度不佳。

  3. application :默认为 regression 。,也称 objectiveapp 这里指的是任务目标

    • regression
      regression_l2
      regression_l1
      huber
      fair
      poisson
      quantile
      quantile_l2
      
    • binary , binary log loss classification application
    • multi-class classification
      • multiclass , softmax 目标函数, 应该设置好 num_class
      • multiclassova , One-vs-All 二分类目标函数, 应该设置好 num_class
    • cross-entropy application
      xentropy
      xentlambda
      
    • lambdarank , lambdarank application
      label_gain
      
  4. valid :验证集选用,也称 testvalid_data , test_data .支持多验证集,以 , 分割

  5. learning_rate :也称 shrinkage_rate ,梯度下降的步长。默认设置成0.1,我们一般设置成 0.05-0.2 之间

  6. num_leaves :也称 num_leaf ,新版lgb将这个默认值改成31,这代表的是一棵树上的叶子数

  7. device :default=cpu, options=cpu, gpu

    • 为树学习选择设备, 你可以使用 GPU 来获得更快的学习速度
    • Note : 建议使用较小的 max_bin (e.g. 63) 来获得更快的速度
    • Note : 为了加快学习速度, GPU 默认使用32位浮点数来求和. 你可以设置 gpu_use_dp=true 来启用64位浮点数, 但是它会使训练速度降低
    • Note : 请参考 安装指南 来构建 GPU 版本

学习控制参数

  1. feature_fraction :default=1.0, type=double, 0.0 < feature_fraction < 1.0, 也称 sub_feature , colsample_bytree
    • 如果 feature_fraction 小于 1.0, LightGBM 将会在每次迭代中随机选择部分特征. 例如, 如果设置为 0.8, 将会在每棵树训练之前选择 80% 的特征
    • 可以用来加速训练
    • 可以用来处理过拟合
  2. bagging_fraction :default=1.0, type=double, 0.0 < bagging_fraction < 1.0, 也称 sub_row , subsample
    • 类似于 feature_fraction, 但是它将在不进行重采样的情况下随机选择部分数据
    • 可以用来加速训练
    • 可以用来处理过拟合
    • Note : 为了启用 bagging, bagging_freq 应该设置为非零值
  3. bagging_freq : default=0, type=int, 也称 subsample_freq
    • bagging 的频率, 0 意味着禁用 bagging. k 意味着每 k 次迭代执行bagging
    • Note : 为了启用 bagging, bagging_fraction 设置适当
  4. lambda_l1 :默认为0,也称reg_alpha,表示的是L1正则化,double类型
  5. lambda_l2 :默认为0,也称reg_lambda,表示的是L2正则化,double类型
  6. cat_smooth : default=10, type=double
    • 用于分类特征
    • 这可以降低噪声在分类特征中的影响, 尤其是对数据很少的类别

度量函数

  1. metric : default={l2 for regression}, {binary_logloss for binary classification}, {ndcg for lambdarank}, type=multi-enum, options=l1, l2, ndcg, auc, binary_logloss, binary_error …
    l1
    l2
    l2_root
    quantile
    huber
    fair
    poisson
    ndcg
    map
    auc
    binary_logloss
    binary_error
    multi_logloss
    multi_error
    xentropy
    xentlambda
    kldiv
    

总的来说,我还是觉得LightGBM比XGBoost用法上差距不大。参数也有很多重叠的地方。很多XGBoost的核心原理放在LightGBM上同样适用。 同样的,Lgb也是有train()函数和LGBClassifier()与LGBRegressor()函数。后两个主要是为了更加贴合sklearn的用法,这一点和XGBoost一样。

GridSearch 调参

GridSearch 我在这里有介绍,可以戳进去看看。我主要讲讲LGBClassifier的调参用法。

数据我上传在这里:直接上代码!

import pandas as pd
import lightgbm as lgb
from sklearn.grid_search import GridSearchCV  # Perforing grid search
from sklearn.model_selection import train_test_split

train_data = pd.read_csv('train.csv')   # 读取数据
y = train_data.pop('30').values   # 用pop方式将训练数据中的标签值y取出来,作为训练目标,这里的‘30’是标签的列名
col = train_data.columns   
x = train_data[col].values  # 剩下的列作为训练数据
train_x, valid_x, train_y, valid_y = train_test_split(x, y, test_size=0.333, random_state=0)   # 分训练集和验证集
train = lgb.Dataset(train_x, train_y)
valid = lgb.Dataset(valid_x, valid_y, reference=train)


parameters = {
              'max_depth': [15, 20, 25, 30, 35],
              'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],
              'feature_fraction': [0.6, 0.7, 0.8, 0.9, 0.95],
              'bagging_fraction': [0.6, 0.7, 0.8, 0.9, 0.95],
              'bagging_freq': [2, 4, 5, 6, 8],
              'lambda_l1': [0, 0.1, 0.4, 0.5, 0.6],
              'lambda_l2': [0, 10, 15, 35, 40],
              'cat_smooth': [1, 10, 15, 20, 35]
}
gbm = lgb.LGBMClassifier(boosting_type='gbdt',
                         objective = 'binary',
                         metric = 'auc',
                         verbose = 0,
                         learning_rate = 0.01,
                         num_leaves = 35,
                         feature_fraction=0.8,
                         bagging_fraction= 0.9,
                         bagging_freq= 8,
                         lambda_l1= 0.6,
                         lambda_l2= 0)
# 有了gridsearch我们便不需要fit函数
gsearch = GridSearchCV(gbm, param_grid=parameters, scoring='accuracy', cv=3)
gsearch.fit(train_x, train_y)

print("Best score: %0.3f" % gsearch.best_score_)
print("Best parameters set:")
best_parameters = gsearch.best_estimator_.get_params()
for param_name in sorted(parameters.keys()):
    print("\t%s: %r" % (param_name, best_parameters[param_name]))
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

软件的奥秘

软件的奥秘

[美] V. Anton Spraul / 解福祥 / 人们邮电出版社 / 2017-9-1 / 49

软件已经成为人们日常生活与工作中常见的辅助工具,但是对于软件的工作原理,很多人却不是非常了解。 本书对软件的工作原理进行了解析,让读者对常用软件的工作原理有一个大致的了解。内容涉及数据如何加密、密码如何使用和保护、如何创建计算机图像、如何压缩和存储视频、如何搜索数据、程序如何解决同样的问题而不会引发冲突以及如何找出最佳路径等方面。 本书适合从事软件开发工作的专业技术人员,以及对软件工作......一起来看看 《软件的奥秘》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

URL 编码/解码
URL 编码/解码

URL 编码/解码