LightGBM算法
LightGBM算法简介
LightGBM(Light Gradient Boosting Machine)是一个基于决策树算法的分布式梯度提升框架。它旨在减小数据对内存的使用、减小通信代价并提升多机并行时的效率,从而在数据计算上实现线性加速,在处理大数据集和高维特征时展现出更高的效率和扩展性,是机器学习领域的重要工具,通常应用于二分类、多分类和排序等场景。
算法原理相关
基于梯度提升和基于树的模型
梯度提升是一种通过迭代的方式不断拟合模型残差的技术。在每次迭代中,会计算模型的残差(实际值与预测值之间的差异),并基于这些残差来训练一个新的弱分类器(通常是决策树),新的弱分类器会重点关注之前分类错误的样本,从而逐步提高模型的预测能力。LightGBM使用基于树的模型作为弱分类器,这些树模型由多个节点组成,每个节点都包含一个特征和一个阈值,在树的构建过程中,根据样本的特征值和阈值的大小,将样本分配到左子树或右子树,以此实现对样本的分类或回归。
优化策略
带深度限制的Leaf - wise叶子生长策略:传统决策树通常采用Level - wise生长策略(逐层构建树的节点),可能导致树的深度过大,增加计算复杂度。LightGBM采用的这种策略每次只选择对当前样本集贡献最大的叶子节点进行分裂,减少了树的深度,提高了训练速度。
直方图优化:处理连续特征时,传统决策树算法需要遍历所有样本的特征值来找到最优的分裂点。LightGBM采用直方图优化策略,将连续特征离散化为多个区间,并为每个区间计算一个直方图,在构建树的过程中只需遍历这些直方图来找到最优的分裂点,大大降低了计算复杂度。
直接支持类别特征:传统决策树算法通常只能处理数值型特征,LightGBM可直接支持类别特征。
LightGBM并行优化:为提高运行速度,LightGBM采用多种并行优化策略,例如在多个特征上并行地计算直方图,在构建树的过程中并行地计算每个叶子节点的分裂增益等。
包含的模型类型
LightGBM是一个算法框架,包括GBDT模型、随机森林和逻辑回归等模型。
弱学习器类型及相关参数
LightGBM中,在创建模型CREATEMODEL语法里的model_parameter参数中的boosting_type表示弱学习器的类型,取值如下:
gbdt(默认):使用基于树的模型进行计算。
rf:使用随机森林模型进行计算。
dart:使用dropout技术删除部分树,防止过拟合。
goss:使用单边梯度抽象算法进行计算,速度快,但可能欠拟合。
算法特点
准确性:具有较好的准确率,通过集成多个弱分类器构建强大的预测模型。
支持并行与GPU学习:支持并行学习和GPU学习,可处理大规模数据,随着数据量的增加,其速度优势更明显,适合大数据集(一般建议对超过10000行的数据使用),但在小型数据集上容易过拟合,不建议使用。
代码
import lightgbm as lgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据集
data = load_breast_cancer()
X = data.data
y = data.target
# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建LightGBM数据集
train_data = lgb.Dataset(X_train, label=y_train)
test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)
# 设置模型参数
params = {
'objective': 'binary', # 二分类任务
'metric': 'binary_logloss', # 使用对数损失作为评估指标
'boosting_type': 'gbdt', # 使用GBDT算法
'num_leaves': 31, # 叶子节点数
'learning_rate': 0.05, # 学习率
'feature_fraction': 0.9, # 特征采样比例
'bagging_fraction': 0.8, # 数据采样比例
'bagging_freq': 5, # 每5次迭代进行一次bagging
'verbose': 0 # 不输出训练过程
}
# 训练模型
num_round = 100
bst = lgb.train(params, train_data, num_round, valid_sets=[test_data])
# 进行预测
y_pred = bst.predict(X_test)
y_pred_binary = [1 if pred > 0.5 else 0 for pred in y_pred] # 将概率转换为二进制分类
# 计算准确率
accuracy = accuracy_score(y_test, y_pred_binary)
print(f'Test Accuracy: {accuracy:.4f}')