一、GBM参数

总的来说GBM的参数可以被归为三类:

  1. 树参数:调节模型中每个决策树的性质
  2. Boosting参数:调节模型中boosting的操作
  3. 其他模型参数:调节模型总体的各项运作

1、树参数

现在我们看一看定义一个决策树所需要的参数。注意我在这里用的都是python里scikit-learn里面的术语,和其他软件比如R里用到的可能不同,但原理都是相同的。

  1. min_ samples_split 
    1. 定义了树中一个节点所需要用来分裂的最少样本数。
    2. 可以避免过度拟合(over-fitting)。如果用于分类的样本数太小,模型可能只适用于用来训练的样本的分类,而用较多的样本数则可以避免这个问题。
    3. 但是如果设定的值过大,就可能出现欠拟合现象(under-fitting)。因此我们可以用CV值(离散系数)考量调节效果。
  2. min_ samples_leaf 
    1. 定义了树中终点节点所需要的最少的样本数。
    2. 同样,它也可以用来防止过度拟合。
    3. 在不均等分类问题中(imbalanced class problems),一般这个参数需要被设定为较小的值,因为大部分少数类别(minority class)含有的样本都比较小。
  3. min_ weight_ fraction_leaf 
    1. 和上面min_ samples_ leaf很像,不同的是这里需要的是一个比例而不是绝对数值:终点节点所需的样本数占总样本数的比值。
    2. #2和#3只需要定义一个就行了
  4. max_ depth 
    1. 定义了树的最大深度。
    2. 它也可以控制过度拟合,因为分类树越深就越可能过度拟合。
    3. 当然也应该用CV值检验。
  5. max_ leaf_ nodes 
    1. 定义了决策树里最多能有多少个终点节点。
    2. 这个属性有可能在上面max_ depth里就被定义了。比如深度为n的二叉树就有最多2^n个终点节点。
    3. 如果我们定义了max_ leaf_ nodes,GBM就会忽略前面的max_depth。
  6. max_ features 
    1. 决定了用于分类的特征数,是人为随机定义的。
    2. 根据经验一般选择总特征数的平方根就可以工作得很好了,但还是应该用不同的值尝试,最多可以尝试总特征数的30%-40%.
    3. 过多的分类特征可能也会导致过度拟合。

在继续介绍其他参数前,我们先看一个简单的GBM二分类伪代码:

. 初始分类目标的参数值
. 对所有的分类树进行迭代:
2.1 根据前一轮分类树的结果更新分类目标的权重值(被错误分类的有更高的权重)
2.2 用训练的子样本建模
2.3 用所得模型对所有的样本进行预测
2.4 再次根据分类结果更新权重值
. 返回最终结果

以上步骤是一个极度简化的BGM模型,而目前我们所提到的参数会影响2.2这一步,即建模的过程。

2、boosting参数

  现在我们来看看影响boosting过程的参数:

    1. learning_ rate 

      • 这个参数决定着每一个决策树对于最终结果(步骤2.4)的影响。GBM设定了初始的权重值之后,每一次树分类都会更新这个值,而learning_ rate控制着每次更新的幅度。
      • 一般来说这个值不应该设的比较大,因为较小的learning rate使得模型对不同的树更加稳健,就能更好地综合它们的结果。
    2. n_ estimators 
      • 定义了需要使用到的决策树的数量(步骤2)
      • 虽然GBM即使在有较多决策树时仍然能保持稳健,但还是可能发生过度拟合。所以也需要针对learning rate用CV值检验。
    3. subsample

      • 训练每个决策树所用到的子样本占总样本的比例,而对于子样本的选择是随机的。
      • 用稍小于1的值能够使模型更稳健,因为这样减少了方差。
      • 一把来说用~0.8就行了,更好的结果可以用调参获得。

3、其他参数

  好了,现在我们已经介绍了树参数和boosting参数,此外还有第三类参数,它们能影响到模型的总体功能:

    1. loss

      • 指的是每一次节点分裂所要最小化的损失函数(loss function)
      • 对于分类和回归模型可以有不同的值。一般来说不用更改,用默认值就可以了,除非你对它及它对模型的影响很清楚。
    2. init 
      • 它影响了输出参数的起始化过程
      • 如果我们有一个模型,它的输出结果会用来作为GBM模型的起始估计,这个时候就可以用init
    3. random_ state 
      • 作为每次产生随机数的随机种子
      • 使用随机种子对于调参过程是很重要的,因为如果我们每次都用不同的随机种子,即使参数值没变每次出来的结果也会不同,这样不利于比较不同模型的结果。
      • 任一个随即样本都有可能导致过度拟合,可以用不同的随机样本建模来减少过度拟合的可能,但这样计算上也会昂贵很多,因而我们很少这样用
    4. verbose 
      • 决定建模完成后对输出的打印方式:

        • 0:不输出任何结果(默认)
        • 1:打印特定区域的树的输出结果
        • >1:打印所有结果
    5. warm_ start 
      • 这个参数的效果很有趣,有效地使用它可以省很多事
      • 使用它我们就可以用一个建好的模型来训练额外的决策树,能节省大量的时间,对于高阶应用我们应该多多探索这个选项。
    6. presort 
      • 决定是否对数据进行预排序,可以使得树分裂地更快。
      • 默认情况下是自动选择的,当然你可以对其更改

机器学习--Gradient Boosting Machine(GBM)调参方法详解的更多相关文章

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

    原文地址:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python by Aarshay Jain 原文翻译与校对 ...

  2. 论文笔记:GREEDY FUNCTION APPROXIMATION: A GRADIENT BOOSTING MACHINE

    Boost是集成学习方法中的代表思想之一,核心的思想是不断的迭代.boost通常采用改变训练数据的概率分布,针对不同的训练数据分布调用弱学习算法学习一组弱分类器.在多次迭代的过程中,当前次迭代所用的训 ...

  3. LightGBM 调参方法(具体操作)

     sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  4. 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 ...

  5. Java方法详解

    Java方法详解 什么是方法? Java方法是语句的集合,它们在一起执行一个功能. 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建,在其他地方被引用 示例: packag ...

  6. [荐]Js apply()和call()方法详解 - http://www.w3cfuns.com/article-5596443-1-1.html

    本帖最后由 默默DE人生 于 2013-3-19 13:22 编辑 Js apply方法详解我在一开始看到javascript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文 ...

  7. Js apply 方法 详解

    Js apply方法详解 我在一开始看到JavaScript的函数apply和call时,非常的模糊,看也看不懂,最近在网上看到一些文章对apply方法和call的一些示例,总算是看的有点眉目了,在这 ...

  8. Java提高篇——equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

  9. Java中的main()方法详解

    在Java中,main()方法是Java应用程序的入口方法,也就是说,程序在运行的时候,第一个执行的方法就是main()方法,这个方法和其他的方法有很大的不同,比如方法的名字必须是main,方法必须是 ...

随机推荐

  1. springmvc 开涛 生产者/消费者

    媒体类型: text/html, text/plain, text/xml image/gif, image/jpg, image/png application/x-www-form-urlenco ...

  2. hdu 3664 Permutation Counting(水DP)

    Permutation Counting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  3. Android 体系架构

    什么是Android? 答:Android就是移动设备的软件栈,包括(一个完整的操作系统,中间件,关键应用程序), 底层是Linux内核,包括(安全管理, 内存管理,进程管理 ,电源管理,硬件驱动-) ...

  4. 如何充分利用 Windows Phone 高清屏幕

    Nokia 最近发布两款6寸大屏手机:Lumia 1520 和 Lumia 1320.为了支持这种设备 WP 升级了操作系统GDR3 支持了 1080P 的高清分辨率(1520),虽然GER3 是提供 ...

  5. 在Windows 7上安装Team Foundation Server(TFS)的代理服务器(Agent)

    自2009年微软发布Windows 7以来,经过8年的市场验证,Windows 7已经成为史上应用最为广泛的操作系统.但是面对技术变化的日新月异,2015年微软正式停止了对Windows 7的主流支持 ...

  6. [Xamarin]我的Xamarin填坑之旅(一)

    一想到明天是星期五,不对,是今天,心里就很激动,毕竟明天没课.激动之余,来写一篇博客,记录一下最近踏坑Xamarin开发校园助手APP的一些事儿.也许更像是一篇流水账. 在扯Xamarin之前,有必要 ...

  7. WinForm中的图表控件Chart

    第一次接触Chart控件,发现了这个Chart控件的实例项目,非常强大,用示例的方法介绍了该控件各式各样的用法. 下载链接

  8. python 使用 response.read() 接收 json 数据

    import json result = response.read() result.decode('utf-8') jsonData = json.loads(result)

  9. python scapy 网卡发包

    from scapy.all import * pkt = Ether(src='11:22:33:44:55:77', dst='11:22:33:44:55:66')/ARP(op="w ...

  10. java入门——面向对象

    简介 对象具有自己的状态和行为: 描述一个对象具有什么状态和行为的过程叫做建模,不同的意图下我们对同一个事物的描述会产生不同的模型. 类 类描述一类对象的状态和行为的模板.可以把类想象成一个汽车设计图 ...