Gradient Boosting(GBM) 调参指南

机器学习笔记04梯度提升树(GBDT)调参 # -*- coding: utf-8 -*- ''' 数据: train_modified ''' ''' scikit-learn 梯度提升树(GBDT)算法类库 GBDT分类类: GradientBoostingClassifier; GBDT回归类: GradientBoostingRegressor GBDT类库boosting框架参数 (1)n_estimators(最大的弱学习... 阅读详情
AI摘要

本文介绍了Gradient Boosting Machine(GBM)的工作原理及其参数调优策略,详细讲解了树特有参数、Boosting参数和其他参数的具体含义及调参方法,并提供了一步步的实践案例。

译文:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python

简介

这边文章帮助大家去看看GBM的是如何真正工作的。原文受启发于 NYC Data Science Academy 与bagging 在模型中只控制高方差不同的是,Boosting 算法善于处理偏差(bias)方差(variance)问题(trade-off),且比bagging更有效。
这篇文章将会揭露GBM背后的科学原理,且教会你如何进行参数调优从而获得可靠的结果。

How boosting works?

Boosting 是一个以融合原则工作的序列技术,将一系列的弱学习器进行组合从而提升预测的准确率。模型第t次迭代的结果,是基于前t-1次的结果进行赋权。如果样本被正确预测了将会被富裕较低的权重,反之,预测错误的样本将会被赋予较高的权重。
如下例所示:
这里写图片描述

  • 图一:输出第一个弱分类器
    • 一开始所有的样本权重一样(取决于样本的大小)
    • 决策边界正确预测了2个正样本和5个负样本
  • 图二:输出第二个弱分类器

    • 在图一中被正确分类的样本被赋予较低的权重,错误分类的样本将被赋予较高的权重
    • 模型现在专注于高权重的样本且能将其正确分类,但是其他样本被错误分类了

    与图二类似的变化将会在图三中看到,这种情况将会迭代多次,直到模型给样本的权重取决于模型的准确率,最终生成一个合并的结果

以下几篇文章可以参考:
Learn Gradient Boosting Algorithm for better predictions (with codes in R)
Quick Introduction to Boosting Algorithms in Machine Learning
Getting smart with Machine Learning – AdaBoost and Gradient Boost

GBM 参数

GBM的所有参数可以划分成以下3种类型:
1. Tree-Specific Parameters:这类参数影响模型中的每一颗树;
2. Boosting Parameters:这类参数影响模型boosting的操作;
3. Miscellaneous Parameters:其他影响整体功能的参数

  1. overall functioning
    这里写图片描述

用于描述树的参数如下:

  • min_samples_split
    • 定义:用于定义一个节点可分裂的最少的样本数量;
    • 作用:控制过拟合,值越小越容易过拟合,值太大会容易欠拟合
    • 调参方式:CV
  • min_samples_leaf
    • 定义:叶子节点最少的样本数量
    • 作用:控制过拟合,
    • 调参方式: 不平衡样本需要设置较小的值,因为少数样本为一类的叶子样本量会偏小
  • min_weight_fraction_leaf
    • 定义:与min_samples_leaf类似,但是是一个关于整体样本量的一个分数而不是整数
    • Only one of #2 and #3 should be defined.
  • max_depth
    • 定义:树的深度
    • 作用:控制过拟合
    • 调参方式: CV
  • max_leaf_nodes
    • 定义:最终的数的叶子节点的最多数量
    • 与max_depth能相互替代,如果被定义了,max_depth将被忽视
  • max_features
    • 定义:当寻找最优分裂点时,考虑的随机选择的特征的数目
    • 经验原则:特征数目的平方根很好用,但是这个数目应该有总特征数目的30%-40%以上
    • 调参:高max_features会产生过拟合问题,但取决于具体的案例
      以下是GBM2分类算法的伪算法:
1. Initialize the outcome
2. Iterate from 1 to total number of trees
  2.1 Update the weights for targets based on previous run (higher for the ones mis-classified)
  2.2 Fit the model on selected subsample of data
  2.3 Make predictions on the full set of observations
  2.4 Update the output with current results taking into account the learning rate
3. Return the final output.

2.Boosting Parameters
Boosting Parameters 主要影响以上伪代码的2.2建模部分,各参数如下:
+ learning_rate:

  • learning_rate:
    • c此参数影响每棵树最终的输出结果(step 2.4), GBM通过设置一个初始的参数估计量并通过树的输出结果进行更新,本参数控制的是估计量变化的幅度
    • 较小的值通常更受偏好,因为其使得模型对一些特定的特征的更具有鲁棒性
    • 较小的值需要更多数量的树去训练所有的关系,将产生高昂的计算消耗
  • n_estimators
    • 建模的树的数量
    • 虽然GBM对于大额n_estimators值具有较强的鲁棒性但是在某些点的时候依然会产生过拟合问题,因此需要通过CV在特定的learning_rate下进行调参
  • subsample
    • 每棵树的样本数量,随机选择
    • 值小于1能通过降低模型的方差增强模型的鲁棒性;
    • 常用的值范围[0,0.8],也可以调高点

3.Miscellaneous Parameters

  • loss
    • 定义:只每次进行节点分裂时的loss function
    • 可以有多个选择,通常情况下,默认参数工作较好,其他的参数也可以被使用,前提是你要了解他们对模型的影响
  • init
    • 这个参数影响模型的初步输出
    • 如果有其他模型的输出结果可以使用其他模型的输出结果作为GBM初始值
  • random_state
    • 这个是随机种子,固定随机种子后,模型里面的随机化过程将会被重复
    • 这个参数对于模型调优非常重要,如果不固定,将很难进行模型调优,无法对比模型结果的好坏
    • 本参数有可能导致过拟合问题,可以为模型设置不同的随机参数,但通常不会这么做
  • verbose
    • 当模型拟合选择输出的模型的类型,不同的值具有以下的含义:
      • 0: no output generated (default)
      • 1: output generated for trees in certain intervals
      • >1: output generated for all trees
  • warm_start
    • 如果使用得当,这个参数将会有很大的帮助
    • 通过这个参数,我们可以将新树添加到旧有的模型上。可帮助节省大量的时间。(嗯,这个参数可以好好研究研究)
  • presort
    • 用于选择是否需要对数据进行预分类从而加快分裂的速度
    • 会通过默认值使得选择自动化
      作者提供了他的giuhub相关链接:
      GitHub repository

参数调整实例

作者使用了 Data Hackathon 3.x AV hackathon的比赛实例,比赛的题目[ competition page](competition page),可以在这里下载数据,作者的数据预处理过程如下:

1.City variable dropped because of too many categories
2.DOB converted to Age | DOB dropped
3.EMI_Loan_Submitted_Missing created which is 1 if EMI_Loan_Submitted was missing else 0 | Original variable EMI_Loan_Submitted dropped
4.EmployerName dropped because of too many categories
5.Existing_EMI imputed with 0 (median) since only 111 values were missing
6.Interest_Rate_Missing created which is 1 if Interest_Rate was missing else 0 | Original variable Interest_Rate dropped
7.Lead_Creation_Date dropped because made little intuitive impact on outcome
8.Loan_Amount_Applied, Loan_Tenure_Applied imputed with median values
9.Loan_Amount_Submitted_Missing created which is 1 if Loan_Amount_Submitted was missing else 0 | Original variable Loan_Amount_Submitted dropped
10.Loan_Tenure_Submitted_Missing created which is 1 if Loan_Tenure_Submitted was missing else 0 | Original variable Loan_Tenure_Submitted dropped
11.LoggedIn, Salary_Account dropped
12.Processing_Fee_Missing created which is 1 if Processing_Fee was missing else 0 | Original variable Processing_Fee dropped
13.Source – top 2 kept as is and all others combined into different category
14.Numerical and One-Hot-Coding performed

通常情况下使用默认参数作为调参的基准

from sklearn.ensemble import GradientBoostingClassifier  #GBM algorithm

#Choose all predictors except target & IDcols
predictors = [x for x in train.columns if x not in [target, IDcol]]
gbm0 = GradientBoostingClassifier(random_state=10)
modelfit(gbm0, train, predictors)#作者自己编写的用于输出想要结果的函数

通常的参数调优的方法

通过使用默认参数,获得了一个baseline,调参的预期效果期望好于baseline,通常调参就是以上提及的两种参数类型,其中learning rate的策略是取小值(如果我们有足够数目的树训练)。

当树的数目增加的时候,GBM对过拟合是鲁棒的,但是一个大的学习率会导致过拟合问题,我们可以通过减小learning rate增加数的数目来加以改善,导致的结果是计算量大需要花很多的时间。

据上,我们可以采取以下的策略:
1. 选择一个相对大的learning rate,通常设置为0.1,有些时候[0.05,0.2]在有些时候也可以考虑
2. 根据选定的learning rate决定最优的树的数目。通常的范围为[40-70]。应该选一个能够让你的系统工作较快的范围
3. 调整tree-specific parameters :对于确定的学习率和树的个数,进行tree-specific parameters 的调整,作者给了一个例子,见下一个标题
4. 在以上的基础上降低学习率增加树的数量会获得更好鲁棒的模型

Fix learning rate and number of estimators for tuning tree-based parameters

为了获得最优的参数,我们先设定一些初始值,如下:
+ min_samples_split = 500:这个值得设定通常在样本量的0.5-1%之间,但如果是不平衡样本,值可以在设置的低一些
+ min_samples_leaf = 50 :可根据直觉设置,这个参数的目的是用于防止过拟合,但是遇到不平衡数据时,可以考虑设置较低一些的值
+ max_depth = 8 : 可以基于样本量和特征量设置在(5-8)左右
+ max_features = ‘sqrt’ :随意吧
+ subsample = 0.8 : 这个是通常初始化的值

以上均是初始化的值,默认learning_rate=0.1,据此可以grid search搜索[20,80]步长为10的最优的树的数目,下面将进行调参:

#Choose all predictors except target & IDcols
predictors = [x for x in train.columns if x not in [target, IDcol]]
param_test1 = {'n_estimators':range(20,81,10)}
gsearch1 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, min_samples_split=500,min_samples_leaf=50,max_depth=8,max_features='sqrt',subsample=0.8,random_state=10), 
param_grid = param_test1, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch1.fit(train[predictors],train[target])

调参的结果可以像下面这样查看:

gsearch1.grid_scores_, gsearch1.best_params_, gsearch1.best_score_

这里写图片描述

以上结果可以看出,最优的树的数目是60,但是如果我们获得的最优的树的数目过大或者过小怎么办?
1.如果结果值在20左右,需要适当降低学习率(如改成0.05),重新run网格搜索程序
2.如果结果值太大到了100左右,最快的方式是调大学习率

Tuning tree-specific parameters

调参的步骤:
1. max_depth and num_samples_split
2. min_samples_leaf
3. max_features
调参的顺序需要被谨慎的考虑,应该先调整对结果影响较大的参数。
作者的举例如下:

  • 首次按调max_depth ,范围[5-15],步长2;min_samples_split ,范围[200,1000],步长200
param_test2 = {'max_depth':range(5,16,2), 'min_samples_split':range(200,1001,200)}
gsearch2 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60, max_features='sqrt', subsample=0.8, random_state=10), 
param_grid = param_test2, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch2.fit(train[predictors],train[target])
gsearch2.grid_scores_, gsearch2.best_params_, gsearch2.best_score_

作者调优后的结果 max_depth=9,min_samples_split=1000,此时min_samples_split为设置的阈值上界,所有有必要进一步扩大上界进行二次调优(可选择,当max_depth=9,score差异不大时可以不调)。

  • 调整min_samples_leaf,范围[30,70],步长10,根据上一步,设置一个较大的min_samples_split,范围[1000,2100],步长200
param_test3 = {'min_samples_split':range(1000,2100,200), 'min_samples_leaf':range(30,71,10)}
gsearch3 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60,max_depth=9,max_features='sqrt', subsample=0.8, random_state=10), 
param_grid = param_test3, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch3.fit(train[predictors],train[target])
gsearch3.grid_scores_, gsearch3.best_params_, gsearch3.best_score_

调完参数后,可以看一下特征的重要性,并将现在的特征重要性与之前的baseline模型的特征重要性进行对比,可以发现,我们能从更多的特征中获取更多的信息

接下来,调整最后一个树参数,max_features,范围[7,19],步长为2

param_test4 = {'max_features':range(7,20,2)}
gsearch4 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60,max_depth=9, min_samples_split=1200, min_samples_leaf=60, subsample=0.8, random_state=10),
param_grid = param_test4, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch4.fit(train[predictors],train[target])
gsearch4.grid_scores_, gsearch4.best_params_, gsearch4.best_score_

以上步骤完成之后,就获得了所有调参的结果

为了进一步调整模型,下一步就是对模型的subsample 进行进一步调整,范围[0.6,0.9],步长0.05

param_test5 = {'subsample':[0.6,0.7,0.75,0.8,0.85,0.9]}
gsearch5 = GridSearchCV(estimator = GradientBoostingClassifier(learning_rate=0.1, n_estimators=60,max_depth=9,min_samples_split=1200, min_samples_leaf=60, subsample=0.8, random_state=10,max_features=7),
param_grid = param_test5, scoring='roc_auc',n_jobs=4,iid=False, cv=5)
gsearch5.fit(train[predictors],train[target])
gsearch5.grid_scores_, gsearch5.best_params_, gsearch5.best_score_

以上步骤完成之后,作者获得了最优的模型结果0.85,并获得了所有的最优的参数值。现在,需要降低学习率并增加树的数量。

随着树的数目的增加,通过CV进行计算的时间将会快速增长,作者将学习率设置成0.05,并将树的数目double了一下(然后不断的将学习率除以2,树的数目double)

predictors = [x for x in train.columns if x not in [target, IDcol]]
gbm_tuned_1 = GradientBoostingClassifier(learning_rate=0.05, n_estimators=120,max_depth=9, min_samples_split=1200,min_samples_leaf=60, subsample=0.85, random_state=10, max_features=7)
modelfit(gbm_tuned_1, train, predictors)

另外一个调参的黑马是warm_start。可以用来慢慢增加数的数目而不需要总是重新开始训练。作者未对这个参数做进一步的描述

进一步讨论GradientBoosting分类 gbdt xgboost 梯度提升分类 logitboost 阅读详情

相关推荐

Python中Gradient Boosting Machine(GBM)方法以及调参详解

1.前言 这篇博客转载于寒小阳博主,如给博主带来不便,请联系我以便删除。 2.目录 Boosing是怎么工作的? 理解GBM模型中的参数 学会调参(附详例) 3.Boosting是如何工作的? Boosting可以将一系列弱学习因子(weak learners)相结合来提升总体模型的预测准确度。在任意时间t,根据t-1时刻得到的结果我们给当前结果赋予一个权重。之前正确预测的结果获得较小...

不曾走远的博客 1848

机器学习系列(11)_Python中Gradient Boosting Machine(GBM)调参方法详解

这篇文章详细地介绍了GBM模型。我们首先了解了何为boosting,然后详细介绍了各种参数。 这些参数可以被分为3类:树参数,boosting参数,和其他影响模型的参数。最后我们提到了用GBM解决问题的 一般方法,并且用AV Data Hackathon 3.x problem数据运用了这些方法。

寒小阳 10万+

OpenResty无损升级内嵌nginx版本0DAY漏洞

OpenResty无损升级内嵌nginx版本,nginx

qq1071643762的博客 6905

scikit-learn 梯度提升树(GBDT)调参小结

    在梯度提升树(GBDT)原理小结中,我们对GBDT的原理做了总结,本文我们就从scikit-learn里GBDT的类库使用方法作一个总结,主要会关注调参中的一些要点。 1. scikit-learn GBDT类库概述     在sacikit-learn中,GradientBoostingClassifier为GBDT的分类类, 而GradientBoostingRegressor为GBD...

weixin_33811539的博客 2274

手把手教你用YOLOv11-seg-LSCD搞定树脂件瑕疵检测(附数据集与代码)

本文详细介绍了如何使用YOLOv11-seg-LSCD模型进行工业级树脂件瑕疵检测,包括环境配置、数据集构建、模型训练与调优、部署优化等全流程。通过LSCD模块的创新设计,有效提升了气泡、裂纹等微小缺陷的检测精度,适用于各类树脂制品的质量检测场景。

weixin_28677005的博客 418

VSCode终端打不开?3分钟搞定Windows下Terminal配置(附最新JSON设置方法)

本文针对Windows系统下VSCode终端无法启动的常见问题,提供了详细的诊断与解决方案。核心在于更新已弃用的旧配置,采用最新的JSON设置方法,通过定义`terminal.integrated.profiles.windows`和指定`terminal.integrated.defaultProfile.windows`,快速修复并优化终端配置,实现三分钟内恢复正常使用。

flower的专栏 744

Python下Gradient Boosting Machine(GBM)调参完整指导

Python下Gradient Boosting Machine(GBM)调参完整指导 简介:如果你现在仍然将GBM作为一个黑盒使用,或许你应该点开这篇文章,看看他是如何工作的。 Boosting 算法在平衡偏差和方差方面扮演了重要角色。和bagging算法仅仅只能处理模型高方差不同,boosting在处理这两个方面都十分有效。真正地理解GBM能够给你处理这些关键问题的信心。 在这篇文章中,...

waitingzby的博客 5885

虚拟机安装Centos8.5

Centos8.5

weixin_63604047的博客 960

Python实现GBDT(梯度提升树)分类模型(GradientBoostingClassifier算法)并应用网格搜索算法寻找最优参数项目实战

Python实现GBDT(梯度提升树)分类模型(GradientBoostingClassifier算法)并应用网格搜索算法寻找最优参数项目实战

张陈亚的博客 8119

摩尔线程嵌入式面试题及参考答案(2万字长文)

说一下你对 drm 框架的理解。 DRM(Direct Rendering Manager)是 Linux 系统中用于管理图形显示设备的一个重要框架。 从架构层面来讲,它处于内核空间,主要目的是为用户空间的图形应用程序提供一个统一的接口来访问图形硬件。DRM 包括内核态的驱动模块和用户态的库。内核态的驱动负责和硬件进行交互,比如对显存的管理、硬件寄存器的配置等。用户态的库则方便应用程序利用内核态提供的功能进行图形渲染等操作。 在图形显示的具体流程中,DRM 可以控制显示设备的分辨率、刷

大模型大数据攻城狮的专栏 1229

15、目标检测模型的评估指标与YOLO算法解析

本文详细解析了目标检测模型的评估指标,包括精确率、召回率、AP、mAP及IoU的定义与作用,并深入介绍了YOLO算法的核心原理与推理流程。从网格划分、锚框引入到边界框细化与后处理,全面阐述了YOLO如何实现快速准确的目标检测。同时总结了YOLO在智能安防、自动驾驶和工业检测等领域的应用,并展望了其未来在准确性提升、多类别支持和技术融合方面的发展趋势。

work3的博客 66

Python中Gradient Boosting Machine(GBM)调参方法详解

转载链接点击打开链接

u012063773的博客 850

ArcGIS Pro符号化教程

本文详细介绍了ArcGIS Pro的软件设置和符号化操作步骤。主要包括:1)设置默认工程目录和关闭地图自动加载;2)创建新工程的基本流程;3)点要素的单一符号化方法,包括样式修改和图层调整;4)图表符号显示过滤器的使用,涉及字段添加、图表类型选择和背景设置。文章还提供了操作截图和数据下载链接,适合GIS初学者学习ArcGIS Pro的基础符号化操作。

WwLK123的博客 551

sklearn 中Gradient Boosting Machine(GBM)调参方法

原文地址:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python by Aarshay Jain 原文翻译与校对:@酒酒Angie(drmr_anki@qq.com) && 寒小阳(hanxiaoyang.ml@gmail.com) 时间:2016年9月。 出处:http://blo...

码灵薯的博客 7143

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Gradient Boosting Machine(GBM)调参方法详解

<div class="markdown_views"><p>原文地址:<a href="https://www.analyticsvidhya.com/blog/2016/02/complete-guide-parameter-tuning-gradient-boosting-gbm-python/" target="_blank">Complete Guide to Parameter Tuni

一路前行 7926

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

机器学习--Gradient Boosting Machine(GBM)调参方法详解 转 面试问到的

https://www.cnblogs.com/zongfa/p/9502830.html

studyvcmfc的专栏 394

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

python调参工作都是干啥的_Python中Gradient Boosting Machine(GBM)调参方法详解

1.前言如果一直以来你只把GBM当作黑匣子,只知调用却不明就里,是时候来打开这个黑匣子一探究竟了!这篇文章是受Owen Zhang (DataRobot的首席产品官,在Kaggle比赛中位列第三)在NYC Data Science Academy里提到的方法启发而成。他当时的演讲大约有2小时,我在这里取其精华,总结一下主要内容。不像bagging算法只能改善模型高方差(high variance)...

weixin_39680678的博客 248

机器学习--Gradient Boosting Machine(GBM)调参方法详解

一、GBM参数 总的来说GBM的参数可以被归为三类: 树参数:调节模型中每个决策树的性质 Boosting参数:调节模型中boosting的操作 其他模型参数:调节模型总体的各项运作 1、树参数 现在我们看一看定义一个决策树所需要的参数。注意我在这里用的都是python里scikit-learn里面的术语,和其他软件比如R里用到的可能不同,但原理都是相同的。 min_ s...

weixin_34293059的博客 678

集成算法系列之GBM

http://baijiahao.baidu.com/s?id=1570175598042474&wfr=spider&for=pc 一、GBM简介 GBM全称为Gradient Boosting Machine,是Boosting算法的一种。Boosting算法详见《集成算法系列之初识》。GBM主要思想是基于之前建立的基学习器的损失函数的梯度下降方向来建立下一个新的基学习器,目的就是希望

zhaoyuxia517的博客 5021
上一篇: XGBoost算法原理简介及调参
下一篇: Python 常用库及其作用
RuDing
博客等级 码龄9年 19粉丝 7原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值