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 对象则非常消耗内存。如果你担心内存消耗,你可以通过以下方式节省内存:
在构造
Dataset
时设置free_raw_data=True
(默认值为True
)在
Dataset
构建完成后,显式设置raw_data=None
调用
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)