“达观杯”文本智能处理挑战赛⑤:训练模型之 LightGBM

一. 简介

1.1. 什么是LightGBM


  LightGBM是个快速的、分布式的、高性能的基于决策树算法的梯度提升框架。可用于排序、分类、回归以及很多其他的机器学习任务中。
  
  因为他是基于决策树算法的,它采用最优的leaf-wise策略分裂叶子节点,然而其它的提升算法分裂树一般采用的是depth-wise或者level-wise而不是leaf-wise。因此,在LightGBM算法中,当增长到相同的叶子节点,leaf-wise算法比level-wise算法减少更多的loss。因此导致更高的精度,而其他的任何已存在的提升算法都不能够达。与此同时,它的速度也让人感到震惊,这就是该算法名字 Light 的原因。
  
  前文是一个由LightGBM算法作者的概要式的描述来简要地解释LightGBM的不同之处。

准确率、速度和内存占用对比

  • XGBoost中决策树的增长方式示意图

  • LightGBM中决策树的增长方式示意图

 

  Leaf-Wise分裂导致复杂性的增加并且可能导致过拟合。但是这是可以通过设置另一个参数 max-depth 来克服,它分裂产生的树的最大深度。
  
  接下来我们将介绍安装LightGBM的步骤使用它来跑一个模型。我们将对比LightGBM和XGBoost的实验结果来证明你应该使用LightGBM在一种轻轻的方式(Light Manner)。

 

1.2. LightGBM的优势

首先让我们看一看LightGBM的优势。

  1. 更快的训练速度和更高的效率: LightGBM使用基于直方图的算法。例如,它将连续的特征值分桶(buckets)装进离散的箱子(bins),这是的训练过程中变得更快。
  2. 更低的内存占用:使用离散的箱子(bins)保存并替换连续值导致更少的内存占用。
  3. 更高的准确率(相比于其他任何提升算法) : 它通过leaf-wise分裂方法产生比level-wise分裂方法更复杂的树,这就是实现更高准确率的主要因素。然而,它有时候或导致过拟合,但是我们可以通过设置 max-depth 参数来防止过拟合的发生。
  4. 大数据处理能力: 相比于XGBoost,由于它在训练时间上的缩减,它同样能够具有处理大数据的能力。
  5. 支持并行学习

 

直方图优化算法(Hisogram optimization)示意图如下:

 

二、实战

2.1. LightGBM的重要参数

  • task: 默认值=train,可选项=train,prediction;指定我们希望执行的任务,该任务有两种类型:训练 和 预测
  • application: 默认值=regression,type=enum,options=options;
    • regression: 执行回归任务;
    • binary:二分类;
    • multiclass:多分类;
    • lambdarank:lambrank应用;
  • data: type=string;training data,LightGBM将从这些数据中进行训练;
  • num_iterations: 默认值为100,类型为int。表示提升迭代次数,也就是提升树的棵树;
  • num_leaves: 每个树上的叶子数,默认值为31,类型为int;
  • device: 默认值=cpu;可选项:cpu,gpu。也就是我们使用什么类型的设备去训练我们的模型。选择GPU会使得训练过程更快;
  • mindatain_leaf: 每个叶子上的最少数据;
  • feature_fraction: 默认值为1;指定每次迭代所需要的特征部分;
  • bagging_fraction: 默认值为1;指定每次迭代所需要的数据部分,并且它通常是被用来提升训练速度和避免过拟合的。
  • mingainto_split: 默认值为1;执行分裂的最小的信息增益;
  • max_bin: 最大的桶的数量,用来装数值的;
  • mindatain_bin: 每个桶内最少的数据量;
  • numthreads: 默认值为OpenMPdefault,类型为int。指定LightGBM算法运行时线程的数量;
  • label: 类型为string;指定标签列;
  • categorical_feature: 类型为string;指定我们想要进行模型训练所使用的特征类别;
  • num_class: 默认值为1,类型为int;仅仅需要在多分类的场合。

2.2. LightGBM的参数调优

  LightGBM使用基于depth-wise的分裂的leaf-wise分裂算法,这使得它能够更快地收敛。但是,它也会导致过拟合。因此,这里给出一个LightGBM参数调优的快速指南。

① 为了最好的拟合

  • numleaves:这个参数是用来设置组成每棵树的叶子的数量。numleaves 和 maxdepth理论上的联系是: numleaves = 2^(maxdepth)。然而,但是如果使用LightGBM的情况下,这种估计就不正确了:因为它使用了leafwise而不是depthwise分裂叶子节点。因此,numleaves必须设置为一个小于2^(maxdepth)的值。否则,他将可能会导致过拟合。LightGBM的numleave和max_depth这两个参数之间没有直接的联系。因此,我们一定不要把两者联系在一起。
  • mindatain_leaf : 它也是一个用来解决过拟合的非常重要的参数。把它的值设置的特别小可能会导致过拟合,因此,我们需要对其进行相应的设置。因此,对于大数据集来说,我们应该把它的值设置为几百到几千。
  • max_depth: 它指定了每棵树的最大深度或者它能够生长的层数上限。

② 为了更快的速度

  • bagging_fraction : 它被用来执行更快的结果装袋;
  • feature_fraction : 设置每一次迭代所使用的特征子集;
  • maxbin : maxbin的值越小越能够节省更多的时间:当它将特征值分桶装进不同的桶中的时候,这在计算上是很便宜的。

③ 为了更高的准确率

  • 使用更大的训练数据集;
  • num_leaves : 把它设置得过大会使得树的深度更高、准确率也随之提升,但是这会导致过拟合。因此它的值被设置地过高不好。
  • maxbin : 该值设置地越高导致的效果和numleaves的增长效果是相似的,并且会导致我们的训练过程变得缓慢。

④ 为了防止过拟合(方法)

三、达观杯实战

import lightgbm as LGB

"""
训练LGB分类器
"""
print("训练LGB分类器")
params = {
    'boosting': 'gbdt',
    'application': 'multiclassova',
    'num_class': 19,
    'learning_rate': 0.1,
    'num_leaves': 31,
    'max_depth': -1,
    'lambda_l1': 0,
    'lambda_l2': 0.5,
    'bagging_fraction': 1.0,

}

bst = LGB.train(params, d_train, num_boost_round=800, valid_sets=d_vali, feval=f1_score_vali,
                early_stopping_rounds=None,
                verbose_eval=True)

joblib.dump(bst, model_path + "LGB_data_w_tfidf.m")

"""
对测试集进行预测;将预测结果转换为官方标准格式;并将结果保存至本地
"""
print("对测试集进行预测;将预测结果转换为官方标准格式;并将结果保存至本地")
y_proba = bst.predict(x_test)
y_test = np.argmax(y_proba, axis=1) + 1

df_result = pd.DataFrame(data={'id': range(102277), 'class': y_test.tolist()})
df_proba = pd.DataFrame(data={'id': range(102277), 'proba': y_proba.tolist()})

df_result.to_csv(result_path  + 'LGB_data_w_tfidf_result.csv', index=False)
df_proba.to_csv(result_path + 'LGB_data_w_tfidf_proba.csv', index=False)

训练结果:

在迭代次数达到76次时,f1_score已经达到了0.74899

[66]	valid_0's multi_logloss: 0.942434	valid_0's f1_score: 0.745981
[67]	valid_0's multi_logloss: 0.940711	valid_0's f1_score: 0.746013
[68]	valid_0's multi_logloss: 0.938983	valid_0's f1_score: 0.746823
[69]	valid_0's multi_logloss: 0.937522	valid_0's f1_score: 0.747922
[70]	valid_0's multi_logloss: 0.936149	valid_0's f1_score: 0.747821
[71]	valid_0's multi_logloss: 0.934682	valid_0's f1_score: 0.74739
[72]	valid_0's multi_logloss: 0.933556	valid_0's f1_score: 0.747649
[73]	valid_0's multi_logloss: 0.932114	valid_0's f1_score: 0.748283
[74]	valid_0's multi_logloss: 0.930934	valid_0's f1_score: 0.748489
[75]	valid_0's multi_logloss: 0.929729	valid_0's f1_score: 0.748633
[76]	valid_0's multi_logloss: 0.92854	valid_0's f1_score: 0.748994

四、 小结

  在本文中,给出了关于LightGBM的直观的想法。现在使用该算法的一个缺点是它的用户基础太少了。但是种局面将很快得到改变。该算法除了比XGBoost更精确和节省时间以外,现在被使用的很少的原因是他的可用文档太少。
  
  然而,该算法已经展现出在结果上远超其他已存在的提升算法。我强烈推荐你去使用LightGBM与其他的提升算法,并且自己亲自感受一下他们之间的不同。
  
  也许现在说LightGBM算法称雄还为时过早。但是,他确实挑战了XGBoost的地位。给你一句警告:就像其他任何机器学习算法一样,在使用它进行模型训练之前确保你正确的调试了参数。

 

参考文献

https://github.com/Microsoft/LightGBM

https://zhuanlan.zhihu.com/p/35645973

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值