logo

LightGBM API

wangzf / 2023-02-24


目录

LightGBM 核心数据结构

数据格式

数据保存在 lightgbm.Dataset 对象中

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

import lightgbm as lgb

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

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

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

# txt
# TODO

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

加载 numpy 二维数组

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 二进制文件

将数据保存为 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)

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

对于 categorical_feature 特征,首先需要将它转换为整数类型,并且只支持非负数。如果转换为连续的范围更佳

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()

有效利用内存空间

LightGBM 中的 Dataset 对象由于仅仅需要保存离散的数据桶,因此它具有很好的内存效率。 但是由于 numpy array/pandas 对象的内存开销较大,因此当使用它们来创建 `Dataset`` 时, 可以通过下面的方式来节省内存:

Dataset

API 及参数

Dataset:由 LightGBM 内部使用的数据结构,它存储了数据集。

class lightgbm.Dataset(
    data, 
    label=None, 
    max_bin=None, 
    reference=None, 
    weight=None,
    group=None, 
    init_score=None, 
    silent=False, 
    feature_name='auto',
    categorical_feature='auto', 
    params=None, 
    free_raw_data=True
)

示例

import lightgbm as lgb

matrix_1 = lgb.Dataset("data/train.svm.txt")
matrix_2 = lgb.Dataset(
    data = np.arange(0, 12).reshape(4, 3),
    label = [1, 2, 3, 4],
    weight = [0.5, 0.4, 0.3, 0.2],
    silent = False,
    feature_name = ["a", "b", "c"],
)

matrix_2.get_ref_chain(ref_limit = 10)
matrix_2.subset(used_indices = [0, 1])
matrix_2.data
matrix_2.label
matrix_2.weight
matrix_2.init_score
matrix_2.group

注意事项

  1. 要确保你的数据集的样本数足够大,从而满足一些限制条件(如:单个节点的最小样本数、单个桶的最小样本数等)。否则会直接报错。

LightGBM APIs

Booster

class lightgbm.Booster(
    params = None,
    train_set = None,
    model_file = None,
    silent = False,
)

Training

LightGBM API:

Scikit-learn API:

直接学习

Booster API 转换

  1. 从 LGBMModel 转换到 Booster:通过 .booster_ 属性来获取底层的 Booster

  2. 使用 Booster 来预测分类的概率

    • 因为 Booster 仅仅提供了 predict 接口,而未提供 predict_proba 接口,因此需要使用这种转换
    • LGBMClassifierpredict_proba 方法中的源码如下:
    class_probs = self.booster_.predict(
        X, 
        raw_score = raw_score,
        num_iteration = num_iteration,
    )
    
    if self._n_classes > 2:
        return class_probs
    else:
        return np.vstack((1. - class_probs, class_probs)).transpose()
    

模型保存与加载

交叉验证

特征交互约束

自定义评价函数

自定义损失函数

提前停止训练

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加速数据加载速度
并行 使用并行训练

Docker 安装和使用

CLI 模式

安装

$ mkdir lightgbm-docker
$ cd lightgbm-docker
$ wget https://raw.githubusercontent.com/Microsoft/LightGBM/master/docker/dockerfile-cli
$ docker build -t lightgbm-cli -f dockerfile-cli .

使用

$ docker run -rm -it \
--volume $HOME/lgbm.conf:/lgbm.conf \
--volume $HOME/model.txt:/model.txt \
--volume $HOME/tmp:/out \
lightgbm-cli \
config=lgbm.conf

Python 模式

安装

$ mkdir lightgbm-docker
$ lightgbm-docker
$ wget https://raw.githubusercontent.com/Microsoft/LightGBM/master/docker/dockerfile-python
$ docker build -t lightgbm -f dockerfile-python .

使用

$ docker run --rm -it lightgbm

参考