一. 简介
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的优势。
更快的训练速度和更高的效率: LightGBM使用基于直方图的算法。例如,它将连续的特征值分桶(buckets)装进离散的箱子(bins),这是的训练过程中变得更快。
更低的内存占用:使用离散的箱子(bins)保存并替换连续值导致更少的内存占用。
更高的准确率(相比于其他任何提升算法) : 它通过leaf-wise分裂方法产生比level-wise分裂方法更复杂的树,这就是实现更高准确率的主要因素。然而,它有时候或导致过拟合,但是我们可以通过设置 max-depth 参数来防止过拟合的发生。
大数据处理能力: 相比于XGBoost,由于它在训练时间上的缩减,它同样能够具有处理大数据的能力。
支持并行学习
直方图优化算法(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的地位。给你一句警告:就像其他任何机器学习算法一样,在使用它进行模型训练之前确保你正确的调试了参数。
---------------------
作者:NLP_victor
来源:CSDN
原文:https://blog.csdn.net/IOT_victor/article/details/89255973
版权声明:本文为博主原创文章,转载请附上博文链接!