Python-包 介绍

本文档提供了 LightGBM Python 包的基本介绍。

其他有用链接列表

安装

安装 LightGBM 的首选方式是通过 pip:

pip install lightgbm

有关详细的安装指南,请参阅 Python-package 文件夹。

要验证您的安装,请尝试在 Python 中 import lightgbm

import lightgbm as lgb

数据接口

LightGBM Python 模块可以从以下方式加载数据:

  • LibSVM (零基) / TSV / CSV 格式文本文件

  • NumPy 2D 数组,pandas DataFrame,H2O DataTable 的 Frame,SciPy 稀疏矩阵

  • LightGBM 二进制文件

  • LightGBM Sequence 对象

数据存储在一个 Dataset 对象中。

本页中的许多示例使用了 numpy 的功能。要运行这些示例,请确保在会话中导入 numpy

import numpy as np

要将 LibSVM(基于零)文本文件或 LightGBM 二进制文件加载到数据集中:

train_data = lgb.Dataset('train.svm.bin')

要将 numpy 数组加载到数据集中:

rng = np.random.default_rng()
data = rng.uniform(size=(500, 10))  # 500 entities, each contains 10 features
label = rng.integers(low=0, high=2, size=(500, ))  # binary target
train_data = lgb.Dataset(data, label=label)

将scipy.sparse.csr_matrix数组加载到Dataset中:

import scipy
csr = scipy.sparse.csr_matrix((dat, (row, col)))
train_data = lgb.Dataset(csr)

从序列对象加载:

我们可以实现 Sequence 接口来读取二进制文件。以下示例展示了使用 h5py 读取 HDF5 文件。

import h5py

class HDFSequence(lgb.Sequence):
    def __init__(self, hdf_dataset, batch_size):
        self.data = hdf_dataset
        self.batch_size = batch_size

    def __getitem__(self, idx):
        return self.data[idx]

    def __len__(self):
        return len(self.data)

f = h5py.File('train.hdf5', 'r')
train_data = lgb.Dataset(HDFSequence(f['X'], 8192), label=f['Y'][:])

使用 Sequence 接口的特性:

  • 数据采样使用随机访问,因此不会遍历整个数据集

  • 批量读取数据,从而在构建 Dataset 对象时节省内存

  • 支持从多个数据文件创建 Dataset

请参考 Sequence API 文档

dataset_from_multi_hdf5.py 是一个详细的示例。

将数据集保存为 LightGBM 二进制文件将加快加载速度:

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

创建验证数据:

validation_data = train_data.create_valid('validation.svm')

validation_data = lgb.Dataset('validation.svm', reference=train_data)

在 LightGBM 中,验证数据应与训练数据对齐。

特定特征名称和分类特征:

train_data = lgb.Dataset(data, label=label, feature_name=['c1', 'c2', 'c3'], categorical_feature=['c3'])

LightGBM 可以直接使用分类特征作为输入。它不需要转换为独热编码,并且比独热编码快得多(大约快8倍)。

注意:在构建 Dataset 之前,您应将分类特征转换为 int 类型。

在需要时可以设置权重:

rng = np.random.default_rng()
w = rng.uniform(size=(500, ))
train_data = lgb.Dataset(data, label=label, weight=w)

train_data = lgb.Dataset(data, label=label)
rng = np.random.default_rng()
w = rng.uniform(size=(500, ))
train_data.set_weight(w)

你可以使用 Dataset.set_init_score() 来设置初始分数,并使用 Dataset.set_group() 来为排序任务设置组/查询数据。

内存高效使用:

LightGBM 中的 Dataset 对象非常节省内存,它只需要保存离散的箱子。然而,Numpy/Array/Pandas 对象则非常消耗内存。如果你担心内存消耗,你可以通过以下方式节省内存:

  1. 在构造 Dataset 时设置 free_raw_data=True (默认值为 True

  2. Dataset 构建完成后,显式设置 raw_data=None

  3. 调用 gc

设置参数

LightGBM 可以使用字典来设置 参数。例如:

  • 助推器参数:

    param = {'num_leaves': 31, 'objective': 'binary'}
    param['metric'] = 'auc'
    
  • 你也可以指定多个评估指标:

    param['metric'] = ['auc', 'binary_logloss']
    

训练

训练模型需要参数列表和数据集:

num_round = 10
bst = lgb.train(param, train_data, num_round, valid_sets=[validation_data])

训练后,模型可以被保存:

bst.save_model('model.txt')

训练好的模型也可以导出为JSON格式:

json_model = bst.dump_model()

保存的模型可以被加载:

bst = lgb.Booster(model_file='model.txt')  # init model

简历

使用5折交叉验证进行训练:

lgb.cv(param, train_data, num_round, nfold=5)

早停

如果你有一个验证集,你可以使用早停法来找到最佳的提升轮数。早停法至少需要一个在 valid_sets 中的集合。如果有多个,它将使用除训练数据外的所有集合:

bst = lgb.train(param, train_data, num_round, valid_sets=valid_sets, callbacks=[lgb.early_stopping(stopping_rounds=5)])
bst.save_model('model.txt', num_iteration=bst.best_iteration)

模型将训练直到验证分数停止提高。验证分数需要在每 stopping_rounds 至少提高一次以继续训练。

如果通过设置 early_stopping 回调启用了早停逻辑,则具有最佳性能的迭代索引将保存在 best_iteration 字段中。请注意,train() 将返回来自最佳迭代的模型。

这适用于最小化的指标(L2、对数损失等)和最大化的指标(NDCG、AUC等)。请注意,如果您指定了多个评估指标,所有这些指标都将用于提前停止。然而,您可以通过在 early_stopping 回调构造函数中传递 first_metric_only=True 来改变这种行为,使 LightGBM 仅检查第一个指标以进行提前停止。

预测

已经训练或加载的模型可以对数据集进行预测:

# 7 entities, each contains 10 features
rng = np.random.default_rng()
data = rng.uniform(size=(7, 10))
ypred = bst.predict(data)

如果在训练期间启用了早停,您可以使用 bst.best_iteration 从最佳迭代中获取预测:

ypred = bst.predict(data, num_iteration=bst.best_iteration)