LightGBM的参数详解以及如何调优(下)

简介: LightGBM的参数详解以及如何调优

训练参数

当你想用lightgbm训练你的模型时,一些典型的问题可能会出现:

  1. 训练是一个耗时的过程
  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 = dataset_name.select_dtypes(‘object’).columns.tolist()

但是在幕后发生了什么,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函数

deffeval_func(preds, train_data):
#Defineaformulathatevaluatestheresultsreturn ('feval_func_name', eval_result, False)

使用这个函数作为参数:

print('Start training...')
lgb_train=lgb.train(...,
metric=None,
feval=feval_func)

注意:要使用feval函数代替度量,您应该设置度量参数 metric “None”。

分类参数与回归参数

我之前提到的大多数事情对于分类和回归都是正确的,但是有些事情需要调整。

具体你应该:

640.png

lightgbm最重要的参数

我们已经在前面的部分中回顾并了解了有关lightgbm参数的知识,但是如果不提及Laurae令人难以置信的基准测试,那么关于增强树的文章将是不完整的。

您可以了解用于lightGBM和XGBoost的许多问题的最佳默认参数。

你可以查看这里(https://sites.google.com/view/lauraepp/parameters),但一些最重要的结论是:

640.png

640.png

640.png

注意:绝对不要理会任何参数值的默认值,并根据您的问题进行调整。也就是说,这些参数是超参数调整算法的一个很好的起点。

Python中的Lightgbm参数调整示例

最后,在解释完所有重要参数之后,该进行一些实验了!

我将使用最受欢迎的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}

这样,您就可以将基线值与搜索空间分开!

640.png

如果您查看了上一节,则会发现我在数据集上进行了14个以上的不同实验。在这里,我解释了如何逐步调整超参数的值。

创建基线训练代码:

fromsklearn.metricsimportroc_auc_score, roc_curvefromsklearn.model_selectionimporttrain_test_splitimportneptunecontrib.monitoring.skoptassk_utilsimportlightgbmaslgbimportpandasaspdimportneptuneimportskoptimportsysimportosSEARCH_PARAMS= {'learning_rate': 0.4,
'max_depth': 15,
'num_leaves': 32,
'feature_fraction': 0.8,
'subsample': 0.2}
FIXED_PARAMS={'objective': 'binary',
'metric': 'auc',
'is_unbalance':True,
'bagging_freq':5,
'boosting':'dart',
'num_boost_round':300,
'early_stopping_rounds':30}
deftrain_evaluate(search_params):
#youcandownloadthedatasetfromthislink(https://www.kaggle.com/c/santander-customer-transaction-prediction/data)#importDatasettoplaywithitdata=pd.read_csv("sample_train.csv")
X=data.drop(['ID_code', 'target'], axis=1)
y=data['target']
X_train, X_valid, y_train, y_valid=train_test_split(X, y, test_size=0.2, random_state=1234)
train_data=lgb.Dataset(X_train, label=y_train)
valid_data=lgb.Dataset(X_valid, label=y_valid, reference=train_data)
params= {'metric':FIXED_PARAMS['metric'],
'objective':FIXED_PARAMS['objective'],
**search_params}
model=lgb.train(params, train_data,                    
valid_sets=[valid_data],
num_boost_round=FIXED_PARAMS['num_boost_round'],
early_stopping_rounds=FIXED_PARAMS['early_stopping_rounds'],
valid_names=['valid'])
score=model.best_score['valid']['auc']
returnscore

使用您选择的超参数优化库(例如scikit-optimize)。

neptune.init('mjbahmani/LightGBM-hyperparameters')
neptune.create_experiment('lgb-tuning_final', upload_source_files=['*.*'],
tags=['lgb-tuning', 'dart'],params=SEARCH_PARAMS)
SPACE= [
skopt.space.Real(0.01, 0.5, name='learning_rate', prior='log-uniform'),
skopt.space.Integer(1, 30, name='max_depth'),
skopt.space.Integer(10, 200, name='num_leaves'),
skopt.space.Real(0.1, 1.0, name='feature_fraction', prior='uniform'),
skopt.space.Real(0.1, 1.0, name='subsample', prior='uniform')
]
@skopt.utils.use_named_args(SPACE)
defobjective(**params):
return-1.0*train_evaluate(params)
monitor=sk_utils.NeptuneMonitor()
results=skopt.forest_minimize(objective, SPACE,
n_calls=100, n_random_starts=10,
callback=[monitor])
sk_utils.log_results(results)
neptune.stop()

注,本文代码使用了neptune.ai平台,所以有一些neptune的api

完整代码在这里 https://ui.neptune.ai/mjbahmani/LightGBM-hyperparameters/experiments?viewId=standard-view&utm_source=medium&utm_medium=crosspost&utm_campaign=blog-lightgbm-parameters-guide

尝试不同类型的配置并在Neptune中跟踪结果

640.png

最后,在下表中,您可以看到参数中发生了什么变化。

640.png

总结

长话短说,您了解到:

  1. lightgbm的主要参数是什么,
  2. 如何使用feval函数创建自定义指标
  3. 主要参数的默认值是多少
  4. 看到了如何调整lightgbm参数以改善模型性能的示例
目录
相关文章
|
1月前
|
机器学习/深度学习 Python
使用Python实现超参数调优
使用Python实现超参数调优
26 0
|
1月前
|
机器学习/深度学习 算法 Python
CatBoost中级教程:超参数调优与模型选择
CatBoost中级教程:超参数调优与模型选择【2月更文挑战第12天】
202 2
|
1月前
|
机器学习/深度学习 算法 Python
探索XGBoost:参数调优与模型解释
探索XGBoost:参数调优与模型解释
172 2
|
1月前
|
Swift
ModelScope这个怎么使用本地的调优前的模型文件
ModelScope这个怎么使用本地的调优前的模型文件【1月更文挑战第4天】【1月更文挑战第16篇】
82 1
|
11月前
|
机器学习/深度学习 算法 PyTorch
机器学习之PyTorch和Scikit-Learn第6章 学习模型评估和超参数调优的最佳实践Part 2
本节中,我们来看两个非常简单但强大的诊断工具,可帮助我们提升学习算法的性能:学习曲线和验证曲线,在接下的小节中,我们会讨论如何使用学习曲线诊断学习算法是否有过拟合(高方差)或欠拟合(高偏置)的问题。另外,我们还会学习验证曲线,它辅助我们处理学习算法中的常见问题。
262 0
机器学习之PyTorch和Scikit-Learn第6章 学习模型评估和超参数调优的最佳实践Part 2
|
API
XGBoost超参数调优指南
本文将详细解释XGBoost中十个最常用超参数的介绍,功能和值范围,及如何使用Optuna进行超参数调优。
332 1
|
机器学习/深度学习 算法 数据可视化
使用Optuna进行PyTorch模型的超参数调优
Optuna是一个开源的超参数优化框架,Optuna与框架无关,可以在任何机器学习或深度学习框架中使用它。本文将以表格数据为例,使用Optuna对PyTorch模型进行超参数调优。
160 0
|
机器学习/深度学习 并行计算 数据可视化
PyTorch自定义CUDA算子教程与运行时间分析
PyTorch自定义CUDA算子教程与运行时间分析
240 0
|
机器学习/深度学习 Dart 算法
LightGBM的参数详解以及如何调优(上)
LightGBM的参数详解以及如何调优
525 0
LightGBM的参数详解以及如何调优(上)
|
机器学习/深度学习 数据可视化 算法
使用TensorBoard进行超参数优化
使用TensorBoard进行超参数优化
262 0
使用TensorBoard进行超参数优化