集成学习之Boosting方法系列_LightGBM

【文章系列】

第一章 集成学习_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可用于解决分类和回归问题,例如二分类、多分类、回归等。

  1. 二分类问题:在二分类问题中,目标是将数据分为两个类别,例如垃圾邮件识别(垃圾邮件与非垃圾邮件)或患者疾病预测(患病与不患病)。
  2. 多分类问题:在多分类问题中,目标是将数据分为多个不同的类别,例如手写数字识别(0到9的数字分类)或物体识别(多个类别的物体分类)。
  3. 回归问题:在回归问题中,目标是预测一个连续的数值,例如房价预测、股票价格预测或销售额预测。
  4. 排序问题:LightGBM还可以用于排序任务,例如搜索引擎中的文档排名或推荐系统中的物品推荐排序。在这些问题中,模型需要为每个样本分配一个排序分数。
  5. 类别不平衡问题:对于类别不平衡的问题,例如欺诈检测或罕见事件预测,LightGBM可以通过合适的参数配置来应对不平衡类别,以提高模型的性能。
  6. 时间序列预测:LightGBM也可以用于时间序列预测问题,例如股票价格预测、天气预测、交通流量预测等。
  7. 推荐系统:在推荐系统中,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, mse

        regression_l1, L1 loss, alias=mean_absolute_error, mae

        huber, Huber loss

        fair, Fair loss

        poisson, Poisson regression

        quantile, Quantile regression

        quantile_l2, 类似于 quantile, 但是使用了 L2 loss

      • binary, 二元分类的交叉熵损失

      • 多元分类问题

        multiclass, softmax 目标函数, 应该设置好 num_class

        multiclassova, One-vs-All 二分类目标函数, 应该设置好 num_class

      • 交叉熵损失

        xentropy, 目标函数为 cross-entropy (同时有可选择的线性权重), alias=cross_entropy

        xentlambda, 替代参数化的 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_type

      • gbdt, 传统的梯度提升决策树
      • 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=tree
      • serial, 单台机器的 tree learner
      • feature, alias=feature_parallel, 特征并行的 tree learner
      • data, alias=data_parallel, 数据并行的 tree learner
      • voting,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()

image-20240123121925937

label.info()

image-20240123121937371

发现是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()

image-20240123122037369

全部转换为0、1编码

label['Class'].values

image-20240123122152375

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

image-20240123205608838

(5)可视化训练过程
  • 损失函数曲线
ax = lgb.plot_metric(eval_result, metric='binary_logloss')
plt.show()

image-20240123205706341

  • 特征重要程度
ax = lgb.plot_importance(gbm, max_num_features=7)
plt.show()

image-20240123205823265

  • 展示其中索引为50的树

并同时显示分裂增益和分裂的特征名称

ax = lgb.plot_tree(gbm, tree_index=50, figsize=(20, 8), show_info=['split_gain', 'split_feature'])
plt.show()

image-20240123205932611

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值