文章目录
【文章系列】
第一章 集成学习_LightGBM————集成学习之Boosting方法系列_LightGBM
第二章 集成学习_XGboost————集成学习之Boosting方法系列_XGboost
第三章 集成学习_CatBoost————集成学习之Boosting方法系列_CatBoost
【前言】
集成学习是一种机器学习方法,通过将多个弱学习器(weak learners)组合成一个更强大的集成模型来提高预测性能和泛化能力。
Boosting 是一种迭代的集成方法,它通过逐步调整训练数据的权重和/或模型的权重来训练多个弱学习器,以便每个弱学习器更关注先前被错误分类的样本。AdaBoost、Gradient Boosting 和 XGBoost 都是 Boosting 的变种。
本文将介绍Boosting方法的其中一种:LightGBM
【算法简介】
LightGBM(Light Gradient Boosting Machine)是一种基于梯度提升树(Gradient Boosting Tree)的机器学习算法,它是由微软开发的并且在机器学习社区中广受欢迎的算法之一。LightGBM被设计成高效且可扩展的机器学习框架,特别适用于大规模数据集和高维特征。
【正文】
(一)LightGBM前身:梯度提升树
梯度提升树(Gradient Boosting Tree)是一种强大的集成机器学习方法,用于解决分类和回归问题。它是基于决策树的集成学习算法,它通过迭代地训练多个决策树来构建一个更强大的预测模型。以下是关于梯度提升树的详细介绍:
1.基本原理:
梯度提升树是一种集成学习方法,它通过组合多个弱学习器(通常是决策树)来构建一个强大的模型。每个决策树都在前一个树的残差(或梯度)上进行训练,以逐渐减小模型的误差。在每一轮迭代中,模型试图找到一个新的决策树,该树可以最大程度地减小损失函数,从而改进模型的预测性能。最终模型是所有迭代生成的决策树的加权和。
2.主要组成部分:
(1)基础学习器:
通常是决策树,但也可以是其他类型的模型,如线性回归、支持向量机等。
(2)损失函数:
用于衡量模型的预测误差。常见的损失函数包括均方误差(Mean Squared Error)用于回归问题和对数损失(Logarithmic Loss)用于分类问题。
(3)迭代策略:
决定了如何更新模型以最小化损失函数。梯度提升使用梯度下降法来最小化损失函数。
(4)正则化参数:
用于控制模型的复杂性,以防止过拟合。常见的正则化参数包括树的深度、叶子节点的最小样本数等。
3.优势:
梯度提升树是一种非常强大的算法,通常能够产生高度准确的预测。它适用于各种类型的数据,包括结构化数据和非结构化数据。可以用于解决分类和回归问题。通过迭代改进模型,可以逐渐提高模型的性能。
4.示例:
- 回归问题:假设我们要预测房屋的销售价格。我们可以使用梯度提升树模型,将房屋的特征(如面积、卧室数量、位置等)作为输入,并训练模型以最小化实际销售价格与预测价格之间的均方误差。
- 分类问题:假设我们要预测电子邮件是否为垃圾邮件。我们可以使用梯度提升树模型,将电子邮件的文本特征作为输入,并训练模型以最小化实际标签与预测标签之间的对数损失。
(二)LightGBM特点
1. 高效性:
LightGBM采用了直方图算法、并行训练等优化技巧,运行速度特别快。
(1)直方图算法:
LightGBM使用直方图算法,将特征值分成离散的分箱,而不是将数据点按照连续的特征值进行分割。这样可以减少了决策树的分割点数量,降低了计算复杂度。直方图算法还具有内存效率,因为它不需要存储所有数据点的特征值,只需要存储分箱的统计信息。LightGBM能够更快地构建决策树,特别适用于大规模数据集和高维特征。
(2)并行训练:
LightGBM支持多线程并行训练,加速模型的训练过程。在大规模数据集和高维特征的情况下,通过并行化处理,LightGBM可以显著减少训练时间。并行训练还使得LightGBM适用于分布式计算环境,如集群或云计算平台,提高了其可扩展性。
(3)GOSS(基于梯度的单边采样):
GOSS是LightGBM的一种样本采样策略,它通过基于梯度的采样方法来选择具有更大梯度的样本,以保留最重要的样本。这种采样策略可以减少训练数据集的大小,从而降低计算成本和内存占用,同时保持模型性能。
(4)特征选择:
LightGBM具有内置的特征选择功能,它可以自动识别和选择最重要的特征,减少不重要特征的影响。特征选择有助于提高模型的泛化能力,减少了决策树的生长深度,进一步加快了训练速度。
2. 可扩展性:
适用于大规模数据集,可以同时处理数十万甚至数百万的样本和高维特征
3. 精度高:
LightGBM通常能够产生具有竞争力的模型性能,它在比赛中常常获得很好的结果。
4. 支持分类和回归问题:
LightGBM可用于解决分类和回归问题,例如二分类、多分类、回归等。
- 二分类问题:在二分类问题中,目标是将数据分为两个类别,例如垃圾邮件识别(垃圾邮件与非垃圾邮件)或患者疾病预测(患病与不患病)。
- 多分类问题:在多分类问题中,目标是将数据分为多个不同的类别,例如手写数字识别(0到9的数字分类)或物体识别(多个类别的物体分类)。
- 回归问题:在回归问题中,目标是预测一个连续的数值,例如房价预测、股票价格预测或销售额预测。
- 排序问题:LightGBM还可以用于排序任务,例如搜索引擎中的文档排名或推荐系统中的物品推荐排序。在这些问题中,模型需要为每个样本分配一个排序分数。
- 类别不平衡问题:对于类别不平衡的问题,例如欺诈检测或罕见事件预测,LightGBM可以通过合适的参数配置来应对不平衡类别,以提高模型的性能。
- 时间序列预测:LightGBM也可以用于时间序列预测问题,例如股票价格预测、天气预测、交通流量预测等。
- 推荐系统:在推荐系统中,LightGBM可以用于根据用户历史行为来预测用户可能喜欢的物品或内容,从而提供个性化的推荐。
(三)LightGBM实际操作
1. 前期准备
安装相关包……略过
(1)数据格式:
-
LightGBM支持多种数据格式,包括libsvm格式、CSV格式、numpy数组和Pandas DataFrame等。选择适当的数据格式取决于您的数据来源和习惯。
-
在使用LightGBM之前,需要确保数据格式正确,并根据数据集的大小和类型选择合适的数据加载方法。通常,libsvm格式在稀疏数据上效果很好,而CSV格式适用于常规的结构化数据。
(2)参数设置:
核心参数设置,参考:参数 - 【布客】Lightgbm 中文翻译 (apachecn.org)
-
config
, 默认值为空,配置文件的路径 -
任务参数
-
task
, 默认值为train,可选项有:train, predict, convert_model-
train, alias=training, for training
-
predict, alias=prediction, test, for prediction.
-
convert_model, 要将模型文件转换成 if-else 格式
-
-
objective
, (优化目标),默认值为regression, 可选项有:regression, regression_l1, huber, fair, poisson, quantile, quantile_l2, binary, multiclass, multiclassova, xentropy, xentlambda, lambdarank-
回归问题
regression_l2
, L2 loss, alias=regression, mean_squared_error, mseregression_l1
, L1 loss, alias=mean_absolute_error, maehuber
, Huber lossfair
, Fair losspoisson
, Poisson regressionquantile
, Quantile regressionquantile_l2
, 类似于 quantile, 但是使用了 L2 loss -
binary
, 二元分类的交叉熵损失 -
多元分类问题
multiclass
, softmax 目标函数, 应该设置好 num_classmulticlassova
, One-vs-All 二分类目标函数, 应该设置好 num_class -
交叉熵损失
xentropy
, 目标函数为 cross-entropy (同时有可选择的线性权重), alias=cross_entropyxentlambda
, 替代参数化的 cross-entropy, alias=cross_entropy_lambda标签是 [0, 1] 间隔内的任意值
-
lambdarank
, 排序问题的学习算法在 lambdarank 任务中标签应该为 int type, 数值越大代表相关性越高 (e.g. 0:bad, 1:fair, 2:good, 3:perfect)
label_gain 可以被用来设置 int 标签的增益 (权重)
-
-
reg_alpha
:用于设置L1的正则化参数 -
reg_lambda
:用于设置L2的正则化参数
-
-
训练参数
-
boosting
, (提升类型),默认值为gbdt, 可选项有:gbdt, rf, dart, goss, alias=boost, boosting_typegbdt
, 传统的梯度提升决策树rf
, Random Forest (随机森林)dart
, Dropouts meet Multiple Additive Regression Trees(Dropout 与多个加法回归树的结合)goss
, Gradient-based One-Side Sampling (基于梯度的单侧采样)
-
data
, 默认值为"",代表训练数据, LightGBM 将会使用这个数据进行训练 -
valid
, 默认值为"",验证/测试 数据, LightGBM 将输出这些数据的度量- 支持多验证数据集, 以 , 分割
-
num_iterations
,默认值为100,代表boosting 的迭代次数- Note: 对于 Python/R 包, 这个参数是被忽略的, 使用 train and cv 的输入参数 num_boost_round (Python) or nrounds ® 来代替
- Note: 在内部, LightGBM 对于 multiclass 问题设置 num_class * num_iterations 棵树
-
learning_rate
,(学习率),默认值为0.1- shrinkage rate (收缩率)
- 在 dart 中, 它还影响了 dropped trees 的归一化权重
-
bagging_seed
:随机采样的种子,用于确保可复现性 -
bagging_fraction
:每次迭代中随机选择的样本比例,用于减少过拟合风险 -
bagging_freq
:随机采样的频率,每隔多少次进行一次随机采样 -
feature_fraction
:每次迭代中随机选择的特征比例,用于减少过拟合风险 -
metric
:模型评估指标
-
-
树的参数
num_leaves
, 默认值为31, 每棵树上的最大叶子数min_child_samples
(叶子节点最小样本数):叶子节点上所需的最小样本数,用于控制叶子节点的分裂。max_depth
:树的最大深度,设置为-1表示不限制树的深度tree_learner
,默认值为serial, 可选项有:serial, feature, data, voting, alias=treeserial
, 单台机器的 tree learnerfeature
, alias=feature_parallel, 特征并行的 tree learnerdata
, alias=data_parallel, 数据并行的 tree learnervoting
,alias=voting_parallel, 投票并行的 tree learner
-
性能设置
-
num_threads
, 默认值为OpenMP_default, type=int, LightGBM 的线程数- 为了更快的速度, 将此设置为真正的 CPU 内核数, 而不是线程的数量 (大多数 CPU 使用超线程来使每个 CPU 内核生成 2 个线程)
- 当你的数据集小的时候不要将它设置的过大 (比如, 当数据集有 10,000 行时不要使用 64 线程)
- 请注意, 任务管理器或任何类似的 CPU 监视工具可能会报告未被充分利用的内核. 这是正常的
- 对于并行学习, 不应该使用全部的 CPU 内核, 因为这会导致网络性能不佳
-
device
, 默认为cpu, 可选项有:cpu, gpu- 为树学习选择设备, 你可以使用 GPU 来获得更快的学习速度
- Note: 建议使用较小的 max_bin (e.g. 63) 来获得更快的速度
- Note: 为了加快学习速度, GPU 默认使用32位浮点数来求和. 你可以设置 gpu_use_dp=true 来启用64位浮点数, 但是它会使训练速度降低
-
(3)并行加速:
- LightGBM支持多线程并行训练,可以充分利用多核处理器来加速模型的训练。在训练命令中,可以通过设置
nthread
参数来指定使用的线程数。 - 了解系统的硬件资源和LightGBM的并行化能力,以合理配置并行训练参数,以便充分发挥计算资源的潜力。
(4)GPU加速:
- LightGBM还支持使用GPU进行加速,这可以进一步提高模型的训练速度。要使用GPU,需要配置GPU的相关参数,并确保系统中已经安装了适当的GPU驱动程序和CUDA工具包。
- 通过设置GPU相关参数,可以指定使用哪个GPU设备,以及在模型训练过程中的GPU资源分配。
2. 实际演示
(1)获取数据
以UCI Raisin数据集为例
导入相关包
import numpy as np
import pandas as pd
from ucimlrepo import fetch_ucirepo
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
import lightgbm as lgb
import matplotlib.pyplot as plt
获取UCI Raisin数据集
# fetch dataset
raisin = fetch_ucirepo(id=850)
# data (as pandas dataframes)
train = raisin.data.features
label = raisin.data.targets
# metadata
print(raisin.metadata)
# variable information
print(raisin.variables)
查看输入属性与输出属性
train.info()
label.info()
发现是object数据类型,进行字典编码
def change_object_cols(se):
value = se.unique().tolist()
value.sort()
return se.map(pd.Series(range(len(value)), index=value)).values
label['Class'] = change_object_cols(label['Class'])
label.info()
全部转换为0、1编码
label['Class'].values
(2)转换格式
将数据集分为训练集与测试集,构建lgb中的Dataset数据格式
x_train, x_test, y_train, y_test = train_test_split(train, label, test_size=0.3, random_state=0)
y_train = y_train.values.ravel()
y_test = y_test.values.ravel()
lgb_train = lgb.Dataset(x_train, y_train)
lgb_test = lgb.Dataset(x_test, y_test)
(3)设定参数
此数据集是二分类数据集,因此objective
设置为’binary’,metric
评估指标设置为‘binary_logloss’,使用‘gbdt’方法进行训练。
params = {
'num_leaves': 6,
'objective': 'binary',
'metric':'binary_logloss',
'verbose': 0,
'boosting_type': 'gbdt',
'feature_fraction':0.8,
'bagging_fraction':0.8,
'early_stopping_round': 20,
'max_depth':8,
'learning_rate':0.03
}
(4)开始训练
eval_result用于存放每次迭代过程的损失函数值,用于可视化训练过程。
eval_result = {}
gbm = lgb.train(params,
lgb_train,
num_boost_round=100,
valid_sets=[lgb_train, lgb_test],
feature_name=[str(i) for i in train.columns.values.tolist()],
evals_result=eval_result,
verbose_eval=10)
(5)可视化训练过程
- 损失函数曲线
ax = lgb.plot_metric(eval_result, metric='binary_logloss')
plt.show()
- 特征重要程度
ax = lgb.plot_importance(gbm, max_num_features=7)
plt.show()
- 展示其中索引为50的树
并同时显示分裂增益和分裂的特征名称
ax = lgb.plot_tree(gbm, tree_index=50, figsize=(20, 8), show_info=['split_gain', 'split_feature'])
plt.show()