LightGBM

作者: taon | 来源:发表于2019-08-03 11:55 被阅读0次

LightGBM梯度提升框架是由微软亚洲研究院于2017年1月份提出的一个开源框架,LightGBM是一个快速的,分布式的,高性能的基于决策树的分布框架。在保证准确性不变的前提下,速度可提升10倍,内存降低为原来的1/3。

LightGBM的算法思想
LightGBM摒弃了现在大部分GBDT使用的按层生长(level-wise)的决策树生长策略,使用带有深度限制的按叶子生长(leaf-wise)的策略。level-wise过一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销,因为实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。

Leaf-wise则是一种更为高效的策略,每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比,在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度。Leaf-wise的缺点是可能会长出比较深的决策树,产生过拟合。因此LightGBM在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。

LightGBM.png
LightGBM的优点
  • 更快的训练效率
  • 更低的内存使用
  • 更高的准确率
  • 支持并行学习
  • 可应用于大规模数据

代码样例演示
数据集仍然使用Mnist数据集,与GBDT,XGBoost使用的同样的数据集,便于比较三者的优劣势。

#读取Mnist数据集
import gzip
import pickle as pkl
import time 
from sklearn.model_selection import train_test_split

def load_data(path):
    f = gzip.open(path,'rb')
    train_set,valid_set,test_set = pkl.load(f,encoding = 'latin1')
    f.close()
    return(train_set,valid_set,test_set)

path = 'D:\\Py_dataset\\mnist.pkl.gz'
train_set,valid_set,test_set = load_data(path)
Xtrain,_,ytrain,_ = train_test_split(train_set[0],train_set[1],test_size = 0.9)
Xtest,_,ytest,_ = train_test_split(test_set[0],test_set[1],test_size = 0.9)

#导入lightgbm
import lightgbm as lgb
dtrain = lgb.Dataset(Xtrain,label = ytrain)
dtest = lgb.Dataset(Xtest,label = ytest)

params = {
    'num_leaves':31,                # 最大的叶子节点数
    'max_depth': -1,                # 树的最大深度,-1表示没有深度限制
    'tree_learner': 'serial', 
    'application':'multiclass',     # 目标是做分类还是回归任务
    'num_class':10,                 
    'learning_rate': 0.1,           # 学习率
    'min_split_gain': 0,            # 当信息增益为0时,不再进行分裂
    'lambda_l1': 0,                 
    'lambda_l2': 0,                 
    'min_data_in_leaf': 20,         
    'bagging_fraction': 1.0,        # 样本的选择比例
    'bagging_freq': 0,
    'bagging_seed': 0,
    'feature_fraction': 1.0,         # 特征的选择比例
    'feature_fraction_seed': 2,
    'min_sum_hessian_in_leaf': 1e-3, 
    'num_threads': 1
}
num_round = 10

start_time = time.time()
bst = lgb.train(params,train_data,num_round)
end_time = time.time()
print('The time usage of lgb {}'.format(end_time - start_time))

ypred_onehot = bst.predict(Xtest)
ypred = []
for i in range(len(ypred_onehot)):
    ypred.append(ypred_onehot[i].argmax())

accuracy = np.sum(ypred == ytest) / len(ypred)
print('Test accuracy = {}'.format(accuracy))
The time usage of lgb 6.965272665023804
Test accuracy = 0.894

GBDT XGBoost LightGBM效果对比

The comparision.png
由上图可以看出,LightGBM的运算速度与准确度都是最高的,以后当我们遇到问题时,我们可直接使用LightGBM算法进行试验。

LightGBM中文文档:https://lightgbm.apachecn.org/#/

相关文章

  • 2.lightgbm_cheatsheet

    LightGBM速查表 详细的细节内容可以参考LightGBM中文文档[https://lightgbm.apac...

  • LightGBM使用

    可以参考LightGBM原生/sk接口的常用参数LightGBM使用 lightGBM调参 所有的参数含义,参考:...

  • LightGBM简介

    LightGBM LightGBM(Light Gradient Boosting Machine)是一款基于决策...

  • LightGBM 如何调参

    本文结构: 什么是 LightGBM 怎么调参 和 xgboost 的代码比较 1. 什么是 LightGBM L...

  • LightGBM原理分析

    1. Abstract 在之前我介绍过XGB模型,这次想跟大家分享一下LightGBM这个模型。LightGBM论...

  • 机器学习之-lightgbm

    lightGBM实践中的操作:

  • lightgbm 参数

    lightgbm有很多重复的参数,让刚接触的人摸不着头脑。可参考官方文档,https://lightgbm.rea...

  • LightGBM

    LightGBM原理及实现 LigthGBM是boosting集合模型中的新进成员,它和xgboost一样是对GB...

  • lightgbm

    todo

  • LightGBM

    LightGBM梯度提升框架是由微软亚洲研究院于2017年1月份提出的一个开源框架,LightGBM是一个快速的,...

网友评论

      本文标题:LightGBM

      本文链接:https://www.haomeiwen.com/subject/osqjdctx.html