logo

LightGBM API

王哲峰 / 2023-02-24


目录

LightGBM 安装

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

pip 安装

# 默认版本
$ pip install lightgbm

# MPI 版本
$ pip install lightgbm --install-option=--mpi

# GPU 版本
$ pip install lightgbm --install-option=--gpu

从源码安装

$ git clone --recursive https://github.com/microsoft/LighGBM
$ cd LightGBM
$ mkdir build
$ cd build
cmake ..

开启 MPI 通信机制,训练更快:

$ cmake -DUSE_MPI=ON ..

GPU 版本,训练更快:

$ cmake -DUSE_GPU=1 ..
$ make -j4

LightGBM 核心数据结构

数据保存在 lightgbm.Dataset 对象中

加载文本文件和二进制文件

LibSVM(zero-based) 文本文件、LightGBM 二进制文件

import lightgbm as lgb

# csv
train_csv_data = lgb.Dataset('train.csv')

# tsv
train_tsv_data = lgb.Dataset('train.tsv')

# libsvm
train_svm_data = lgb.Dataset('train.svm')

# lightgbm bin
train_bin_data = lgb.Dataset('train.bin')

加载 numpy 2 维数组

import liggtgbm as lgb

data = np.random.rand(500, 10)
label = np.random.randint(2, size = 500)
train_array = lgb.Dataset(data, label = label)

加载 pandas DataFrame

加载 H2O DataTable Frame

加载 scipy 稀疏矩阵

scipy.sparse.csr_matrix 数组

import lightgbm as lgb
import scipy

csr = scipy.sparse.csr_matirx((dat, (row, col)))
train_sparse = lgb.Dataset(csr)

保存数据为 LightGBM 二进制文件

import lightgbm as lgb

train_data = lgb.Dataset("train.svm.txt")
train_data.save_binary('train.bin')

将数据保存为 LightGBM 二进制文件会使数据加载更快

创建验证数据

import lightgbm as lgb

# 训练数据
train_data = lgb.Dataset("train.csv")

# 验证数据
validation_data = train_data.create_vaild('validation.svm')
# or
validation_data = lgb.Dataset('validation.svm', reference = train_data)

在 LightGBM 中, 验证数据应该与训练数据一致(格式)

在数据加载时标识特征名称和类别特征

import numpy as np
import lightgbm as lgb

data = np.random.rand(500, 10)
label = np.random.randint(2, size = 500)
train_array = lgb.Dataset(data, label = label)
w = np.random.rand(500, 1)

train_data = lgb.Dataset(data, 
                        label = label, 
                        feature_name = ['c1', 'c2', 'c3'], 
                        categorical_feature = ['c3'],
                        weight = w,
                        free_raw_data = True)
# or
train_data.set_weight(w)

train_data.set_init_score()

train_data.set_group()

有效利用内存空间

The Dataset object in LightGBM is very memory-efficient, it only needs to save discrete bins. However, Numpy/Array/Pandas object is memory expensive. If you are concerned about your memory consumption, you can save memory by:

LightGBM APIs

Training

LightGBM API:

Scikit-learn API:

模型保存与加载

交叉验证

特征交互约束

自定义评价函数

自定义损失函数

提前停止训练

Callbacks

Plotting

LightGBM 调参参数

参数设置方式

参数类型

train 方法参数

调参技巧

参数 提高模型训练速度 提高准确率 加强拟合 处理过拟合(降低拟合)
训练数据 增加训练数据 增加训练数据 增加训练数据
dart 尝试使用 dart(带dropout的树) 尝试使用 dart(带dropout的树)
bagging_fraction
bagging_freq
使用 bagging 样本采样,设置bagging_fraction
bagging_freq
使用 bagging 样本采样,设置bagging_fraction
bagging_freq
feature_fraction 使用子特征采样,
设置feature_fraction
使用子特征采样,
设置
feature_fraction
learning_rate 使用较小的learning_rate 和较大的num_iterations 使用较小的learning_rate 和较大的num_iterations
max_bin
(会减慢训练速度)
使用较小的
max_bin
使用较大的
max_bin
使用较大的
max_bin
使用较小的
max_bin
num_leaves 使用较小的
num_leaves
使用较大的
num_leaves
使用较大的
num_leaves
使用较小的
num_leaves
max_depth 尝试max_depth 避免树生长太深
min_data_in_leafmin_sum_
hessian_in_leaf
使用min_data_in_leafmin_sum_
hessian_in_leaf
lambda_l1lambda_l2min_gain_to_split 尝试使用lambda_l1lambda_l2min_gain_to_split 做正则化
path_smooth 尝试提高
path_smooth
extra_trees 尝试使用extra_trees
save_binary 使用save_binary加速数据加载速度
并行 使用并行训练

参考