机器学习--Gradient Boosting Machine(GBM)调参方法详解
一、GBM参数
总的来说GBM的参数可以被归为三类:
- 树参数:调节模型中每个决策树的性质
- Boosting参数:调节模型中boosting的操作
- 其他模型参数:调节模型总体的各项运作
1、树参数
现在我们看一看定义一个决策树所需要的参数。注意我在这里用的都是python里scikit-learn里面的术语,和其他软件比如R里用到的可能不同,但原理都是相同的。
- min_ samples_split
- 定义了树中一个节点所需要用来分裂的最少样本数。
- 可以避免过度拟合(over-fitting)。如果用于分类的样本数太小,模型可能只适用于用来训练的样本的分类,而用较多的样本数则可以避免这个问题。
- 但是如果设定的值过大,就可能出现欠拟合现象(under-fitting)。因此我们可以用CV值(离散系数)考量调节效果。
- min_ samples_leaf
- 定义了树中终点节点所需要的最少的样本数。
- 同样,它也可以用来防止过度拟合。
- 在不均等分类问题中(imbalanced class problems),一般这个参数需要被设定为较小的值,因为大部分少数类别(minority class)含有的样本都比较小。
- min_ weight_ fraction_leaf
- 和上面min_ samples_ leaf很像,不同的是这里需要的是一个比例而不是绝对数值:终点节点所需的样本数占总样本数的比值。
- #2和#3只需要定义一个就行了
- max_ depth
- 定义了树的最大深度。
- 它也可以控制过度拟合,因为分类树越深就越可能过度拟合。
- 当然也应该用CV值检验。
- max_ leaf_ nodes
- 定义了决策树里最多能有多少个终点节点。
- 这个属性有可能在上面max_ depth里就被定义了。比如深度为n的二叉树就有最多2^n个终点节点。
- 如果我们定义了max_ leaf_ nodes,GBM就会忽略前面的max_depth。
- max_ features
- 决定了用于分类的特征数,是人为随机定义的。
- 根据经验一般选择总特征数的平方根就可以工作得很好了,但还是应该用不同的值尝试,最多可以尝试总特征数的30%-40%.
- 过多的分类特征可能也会导致过度拟合。
在继续介绍其他参数前,我们先看一个简单的GBM二分类伪代码:
. 初始分类目标的参数值
. 对所有的分类树进行迭代:
2.1 根据前一轮分类树的结果更新分类目标的权重值(被错误分类的有更高的权重)
2.2 用训练的子样本建模
2.3 用所得模型对所有的样本进行预测
2.4 再次根据分类结果更新权重值
. 返回最终结果
以上步骤是一个极度简化的BGM模型,而目前我们所提到的参数会影响2.2这一步,即建模的过程。
2、boosting参数
现在我们来看看影响boosting过程的参数:
- learning_ rate
- 这个参数决定着每一个决策树对于最终结果(步骤2.4)的影响。GBM设定了初始的权重值之后,每一次树分类都会更新这个值,而learning_ rate控制着每次更新的幅度。
- 一般来说这个值不应该设的比较大,因为较小的learning rate使得模型对不同的树更加稳健,就能更好地综合它们的结果。
- n_ estimators
- 定义了需要使用到的决策树的数量(步骤2)
- 虽然GBM即使在有较多决策树时仍然能保持稳健,但还是可能发生过度拟合。所以也需要针对learning rate用CV值检验。
subsample
- 训练每个决策树所用到的子样本占总样本的比例,而对于子样本的选择是随机的。
- 用稍小于1的值能够使模型更稳健,因为这样减少了方差。
- 一把来说用~0.8就行了,更好的结果可以用调参获得。
3、其他参数
好了,现在我们已经介绍了树参数和boosting参数,此外还有第三类参数,它们能影响到模型的总体功能:
loss
- 指的是每一次节点分裂所要最小化的损失函数(loss function)
- 对于分类和回归模型可以有不同的值。一般来说不用更改,用默认值就可以了,除非你对它及它对模型的影响很清楚。
- init
- 它影响了输出参数的起始化过程
- 如果我们有一个模型,它的输出结果会用来作为GBM模型的起始估计,这个时候就可以用init
- random_ state
- 作为每次产生随机数的随机种子
- 使用随机种子对于调参过程是很重要的,因为如果我们每次都用不同的随机种子,即使参数值没变每次出来的结果也会不同,这样不利于比较不同模型的结果。
- 任一个随即样本都有可能导致过度拟合,可以用不同的随机样本建模来减少过度拟合的可能,但这样计算上也会昂贵很多,因而我们很少这样用
- verbose
- 决定建模完成后对输出的打印方式:
- 0:不输出任何结果(默认)
- 1:打印特定区域的树的输出结果
- >1:打印所有结果
- 决定建模完成后对输出的打印方式:
- warm_ start
- 这个参数的效果很有趣,有效地使用它可以省很多事
- 使用它我们就可以用一个建好的模型来训练额外的决策树,能节省大量的时间,对于高阶应用我们应该多多探索这个选项。
- presort
- 决定是否对数据进行预排序,可以使得树分裂地更快。
- 默认情况下是自动选择的,当然你可以对其更改
机器学习--Gradient Boosting Machine(GBM)调参方法详解的更多相关文章
- Python中Gradient Boosting Machine(GBM)调参方法详解
原文地址:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python by Aarshay Jain 原文翻译与校对 ...
- 论文笔记:GREEDY FUNCTION APPROXIMATION: A GRADIENT BOOSTING MACHINE
Boost是集成学习方法中的代表思想之一,核心的思想是不断的迭代.boost通常采用改变训练数据的概率分布,针对不同的训练数据分布调用弱学习算法学习一组弱分类器.在多次迭代的过程中,当前次迭代所用的训 ...
- LightGBM 调参方法(具体操作)
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...
- Tree - Gradient Boosting Machine with sklearn source code
This is the second post in Boosting algorithm. In the previous post, we go through the earliest Boos ...
- Java方法详解
Java方法详解 什么是方法? Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 示例: packag ...
- [荐]Js apply()和call()方法详解 - http://www.w3cfuns.com/article-5596443-1-1.html
本帖最后由 默默DE人生 于 2013-3-19 13:22 编辑 Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文 ...
- Js apply 方法 详解
Js apply方法详解 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...
- Java提高篇——equals()与hashCode()方法详解
java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...
- Java中的main()方法详解
在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...
随机推荐
- (二分匹配 模板)过山车 -- hdu --2063
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2063 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 使用WinSCP在Windows和Linux系统之间传输文件
小梅哥编写,未经许可,严禁用于任何商业用途 2018年6月30日 在日常SoC开发中,我们经常需要在Windows和Linux系统之间传输文件,例如在Windows系统上的DS-5集成开发环境中编写好 ...
- bootstrap 问题
less; sass: css预处理:可以直接使用.css,也可以修改.less,生成定制化的css CDN: 服务,使用这个效果会更好.theme一般不引入,jquery一般在js之前引入. 使用b ...
- [Openwrt 项目开发笔记]:Openwrt平台搭建(一)补遗
[Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 昨晚上熬夜写了[Openwrt项目开发笔记]:O ...
- JavaScript正则表达式匹配中英文以及常用标点符号白名单写法
我们在编程中经常会遇到特殊字符过滤的问题,今天我们提供一种白名单方式过滤 直接上代码 function RegEXP(s) { var rs = ""; for (var i = ...
- VS2017按F1使用中文帮助
VS2017使用时,按F1出来在线英文帮助,可以稍作改动,出来中文帮助. 1.进入安装文件,选择单个组件,勾选Help Viewer. 2.安装完成后,在IDE中选择在线查看器中启动.
- 在Asp.Net MVC中实现上传图片并显示
实现思路大概分为两步: 1. 通过上传接口,将图片上传到服务器,返回文件路径给客户端: 2. 点击保存上传,将文件路径保存到数据库,如果是多张图片,路径用逗号分隔. 核心上传代码: /// <s ...
- 第六章 ReentrantLock源码解析2--释放锁unlock()
最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final Reentrant ...
- dpdk EAL: Error reading from file descriptor 23: Input/output error
执行test程序时输出: EAL: Error reading from file descriptor 23: Input/output error 原因: 在虚拟机添加的网卡,dpdk不支持导致的 ...
- Greedy- 621. Task Scheduler
Given a char array representing tasks CPU need to do. It contains capital letters A to Z where diffe ...