
人工智能算法-LightGBM模型详解
LightGBM是一个快速、高效的梯度提升框架,他由微软开发,在数据挖掘和机器学习领域应用广泛。接下来详细介绍下他的原理
1. 梯度提升框架:LightGBM基于梯度提升决策树(GBDT)算法,通过迭代地训练决策树来逐步减少预测误差。它将弱学习器(如决策树)组合成一个强学习器,不断地根据之前模型的误差来调整新模型的训练,从而提高整体模型的准确性。
举例:
假设有一个预测房价的任务,我们有一些房屋的特征数据,如面积、房间数、房龄等,目标是根据这些特征预测房屋的价格。LightGBM会先初始化一个简单的模型,比如预测所有房屋价格都是一个固定值(可以是房价的平均值),这是初始的弱学习器。然后,计算这个初始模型的预测误差,即真实房价与预测房价的差值。接下来,根据这个误差来训练一个新的决策树,这个决策树的目标是尽量纠正之前模型的误差。将新的决策树与之前的模型结合起来,得到一个新的、更准确的模型。不断重复这个过程,每次都根据上一轮模型的误差来训练新的决策树并加入到模型中,使模型的预测能力不断提升。
2. Leaf - Wise生长策略:与传统的按层生长的决策树不同,LightGBM采用了Leaf - Wise的生长方式。它每次选择增益最大的叶子节点进行分裂,而不是像层生长那样在每一层上对所有节点同时进行分裂。这种策略可以更快速地找到最优的分裂点,减少不必要的计算,提高模型训练速度。
举例:
在构建决策树时,传统的按层生长方式是每一层都对所有节点进行分裂,不管这个节点是否真的有必要分裂。而LightGBM的Leaf - Wise生长策略会从根节点开始,每次选择一个增益最大的叶子节点进行分裂。例如,在预测房价的决策树中,可能某个叶子节点包含的房屋大多是房龄较新且面积较大的,这些房屋的价格相对较高且比较集中。如果按照层生长,可能会对这个节点所在层的其他节点也进行分裂,而那些节点可能已经比较纯了,分裂意义不大。但Leaf - Wise策略会优先选择这个叶子节点继续分裂,比如根据房间数进一步细分,因为这样可能会带来更大的信息增益,能更精准地预测房价。
3. 直方图算法:LightGBM使用直方图算法来优化特征的离散化和数据的统计。它将连续的特征值离散化为有限个区间,然后在这些区间上构建直方图。通过对直方图的统计和计算,可以快速找到最优的分裂点,大大减少了计算量,同时也能有效地处理大规模数据。
举例:
假设我们有一个房屋面积的特征,其取值范围是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过拟合该如何处理?
1.数据层面:确保样本量> 10,000,避免小数据使用LightGBM。
2.参数调优:
- 降低num_leaves(如从31减至15)。
- 增大min_data_in_leaf(如从20增至100)。
- 提高正则化项(lambda_l1和lambda_l2)。
3.早停法:监控验证集误差,提前终止训练。
LightGBM优点
● 训练速度快:采用了Leaf - Wise生长策略和直方图算法等优化技术,能够在较短的时间内处理大规模数据集,提高模型训练效率。
● 内存占用少:对数据的存储和计算进行了优化,通过直方图等数据结构来压缩数据,减少了内存的使用,适合处理内存受限的问题。
● 可扩展性强:支持大规模数据集和分布式训练,可以在多台机器上并行训练模型,加速模型的训练过程,适用于处理海量数据的场景。
● 鲁棒性好:对数据中的噪声和异常值具有较好的鲁棒性,能够在一定程度上避免过拟合,提高模型的泛化能力。
本文转载自 人工智能训练营,作者: 小A学习
