【NLP数据竞赛】“达观杯”文本智能处理挑战赛(五)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使用基于直方图的算法。例如,它将连续的特征值分桶(buckets)装进离散的箱子(bins),这是的训练过程中变得更快。
- 更低的内存占用:使用离散的箱子(bins)保存并替换连续值导致更少的内存占用。
- 更高的准确率(相比于其他任何提升算法) : 它通过leaf-wise分裂方法产生比level-wise分裂方法更复杂的树,这就是实现更高准确率的主要因素。然而,它有时候或导致过拟合,但是我们可以通过设置 max-depth 参数来防止过拟合的发生。
- 大数据处理能力: 相比于XGBoost,由于它在训练时间上的缩减,它同样能够具有处理大数据的能力。
- 支持并行学习
二、代码
2.1 参数说明
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代码实战
import lightgbm as LGB
#训练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")
#对测试集进行预测;将预测结果转换为官方标准格式;并将结果保存至本地
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)
参考链接:
https://blog.****.net/IOT_victor/article/details/89255973
https://zhuanlan.zhihu.com/p/35645973
https://blog.****.net/gulaixiangjuejue/article/details/89287997