人工智能算法-LightGBM模型详解

发布于 2025-4-2 00:30
3634浏览
0收藏

 LightGBM是一个快速、高效的梯度提升框架,他由微软开发,在数据挖掘和机器学习领域应用广泛。接下来详细介绍下他的原理

 1. 梯度提升框架:LightGBM基于梯度提升决策树(GBDT)算法,通过迭代地训练决策树来逐步减少预测误差。它将弱学习器(如决策树)组合成一个强学习器,不断地根据之前模型的误差来调整新模型的训练,从而提高整体模型的准确性。

举例:

假设有一个预测房价的任务,我们有一些房屋的特征数据,如面积、房间数、房龄等,目标是根据这些特征预测房屋的价格。LightGBM会先初始化一个简单的模型,比如预测所有房屋价格都是一个固定值(可以是房价的平均值),这是初始的弱学习器。然后,计算这个初始模型的预测误差,即真实房价与预测房价的差值。接下来,根据这个误差来训练一个新的决策树,这个决策树的目标是尽量纠正之前模型的误差。将新的决策树与之前的模型结合起来,得到一个新的、更准确的模型。不断重复这个过程,每次都根据上一轮模型的误差来训练新的决策树并加入到模型中,使模型的预测能力不断提升。 

2.  Leaf - Wise生长策略:与传统的按层生长的决策树不同,LightGBM采用了Leaf - Wise的生长方式。它每次选择增益最大的叶子节点进行分裂,而不是像层生长那样在每一层上对所有节点同时进行分裂。这种策略可以更快速地找到最优的分裂点,减少不必要的计算,提高模型训练速度。

人工智能算法-LightGBM模型详解-AI.x社区

举例:

在构建决策树时,传统的按层生长方式是每一层都对所有节点进行分裂,不管这个节点是否真的有必要分裂。而LightGBM的Leaf - Wise生长策略会从根节点开始,每次选择一个增益最大的叶子节点进行分裂。例如,在预测房价的决策树中,可能某个叶子节点包含的房屋大多是房龄较新且面积较大的,这些房屋的价格相对较高且比较集中。如果按照层生长,可能会对这个节点所在层的其他节点也进行分裂,而那些节点可能已经比较纯了,分裂意义不大。但Leaf - Wise策略会优先选择这个叶子节点继续分裂,比如根据房间数进一步细分,因为这样可能会带来更大的信息增益,能更精准地预测房价。

3. 直方图算法:LightGBM使用直方图算法来优化特征的离散化和数据的统计。它将连续的特征值离散化为有限个区间,然后在这些区间上构建直方图。通过对直方图的统计和计算,可以快速找到最优的分裂点,大大减少了计算量,同时也能有效地处理大规模数据。

人工智能算法-LightGBM模型详解-AI.x社区

举例:

假设我们有一个房屋面积的特征,其取值范围是0到1000平方米。LightGBM会先将这个连续的特征值离散化为有限个区间,比如0 - 100平方米、100 - 200平方米等。然后,对于每个训练数据点,根据其房屋面积落入相应的区间,并在该区间的直方图中计数加1。在寻找最优分裂点时,LightGBM只需要在这些离散的区间上进行计算,而不用像传统方法那样对每个具体的面积值进行遍历计算。例如,要判断在哪个面积区间进行分裂能使房价的预测更准确,只需要比较不同区间的统计信息,如区间内房屋的平均价格、数量等,大大减少了计算量。

LightGBM代码实现

完整代码示例(房价预测)

1 数据准备

import lightgbm as lgb

from sklearn.datasets import fetch_california_housing

from sklearn.model_selection import train_test_split

from sklearn.metrics import mean_squared_error

#加载加州房价数据集

data = fetch_california_housing()

X, y = data.data, data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

#转换为LightGBM Dataset格式

train_data = lgb.Dataset(X_train, label=y_train)

test_data = lgb.Dataset(X_test, label=y_test, reference=train_data)

2 参数设置

params = {

'objective': 'regression',

'metric': 'mse',

'boosting_type': 'gbdt',

'num_leaves': 31,

'learning_rate': 0.05,

'feature_fraction': 0.8,

'lambda_l1': 0.1,

'lambda_l2': 0.1,

'max_depth': 5,

'min_data_in_leaf': 20,

'verbose': -1

}

3 模型训练与早停

evals_result = {} # 记录评估结果

model = lgb.train(

params,

train_data,

valid_sets=[train_data, test_data],

valid_names=['train', 'test'],

num_boost_round=1000,

early_stopping_rounds=50,

verbose_eval=50,

evals_result=evals_result

)

4 模型评估与可视化

#预测并计算RMSE

y_pred = model.predict(X_test)

rmse = mean_squared_error(y_test, y_pred, squared=False)

print(f'Test RMSE: {rmse:.3f}')

#可视化特征重要性

lgb.plot_importance(model, figsize=(10, 6), max_num_features=10)

#绘制训练曲线

lgb.plot_metric(evals_result, metric='mse', figsize=(10, 5))

5 使用SHAP解释模型

import shap

#创建SHAP解释器

explainer = shap.TreeExplainer(model)

shap_values = explainer.shap_values(X_test)

#可视化单个样本的特征贡献

shap.force_plot(explainer.expected_value, shap_values[0,:], X_test[0,:], feature_names=data.feature_names)

#全局特征重要性

shap.summary_plot(shap_values, X_test, feature_names=data.feature_names)

LightGBM与XGBoost和CatBoost比较

人工智能算法-LightGBM模型详解-AI.x社区


LightGBM过拟合该如何处理?

1.数据层面:确保样本量> 10,000,避免小数据使用LightGBM。

2.参数调优:

  • 降低num_leaves(如从31减至15)。
  • 增大min_data_in_leaf(如从20增至100)。
  • 提高正则化项(lambda_l1和lambda_l2)。

3.早停法:监控验证集误差,提前终止训练。

LightGBM优点

 ● 训练速度快:采用了Leaf - Wise生长策略和直方图算法等优化技术,能够在较短的时间内处理大规模数据集,提高模型训练效率。

 ● 内存占用少:对数据的存储和计算进行了优化,通过直方图等数据结构来压缩数据,减少了内存的使用,适合处理内存受限的问题。

 ● 可扩展性强:支持大规模数据集和分布式训练,可以在多台机器上并行训练模型,加速模型的训练过程,适用于处理海量数据的场景。

 ● 鲁棒性好:对数据中的噪声和异常值具有较好的鲁棒性,能够在一定程度上避免过拟合,提高模型的泛化能力。

本文转载自 人工智能训练营​,作者: 小A学习

收藏
回复
举报
回复
相关推荐