LightGBM的参数详解以及如何调优
lightGBM可以⽤来解决⼤多数表格数据问题的算法。有很多很棒的功能,并且在kaggle这种该数据⽐赛中会经常使⽤。
但我⼀直对了解哪些参数对性能的影响最⼤以及我应该如何调优lightGBM参数以最⼤限度地利⽤它很感兴趣。
我想我应该做⼀些研究,了解更多关于lightGBM的参数…并分享我的旅程。
我希望读完这篇⽂章后,你能回答以下问题:
LightGBM中实现了哪些梯度增强⽅法,它们有什么区别?
⼀般来说,哪些参数是重要的?
哪些正则化参数需要调整?
如何调整lightGBM参数在python?
梯度提升的⽅法
使⽤LightGBM,你可以运⾏不同类型的渐变增强提升⽅法。你有:GBDT、DART和GOSS,这些可以通过“boosting”参数指定。
在下⼀节中,我将对这些⽅法进⾏解释和⽐较。
梯度提升决策树(GBDT)
高考出分时间
该⽅法是本⽂⾸先提出的传统梯度提升决策树,也是XGBoost和pGBRT等优秀库背后的算法。
由于其精度⾼、效率⾼、稳定性好,⽬前已得到⼴泛的应⽤。你可能知道gbdt是⼀个决策树的集合模型但是它到底是什么意思呢?
让我来告诉你要点。
它基于三个重要原则:
弱学习者(决策树)
梯度优化
提升技术
所以在gbdt⽅法中,我们有很多决策树(弱学习者)。这些树是按顺序构建的:
⾸先,树学习如何适应⽬标变量
第⼆棵树学习如何适合残差(差异)之间的预测,第⼀棵树和地⾯真相
第三棵树学习如何匹配第⼆棵树的残差,以此类推。fad
所有这些树都是通过传播整个系统的误差梯度来训练的。
gbdt的主要缺点是,在每个树节点中找到最佳分割点⾮常耗时,⽽且会消耗内存。其他的提升⽅法试图解决这个问题。
DART 梯度提升
在这篇优秀的论⽂中(arxiv/1505.01866),你可以学习所有关于DART梯度提升的东西,这是⼀种使⽤dropout(神经⽹络中的标准)的⽅法,来改进模型正则化和处理⼀些其他不太明显的问题。
也就是说,gbdt存在过度专门化(over-specialization)的问题,这意味着在以后的迭代中添加的树往往只会影响对少数实例的预测,⽽对其余实例的贡献则可以忽略不计。添加dropout会使树在以后的迭代中更加难以专门化那些少数的⽰例,从⽽提⾼性能。
lgbm goss 基于梯度的单边采样
事实上,将该⽅法命名为lightgbm的最重要原因就是使⽤了基于本⽂的Goss⽅法。Goss是较新的、较轻的gbdt实现(因此
是“light”gbm)。
标准的gbdt是可靠的,但在⼤型数据集上速度不够快。因此goss提出了⼀种基于梯度的采样⽅法来避免搜索整个搜索空间。我们知道,对于每个数据实例,当梯度很⼩时,这意味着不⽤担⼼数据是经过良好训练的,⽽当梯度很⼤时,应该重新训练。这⾥我们有两个⽅⾯,数据实例有⼤的和⼩的渐变。因此,goss以⼀个⼤的梯度保存所有数据,并对⼀个⼩梯度的数据进⾏随机抽样(这就是为什么它被称为单边抽样)。这使得搜索空间更⼩,goss的收敛速度更快。
让我们把这些差异放在⼀个表格中:
注意:如果你将增强设置为RF,那么lightgbm算法表现为随机森林⽽不是增强树! 根据⽂档,要使⽤RF,必须使⽤bagging_fraction和feature_fraction⼩于1。
正则化
在这⼀节中,我将介绍lightgbm的⼀些重要的正则化参数。显然,这些是您需要调优以防⽌过拟合的参数。
您应该知道,对于较⼩的数据集(<10000条记录),lightGBM可能不是最佳选择。在这⾥,调优lightgbm参数可能没有帮助。
此外,lightgbm使⽤叶向树⽣长算法,⽽xgboost使⽤深度树⽣长算法。叶向⽅法使树的收敛速度更快,但过拟合的⼏率增加。
注意:如果有⼈问您LightGBM和XGBoost之间的主要区别是什么?你可以很容易地说,它们的区别在于它们是如何实现的。
根据lightGBM⽂档,当⾯临过拟合时,您可能需要做以下参数调优:
使⽤更⼩的max_bin
使⽤更⼩的num_leaves
使⽤min_data_in_leaf和min_sum_hessian_in_leaf
通过设置bagging_fraction和bagging_freq使⽤bagging_freq
通过设置feature_fraction使⽤特征⼦采样
使⽤更⼤的训练数据
尝试lambda_l1、lambda_l2和min_gain_to_split进⾏正则化
尝试max_depth以避免树的深度增长
在下⾯的部分中,我将更详细地解释这些参数。
lambda_l1
Lambda_l1(和lambda_l2)控制l1/l2,以及min_gain_to_split⽤于防⽌过拟合。我强烈建议您使⽤参数调优(在后⾯的⼩节中讨论)来确定这些参数的最佳值。
num_leaves
num_leaves⽆疑是控制模型复杂性的最重要参数之⼀。通过它,您可以设置每个弱学习者拥有的叶⼦的最⼤数量。较⼤的num_leaves增加了训练集的精确度,也增加了因过度拟合⽽受伤的⼏率。根据⽂档,⼀个简单的⽅法是num_leaves = 2^(max_depth)但是,考虑到在lightgbm中叶状树⽐层次树更深,你需要⼩⼼过度拟合!因此,必须同时使⽤max_depth调优num_leaves。
⼦采样
通过⼦样例(或bagging_fraction),您可以指定每个树构建迭代使⽤的⾏数百分⽐。这意味着将随机选择⼀些⾏来匹配每个学习者(树)。这不仅提⾼了泛化能⼒,也提⾼了训练速度。
我建议对基线模型使⽤更⼩的⼦样本值,然后在完成其他实验(不同的特征选择,不同的树结构)时增加这个值。
feature_fraction
特征分数或⼦特征处理列采样,LightGBM将在每次迭代(树)上随机选择特征⼦集。例如,如果将其设置为0.6,LightGBM将在训练每棵树之前选择60%的特性。
这个功能有两种⽤法:
1. 可以⽤来加速训练吗
2. 可以⽤来处理过拟合吗
max_depth
该参数控制每棵经过训练的树的最⼤深度,将对:
num_leaves参数的最佳值
模型的性能
训练时间
注意,如果您使⽤较⼤的max_depth值,那么您的模型可能会对于训练集过拟合。
max_bin
装箱是⼀种⽤离散视图(直⽅图)表⽰数据的技术。Lightgbm在创建弱学习者时,使⽤基于直⽅图的算法来寻找最优分割点。因此,每个连续的数字特性(例如视频的视图数)应该被分割成离散的容器。
此外,在这个GitHub repo(huanzhang12/lightgbm-gpu)中,你可以找到⼀些全⾯的实验,完全解释了改变max_bin对CPU和GPU的影响。
如果你定义max_bin 255,这意味着我们可以有255个唯⼀的值每个特性。那么,较⼩的max_bin会导致更快的速度,较⼤的值会提⾼准确性。
预测英文
训练参数
当你想⽤lightgbm训练你的模型时,⼀些典型的问题可能会出现:bleacher
1. 训练是⼀个耗时的过程father的含义
2. 处理计算复杂度(CPU/GPU RAM约束)
3. 处理分类特征
4. 拥有不平衡的数据集
5. 定制度量的需要
6. 需要对分类或回归问题进⾏的调整
在本节中,我们将尝试详细解释这些要点。
num_iterations
Num_iterations指定增强迭代的次数(要构建的树)。你建⽴的树越多,你的模型就越精确,代价是:
较长的训练时间
过拟合的可能性更⾼
从较少的树开始构建基线,然后当您想从模型中挤出最后的%时增加基线。
建议使⽤更⼩的learning_rate和更⼤的num_iteration。此外,如果您想要更⾼的num_iteration,那么您应该使⽤
early_stopping_rounds,以便在⽆法学习任何有⽤的内容时停⽌训练。
除湿机 英文early_stopping_rounds
如果验证度量在最后⼀轮停⽌后没有改进,此参数将停⽌训练。这应该与⼀些迭代成对地进⾏定义。如果你把它设置得太⼤,你就增加了过拟合的变化(但你的模型可以更好)。
英语功课表经验法则是让它占num_iterations的10%。
lightgbm categorical_feature
使⽤lightgbm的优势之⼀是它可以很好地处理分类特性。是的,这个算法⾮常强⼤,但是你必须⼩⼼
如何使⽤它的参数。lightgbm使⽤⼀种特殊的整数编码⽅法(由Fisher提出)来处理分类特征
实验表明,该⽅法⽐常⽤的单热编码⽅法具有更好的性能。
它的默认值是“auto”,意思是:让lightgbm决定哪个表⽰lightgbm将推断哪些特性是绝对的。
它并不总是⼯作得很好,我强烈建议您简单地⽤这段代码⼿动设置分类特性
cat_col = datat_name.lect_dtypes(‘object’).list()
但是在幕后发⽣了什么,lightgbm是如何处理分类特征的呢?
根据lightgbm的⽂档,我们知道树学习器不能很好地使⽤⼀种热编码⽅法,因为它们在树中深度⽣长。在提出的替代⽅法中,树形学习器被最优构造。例如,⼀个特征有k个不同的类别,有2^(k-1) -1个可能的划分,通过fisher⽅法,可以改进到k * log(k),通过找到分类特征中值排序直⽅图的最佳分割⽅式。北大考研成绩查询
is_unbalance vs scale_pos_weight
其中⼀个问题,你可能⾯临的⼆分类问题是如何处理不平衡的数据集。显然,您需要平衡正/负样本,但如何在lightgbm中做到这⼀点呢?
lightgbm中有两个参数允许你处理这个问题,那就是is_unbalance和scale_pos_weight,但是它们之间有什么区别呢?
当您设置Is_unbalace: True时,算法将尝试⾃动平衡占主导地位的标签的权重(使⽤列集中的pos/neg分数)
如果您想改变scale_pos_weight(默认情况下是1,这意味着假设正负标签都是相等的),在不平衡数据集的情况下,您可以使⽤以下公式来正确地设置它
sample_pos_weight = number of negative samples / number of positive samples
lgbm函数宏指令(feaval)
有时你想定义⼀个⾃定义评估函数来测量你的模型的性能,你需要创建⼀个“feval”函数。
Feval函数应该接受两个参数:
preds 、train_data
并返回
eval_name、eval_result、is_higher_better
让我们⼀步⼀步地创建⼀个⾃定义度量函数。
定义⼀个单独的python函数
def feval_func(preds, train_data):
# Define a formula that evaluates the results
return ('feval_func_name', eval_result, Fal)
使⽤这个函数作为参数:
print('')
lgb_train = ain(...,
metric=None,
feval=feval_func)
注意:要使⽤feval函数代替度量,您应该设置度量参数 metric “None”。
分类参数与回归参数
我之前提到的⼤多数事情对于分类和回归都是正确的,但是有些事情需要调整。
具体你应该:
2019考研政治lightgbm最重要的参数
我们已经在前⾯的部分中回顾并了解了有关lightgbm参数的知识,但是如果不提及Laurae令⼈难以置信的基准测试,那么关于增强树的⽂章将是不完整的。
您可以了解⽤于lightGBM和XGBoost的许多问题的最佳默认参数。
注意:绝对不要理会任何参数值的默认值,并根据您的问题进⾏调整。 也就是说,这些参数是超参数调整算法的⼀个很好的起点。Python中的Lightgbm参数调整⽰例
sb是什么
最后,在解释完所有重要参数之后,该进⾏⼀些实验了!
我将使⽤最受欢迎的Kaggle竞赛之⼀:Santander Customer Transaction Prediction. 交易预测
我将使⽤本⽂介绍如何在任何脚本中的Python中运⾏超参数调整。
在开始之前,⼀个重要的问题! 我们应该调整哪些参数?
请注意您要解决的问题,例如,Santander 数据集⾼度不平衡,在调整时应考虑到这⼀点!
⼀些参数是相互依赖的,必须⼀起调整。 例如,min_data_in_leaf取决于训练样本和num_leaves的数量。
注意:为超参数创建两个字典是⼀个好主意,⼀个字典包含您不想调整的参数和值,另⼀个字典包含您想要调整的参数和值范围。
SEARCH_PARAMS = {'learning_rate': 0.4,
'max_depth': 15,
'num_leaves': 20,
'feature_fraction': 0.8,
'subsample': 0.2}
FIXED_PARAMS={'objective': 'binary',
'metric': 'auc',
'is_unbalance':True,
'boosting':'gbdt',
'num_boost_round':300,
'early_stopping_rounds':30}
这样,您就可以将基线值与搜索空间分开!
如果您查看了上⼀节,则会发现我在数据集上进⾏了14个以上的不同实验。 在这⾥,我解释了如何逐步调整超参数的值。
创建基线训练代码: