LightGBM是基于XGBoost的一款可以快速并行的树模型框架,内部集成了多种集成学习思路,在代码实现上对XGBoost的节点划分进行了改进,内存占用更低训练速度更快。

LightGBM官网:https://lightgbm.readthedocs.io/en/latest/

参数介绍:https://lightgbm.readthedocs.io/en/latest/Parameters.html

本文内容如下,原始代码获取方式见文末。

  • 1 安装方法

  • 2 调用方法

    • 2.1 定义数据集

    • 2.2 模型训练

    • 2.3 模型保存与加载

    • 2.4 查看特征重要性

    • 2.5 继续训练

    • 2.6 动态调整模型超参数

    • 2.7 自定义损失函数

  • 2.8 调参方法

    • 人工调参

    • 网格搜索

    • 贝叶斯优化

1 安装方法

LightGBM的安装非常简单,在Linux下很方便的就可以开启GPU训练。可以优先选用从pip安装,如果失败再从源码安装。

  • 安装方法:从源码安装


git clone --recursive https://github.com/microsoft/LightGBM ;
cd LightGBM
mkdir build ; cd build
cmake ..# 开启MPI通信机制,训练更快
# cmake -DUSE_MPI=ON ..# GPU版本,训练更快
# cmake -DUSE_GPU=1 ..
make -j4
  • 安装方法:pip安装

# 默认版本
pip install lightgbm# MPI版本
pip install lightgbm --install-option=--mpi# GPU版本
pip install lightgbm --install-option=--gpu

2 调用方法

在Python语言中LightGBM提供了两种调用方式,分为为原生的API和Scikit-learn API,两种方式都可以完成训练和验证。当然原生的API更加灵活,看个人习惯来进行选择。

2.1 定义数据集

df_train = pd.read_csv('https://cdn.coggle.club/LightGBM/examples/binary_classification/binary.train', header=None, sep='\t')
df_test = pd.read_csv('https://cdn.coggle.club/LightGBM/examples/binary_classification/binary.test', header=None, sep='\t')
W_train = pd.read_csv('https://cdn.coggle.club/LightGBM/examples/binary_classification/binary.train.weight', header=None)[0]
W_test = pd.read_csv('https://cdn.coggle.club/LightGBM/examples/binary_classification/binary.test.weight', header=None)[0]y_train = df_train[0]
y_test = df_test[0]
X_train = df_train.drop(0, axis=1)
X_test = df_test.drop(0, axis=1)
num_train, num_feature = X_train.shape# create dataset for lightgbm
# if you want to re-use data, remember to set free_raw_data=Falselgb_train = lgb.Dataset(X_train, y_train,weight=W_train, free_raw_data=False)lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train,weight=W_test, free_raw_data=False)

2.2 模型训练

params = {'boosting_type': 'gbdt','objective': 'binary','metric': 'binary_logloss','num_leaves': 31,'learning_rate': 0.05,'feature_fraction': 0.9,'bagging_fraction': 0.8,'bagging_freq': 5,'verbose': 0
}# generate feature names
feature_name = ['feature_' + str(col) for col in range(num_feature)]
gbm = lgb.train(params,lgb_train,num_boost_round=10,valid_sets=lgb_train,  # eval training datafeature_name=feature_name,categorical_feature=[21])

2.3 模型保存与加载

# save model to file
gbm.save_model('model.txt')print('Dumping model to JSON...')
model_json = gbm.dump_model()with open('model.json', 'w+') as f:json.dump(model_json, f, indent=4)

2.4 查看特征重要性

# feature names
print('Feature names:', gbm.feature_name())# feature importances
print('Feature importances:', list(gbm.feature_importance()))

2.5 继续训练

# continue training
# init_model accepts:
# 1. model file name
# 2. Booster()
gbm = lgb.train(params,lgb_train,num_boost_round=10,init_model='model.txt',valid_sets=lgb_eval)
print('Finished 10 - 20 rounds with model file...')

2.6 动态调整模型超参数

# decay learning rates
# learning_rates accepts:
# 1. list/tuple with length = num_boost_round
# 2. function(curr_iter)
gbm = lgb.train(params,lgb_train,num_boost_round=10,init_model=gbm,learning_rates=lambda iter: 0.05 * (0.99 ** iter),valid_sets=lgb_eval)
print('Finished 20 - 30 rounds with decay learning rates...')# change other parameters during training
gbm = lgb.train(params,lgb_train,num_boost_round=10,init_model=gbm,valid_sets=lgb_eval,callbacks=[lgb.reset_parameter(bagging_fraction=[0.7] * 5 + [0.6] * 5)])
print('Finished 30 - 40 rounds with changing bagging_fraction...')

2.7 自定义损失函数

# self-defined objective function
# f(preds: array, train_data: Dataset) -> grad: array, hess: array
# log likelihood loss
def loglikelihood(preds, train_data):labels = train_data.get_label()preds = 1. / (1. + np.exp(-preds))grad = preds - labelshess = preds * (1. - preds)return grad, hess# self-defined eval metric
# f(preds: array, train_data: Dataset) -> name: string, eval_result: float, is_higher_better: bool
# binary error
# NOTE: when you do customized loss function, the default prediction value is margin
# This may make built-in evalution metric calculate wrong results
# For example, we are doing log likelihood loss, the prediction is score before logistic transformation
# Keep this in mind when you use the customization
def binary_error(preds, train_data):labels = train_data.get_label()preds = 1. / (1. + np.exp(-preds))return 'error', np.mean(labels != (preds > 0.5)), Falsegbm = lgb.train(params,lgb_train,num_boost_round=10,init_model=gbm,fobj=loglikelihood,feval=binary_error,valid_sets=lgb_eval)
print('Finished 40 - 50 rounds with self-defined objective function and eval metric...')

2.8 调参方法

人工调参

For Faster Speed

  • Use bagging by setting bagging_fraction and bagging_freq

  • Use feature sub-sampling by setting feature_fraction

  • Use small max_bin

  • Use save_binary to speed up data loading in future learning

  • Use parallel learning, refer to Parallel Learning Guide <./Parallel-Learning-Guide.rst>__

For Better Accuracy

  • Use large max_bin (may be slower)

  • Use small learning_rate with large num_iterations

  • Use large num_leaves (may cause over-fitting)

  • Use bigger training data

  • Try dart

Deal with Over-fitting

  • Use small max_bin

  • Use small num_leaves

  • Use min_data_in_leaf and min_sum_hessian_in_leaf

  • Use bagging by set bagging_fraction and bagging_freq

  • Use feature sub-sampling by set feature_fraction

  • Use bigger training data

  • Try lambda_l1, lambda_l2 and min_gain_to_split for regularization

  • Try max_depth to avoid growing deep tree

  • Try extra_trees

  • Try increasing path_smooth

网格搜索

lg = lgb.LGBMClassifier(silent=False)
param_dist = {"max_depth": [4,5, 7],"learning_rate" : [0.01,0.05,0.1],"num_leaves": [300,900,1200],"n_estimators": [50, 100, 150]}grid_search = GridSearchCV(lg, n_jobs=-1, param_grid=param_dist, cv = 5, scoring="roc_auc", verbose=5)
grid_search.fit(train,y_train)
grid_search.best_estimator_, grid_search.best_score_

贝叶斯优化

import warnings
import time
warnings.filterwarnings("ignore")
from bayes_opt import BayesianOptimization
def lgb_eval(max_depth, learning_rate, num_leaves, n_estimators):params = {"metric" : 'auc'}params['max_depth'] = int(max(max_depth, 1))params['learning_rate'] = np.clip(0, 1, learning_rate)params['num_leaves'] = int(max(num_leaves, 1))params['n_estimators'] = int(max(n_estimators, 1))cv_result = lgb.cv(params, d_train, nfold=5, seed=0, verbose_eval =200,stratified=False)return 1.0 * np.array(cv_result['auc-mean']).max()lgbBO = BayesianOptimization(lgb_eval, {'max_depth': (4, 8),'learning_rate': (0.05, 0.2),'num_leaves' : (20,1500),'n_estimators': (5, 200)}, random_state=0)lgbBO.maximize(init_points=5, n_iter=50,acq='ei')
print(lgbBO.max)

获取本文代码,可以在作者公众号“datawhale”后台回复【lgb】,即可获取本文的代码Notebook!

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑

获取一折本站知识星球优惠券,复制链接直接打开:

https://t.zsxq.com/y7uvZF6

本站qq群704220115。

加入微信群请扫码:

【机器学习基础】你应该知道的LightGBM各种操作!相关推荐

  1. 关于机器学习,你应该知道的3个热门专业术语

    https://www.toutiao.com/a6683842829510246923/ 2019-04-25 22:43:48 关于机器学习,你应该知道的3个热门专业术语 原创: 吴郦军.罗人千 ...

  2. winxp制作服务器,你要知道的WinXP服务器操作系统安装的方法

    今天来聊聊一篇关于你要知道的的文章,现在就为大家来简单介绍下你要知道的,希望对各位小伙伴们有所帮助. 方法如下: 1.首先是设置bois,对应你服务器的bois设置将光盘优先启动,然后重启,插入带有W ...

  3. 机器学习初学者都应该知道的5类回归损失函数

    来源: https://heartbeat.fritz.ai/5-regression-loss-functions-all-machine-learners-should-know-4fb140e9 ...

  4. C语言零基础——小白应该知道的事

    一.概述: C语言是面向过程的语言,在这里用户创建过程或函数来执行他们的任务.面向过程的语言是很容易学,因为它遵循的算法来执行你的语句.要使用面向过程的语言开发程序,你需要画/编写算法,然后开始转换成 ...

  5. 你应该知道的 89 个操作系统核心概念

    微信搜索逆锋起笔关注后回复编程pdf 领取编程大佬们所推荐的 23 种编程资料! 素材来源:CSDN 整理:[公众号:逆锋起笔] 1. 操作系统(Operating System,OS):是管理计算机 ...

  6. 机器学习基础-关于matplotlib的动态图显示操作

    动态显示曲线图 #动态显示曲线图 %matplotlib inline import matplotlib.pyplot as plt from IPython import display impo ...

  7. 初学者必须要知道的FPGA基础知识

    初学者必须要知道的FPGA基础知识 一.FPGA是什么? 在<FPGA至简设计原理与应用>一书里是这样描述的:『FPGA的全称为Field-Programmable Gate Array, ...

  8. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol52]43 为AES 对抗侧信道攻击的防御

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. 为AES描述一些基础的(可能无 ...

  9. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第34篇]描述攻击离散对数问题的baby-step/Giant-step方法

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇编是为了让博士生们在第一年结束时知道些什么. Baby-step/Giant ...

最新文章

  1. 2012三年大专计算机试题医学,计算机原理2012年4月真题(02384)
  2. 卷积,DFT,FFT,图像FFT,FIR 和 IIR 的物理意义
  3. html的扇形代码导航,CSS3--利用transform和transition属性制作扇形导航
  4. Ehcache详细解读
  5. ebay 后台HTML有尺寸宽度要求吗,eBay牛仔裤成为尺码问题重灾区,卖家上架需注意这几个方面...
  6. BZOJ2160 拉拉队排练
  7. 打工人福利!教你如何一秒制作日报月报
  8. (Python)计算器的设计与实现
  9. 腾讯云服务器安装redis、mysql
  10. java写入html文件乱码,java写入到html文件 打开是乱码
  11. c语言 数据类型作业 答案,C语言-数据类型习题及答案
  12. 市场复苏下:报复性消费,了解一下~
  13. 中国一票否决Arm被购案的六个理由
  14. VMware VCP认证常见问答题
  15. 详解Https出现的前因后果
  16. 多元线性回归分析(Stata)
  17. 用 Python 高效处理大文件
  18. 自定义控件三秒改变改变颜色
  19. html页面打包为小程序
  20. java 对照 术语_JAVA的部分术语中英文对照(

热门文章

  1. SQLiteHelper
  2. 文件流习题8.3 8.4
  3. 利用Visual Studio 2005的自动化测试工具来做数据导入
  4. Python学习笔记 setdict
  5. weblogic线程阻塞性能调优(图解)转
  6. 计算中英混合字符串的自己字节长度
  7. Android 开机自动启动服务
  8. GraphPad Prism 教程,如何在坐标上放置2条生存曲线
  9. 转载:opencv:关于vs opencv每次都要配置的解决方案
  10. 机器人学习--Hans Moravec在斯坦福博士论文1980年-Obstacle Avoidance and Navigation in the Real World by a Seeing Ro