一直想把XGBoost和LightGBM的原理及应用梳理完分享给大家,但是内容有点多,也有些存疑的点在慢慢厘清,这篇文章也是断断续续在整理。
今天终于梳理完Lightgbm参数详解啦,希望对大家有帮助。
对LightGBM原理感兴趣的可翻看历史文章:LightGBM三部曲:LightGBM原理。
对XGBoost原理、参数详解、实战感兴趣可翻看历史文章:XGBoost三部曲:XGBoost原理、XGBoost三部曲:XGBoost参数详解、XGBoost三部曲:XGBoost实战。
LigthGBM是微软开发的一款高性能梯度提升框架,是一种集成学习算法,属于Boosting类型,通过叠加多个决策树的预测结果得出最终的预测结果。
因其 训练速度快、内存消耗低、性能优异 而受到数据科学界的广泛青睐。
这个算法基于GBDT,对树模型基础知识不了解的小伙伴可以翻看之前的文章:Python中调用sklearn决策树、一文弄懂随机森林的原理和应用、一文弄懂GBDT原理和应用。
本文将详细介绍LightGBM的核心参数、两种接口的使用方法及参数调优技巧,帮助你全面掌握这一强大工具。
本文目录
- LightGBM简介
- LightGBM核心参数详解
2.1 核心参数
2.2 学习控制参数
2.3 目标参数 3. 两种接口详解
3.1 原生接口
3.2 Sklearn接口
3.3 回归问题示例 4. 参数调优指南
4.1 参数搜索策略
4.2 自动调参方法 5. 实践技巧与注意事项
总结
一、LightGBM简介
LightGBM(Light Gradient Boosting Machine)是基于梯度提升决策树(GBDT)算法的优化实现。
与XGBoost相比,LightGBM引入了 基于梯度的单边采样(GOSS)和互斥特征捆绑(EFB) 等创新技术,大大提升了处理大数据集的效率。
LightGBM支持 分类、回归、排序 等多种任务,并提供了 原生接口和Scikit-learn接口 两种使用方式,灵活适应不同用户的需求。
二、LightGBM核心参数详解
1 核心参数
这些参数控制着模型的基本结构和学习方式:
-
boosting_type :提升算法类型,可选
gbdt(默认)、rf(随机森林)、dart(带Dropout的GBDT)或goss(基于梯度的单边采样)。 -
num_leaves :一棵树上的叶子数量,整数,默认为31。LightGBM使用leaf-wise生长策略,这是控制模型复杂度的主要参数。
-
learning_rate :学习率,控制每一步迭代的权重缩减,浮点数,默认为0.1。较小学习率通常配合更多树使用。
-
num_iterations :提升迭代次数(树的数量),整数,默认为100。Sklearn接口中对应参数为
n\_estimators。 -
tree_learner :并行学习方式,可选
serial(默认)、feature(特征并行)、data(数据并行)或voting(投票并行)。 -
device :计算设备,默认为
cpu,还可选gpu。
2 学习控制参数
这些参数影响模型的学习过程和正则化:
-
max_depth :树的最大深度,默认为-1(无限制)。 当模型过拟合时,可首先考虑降低max_depth 。
-
min_split_gain:在树的叶节点上进行进一步分割所需的最小损失减少量,浮点数,默认为0。
-
min_child_weight/min_sum_hessian_in_leaf:一个叶节点上的最小hessian和(样本权重和),浮点数,默认为1e-3,增大数值会得到较浅的树深。
-
min_data_in_leaf/min_child_samples :一个叶节点的最小样本数,默认为20, 调大可以防止过拟合 。
-
feature_fraction /
colsample\_bytree:构建每棵树时的特征采样比例,取值范围为[0.0, 1.0],默认值为0。 调小可以防止过拟合,加快运算速度 ,典型值在0.5-1范围内。 -
bagging_fraction /
subsample:每次迭代中使用的数据采样比例,取值范围为[0.0, 1.0],默认值为0。 小于1.0时可以防止过拟合 。 -
bagging_freq /
subsample\_freq:bagging频率,0表示禁用bagging,k表示每k次迭代执行bagging。 -
lambda_l1 /
reg\_alpha:L1正则化项的权重系数, 越大模型越保守 ,默认为0。 -
lambda_l2 /
reg\_lambda:L2正则化项的权重系数, 越大模型越保守 ,默认为0。
3 目标参数
- objective :指定学习任务和目标函数,如:
regression:回归任务(L2损失)regression\_l1:回归任务(L1损失)binary:二分类任务multiclass:多分类任务- 还有许多其他选项如
poisson、quantile等
-
metric :评估指标,如
l1、l2、auc、binary\_logloss等,支持同时指定多个指标。
三、两种接口详解
1 原生接口
原生接口提供 更丰富的功能和更灵活的参数控制 ,适合需要深度定制和高级功能的用户。
基本使用流程:
import lightgbm as lgb
import numpy as np
# 准备数据
data = np.random.rand(500, 10) # 500个样本,每个10个特征
label = np.random.randint(2, size=500) # 二元目标变量
# 创建Dataset对象
lgb_train = lgb.Dataset(data, label=label)
# 设置参数
params = {
'task': 'train',
'boosting_type': 'gbdt',
'objective': 'binary',
'metric': {'l2', 'auc'},
'num_leaves': 31,
'learning_rate': 0.05,
'feature_fraction': 0.9,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'verbose': 1
}
# 训练模型
gbm = lgb.train(params, lgb_train, num_boost_round=20)
# 预测
y_pred = gbm.predict(data)
得到结果:
2 Sklearn接口
Sklearn接口 与Scikit-learn生态系统无缝集成 ,使用简单方便,适合熟悉Scikit-learn的用户。
基本使用流程:
from lightgbm import LGBMClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 准备数据
X_train, X_test, y_train, y_test = train_test_split(data, label, test_size=0.2)
# 创建模型
model = LGBMClassifier(objective='binary',
num_leaves=31,
learning_rate=0.05,
n_estimators=20)
# 训练模型
model.fit(X_train, y_train,
eval_set=[(X_test, y_test)],
eval_metric='l1',
early_stopping_rounds=5)
# 预测
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
得到结果:
3 回归问题示例
对于回归问题, 基本使用流程:
from lightgbm import LGBMRegressor
# 创建回归模型
gbm = LGBMRegressor(objective='regression',
num_leaves=31,
learning_rate=0.05,
n_estimators=20)
# 训练
gbm.fit(X_train, y_train,
eval_set=[(X_test, y_test)],
eval_metric='l1',
early_stopping_rounds=5)
得到结果:
四、参数调优指南
1 参数搜索策略
预先固定的参数 :
learning\_rate:0.05~0.1,学习率较小比较稳定,默认0.1。n\_estimators:100~1000,可设置较大值配合early\_stopping\_round自动选择最佳迭代次数。min\_split\_gain:默认为0,不建议调整。min\_child\_weight:默认为0.001,一般设置为1。
通过算法搜索的参数 :
-
max\_depth:3,4,5(过大容易过拟合)。 -
num\_leaves:应小于2^max\_depth。 -
subsample:搜索范围[0.8, 0.9, 1.0]。 -
colsample\_bytree:搜索范围[0.8, 0.9, 1.0]。 -
reg\_alpha:0-1000范围。 -
reg\_lambda:0-1000范围,一般比reg\_alpha略大。
2 自动调参方法
Grid Search网格搜索:
from sklearn.model_selection import GridSearchCV
# 定义参数网格
param_grid = {
'num_leaves': [10, 20, 30],
'learning_rate': [0.01, 0.1, 1],
'n_estimators': [50, 100, 200]
}
# 定义模型
lgb_model = lgb.LGBMClassifier()
# 网格搜索
grid_search = GridSearchCV(lgb_model, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)
# 输出最优参数
print("Best Parameters:", grid_search.best_params_)
得到结果:
Best Parameters: {'learning\_rate': 0.01, 'n\_estimators': 200, 'num\_leaves': 20}
Random Search随机搜索:
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform, randint
# 定义参数分布
param_dist = {
'num_leaves': randint(10, 50),
'learning_rate': uniform(0.01, 0.1),
'n_estimators': randint(50, 200)
}
# 随机搜索
random_search = RandomizedSearchCV(lgb_model, param_dist, n_iter=10,
cv=5, scoring='accuracy')
random_search.fit(X_train, y_train)
# 输出最优参数
print("Best Parameters:", random_search.best_params_)
得到结果:
Best Parameters: {'learning\_rate': 0.01346239693807332, 'n\_estimators': 113, 'num\_leaves': 10}
五、实践技巧与注意事项
1.类别特征处理 :LightGBM 直接支持类别特征 ,无需独热编码,这比XGBoost更有优势。使用时需要将特征指定为categorical\_feature参数。
2.不平衡数据集 :对于类别不平衡问题,可设置is\_unbalance=True或使用scale\_pos\_weight参数。
3.提前停止 :使用early\_stopping\_rounds参数可以在验证集性能不再提升时自动停止训练,防止过拟合。
4.内存优化 :设置bin\_construct\_sample\_cnt和max\_bin可以控制内存使用量,在处理大数据集时特别有用。
5.并行学习 :通过设置tree\_learner参数可以选择不同的并行学习方式,充分利用多核CPU性能。
六、总结
LightGBM是一个强大且高效的梯度提升框架,通过合理调整参数可以获得优异的性能。两种接口各有优势:
- 原生接口 :功能丰富、灵活性强,适合高级用户和复杂场景。
- Sklearn接口 :简单易用、与Scikit-learn生态无缝集成,适合快速原型开发和熟悉Scikit-learn的用户。
掌握LightGBM的核心参数含义和调优技巧,将帮助你在实际项目中构建更高效、更准确的机器学习模型。
希望本文能为你提供全面的LightGBM参数指南,助你在实际项目中游刃有余!
对风控策略和建模感兴趣的小伙伴欢迎加群讨论。
【部分群限时免费进** 】** 分群讨论学习Python、玩转Python、风控建模【29.9元进】、人工智能、数据分析相关问题,还提供招聘内推信息、优秀文章、学习视频、公众号文章答疑,也可交流工作中遇到的难题。如需添加微信号19967879837,加时备注想进的群,比如风控建模。
往期回顾:
一文囊括风控模型搭建(原理+Python实现),持续更新。。。
不同工作年限风控建模岗薪资水平如何?招聘最看重面试者什么能力?
100天精通风控建模(原理+Python实现)——第32天:集成学习是什么?在风控建模中有哪些应用?
限时免费加群
19967879837
添加 微信号、手机号
