提升树算法 详解

提升树是以决策树为基分类器的提升方法,通常使用CART树。针对不同问题的提升树学习算法,主要区别在于使用的损失函数不同。

1)分类问题:指数损失函数。可以使用CART分类树作为AdaBoost的基分类器,此时为分类提升树。

2)回归问题:平方误差损失函数。

3)决策问题:一般损失函数。

1、提升树算法

提升树采用线性模型+前向分步算法+CART树(基函数)。提升树的加法模型可表示为:

(此时树前面并没有权重!!下面有分析)

1)基函数是分类树(二叉分类树)

对于基函数是分类树时,我们使用指数损失函数,此时正是AdaBoost算法的特殊情况,即将AdaBoost算法中的基分类器使用分类树即可。

2)基函数是回归树

若基函数是回归树,则使用平方误差损失函数。

我们将回归树的输入空间划分为R1,R2,…,RJ个区域,每个区域的输出分别为:Cj,则回归树可以表示为:

前向分步算法第m步的得到的模型为:

平方误差损失函数为:

设:,rm即为当前模型拟合数据的残差。对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。

因为需要用到上一步的分类器,故而在每轮都需要计算残差,然后遍历可能的切分点,找出平方损失函数最小的切分点将输入划分为两个子集,然后依次类推,直到不能继续划分。

算法过程:

训练集为:T={(x1,y1),(x2,y2),…,(xn,yn)}。

1)初始化:f0(x)=0

2)下面共进行M轮的迭代,对于第m轮的迭代过程如下:(m=1,2,…,M)

  A)遍历每个特征的每个可能取值,计算残差:

  

  B)对于特征的每个可能取值,选择平方损失函数最小的切分点,得到树

  C)更新

3)最终得到回归问题提升树:

在上面的算法中,并没有在每个基分类器前面加上权值,此算法通过每次减小残差的方式来减小每轮所产生的模型的损失函数,通过这种方式,逐步减小残差值来使得损失函数减小,这样的话最初的模型的损失函数应该最大,那么在最终的线性组合中应该减小它的权重,但是上述算法并没有这样做,而是将每轮产生的模型通过均值或投票的方式来产生最终的结果。(有点疑惑!!!)

3、损失函数最小化方法

对于最开始提到的三种损失函数,其最小化方法各有不同。当损失函数为下面几种函数时,最小化损失函数的方法如下:

1)指数函数

当损失函数为指数函数时,比如AdaBoost算法的损失函数是指数函数,这时通过前向分步算法来解决。

前向分布算法在每轮迭代时,通过将上一轮所生成的模型所产生的损失函数最小化的方法来计算当前模型的参数。

2)平方误差损失函数

在回归树提升算法中,遍历当前输入样例的可能取值,将每种可能值计算一遍损失函数,最终选择损失函数最小的值。(很原始)

在计算平方损失误差时,可能出现残差项(y-fm-1(x)),此时可以通过如下方法来进行优化:每一轮迭代是为了减小上一步模型的残差,为了减少残差,每次在残差的负梯度方向建立一个新的模型,这样一步一步的使得残差越来越小。

3)一般损失函数

对于一般损失函数,可以通过梯度下降的方法来使得损失函数逐步减小,每次向损失函数的负梯度方向移动,直到损失函数值到达谷底。

参考文献:

[1] 李航,统计学习方法。

[2] 林轩田,机器学习技法(coursera)。

[3] leftnoteasy, http://www.cnblogs.com/LeftNotEasy/archive/2011/03/07/1976562.html

[4] w28971023, http://blog.csdn.net/w28971023/article/details/43704775

时间: 2024-12-30 04:33:55

提升树算法 详解的相关文章

二叉搜索树算法详解与Java实现

二叉查找树可以递归地定义如下,二叉查找树或者是空二叉树,或者是满足下列性质的二叉树: (1)若它的左子树不为空,则其左子树上任意结点的关键字的值都小于根结点关键字的值. (2)若它的右子树不为空,则其右子树上任意结点的关键字的值都大于根节点关键字的值. (3)它的左.右子树本身又是一个二叉查找树. 从性能上来说如果二叉查找树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么二叉查找树的搜索性能逼近二分查找:但它比连续内存空间的二分查找的优点是,改变二叉查找树结构(插入与删除结点)不需

转载:DenseNet算法详解

原文连接:http://blog.csdn.net/u014380165/article/details/75142664 参考连接:http://blog.csdn.net/u012938704/article/details/53468483 本文这里仅当学习笔记使用,具体细节建议前往原文细度. 论文:Densely Connected Convolutional Networks 论文链接:https://arxiv.org/pdf/1608.06993.pdf 代码的github链接:h

大型网站架构系列:负载均衡详解

面对大量用户访问.高并发请求,海量数据,可以使用高性能的服务器.大型数据库,存储设备,高性能Web服务器,采用高效率的编程语言比如(Go,Scala)等,当单机容量达到极限时,我们需要考虑业务拆分和分布式部署,来解决大型网站访问量大,并发量高,海量数据的问题.从单机网站到分布式网站,很重要的区别是业务拆分和分布式部署,将应用拆分后,部署到不同的机器上,实现大规模分布式系统.分布式和业务拆分解决了,从集中到分布的问题,但是每个部署的独立业务还存在单点的问题和访问统一入口问题,为解决单点故障,我们可

DNS服务相关概念详解

实验环境:RHEL 32Bit DNS服务相关概念详解 DNS是一种域名解析服务,DNS服务的核心以及DNS服务的标准都是基于一个软件来实现的,这个软件叫做BIND(Berkeley Internet Name Domain),互联网上几乎所有的DNS服务都是由BIND来构建的,虽然也有其它的DNS服务构建标准,但是它们的使用语法以及工作机制都和BIND非常接近. ·Linux服务器和Windows服务器的比较 Linux服务器在没有SELinux的时候它的安全级别和Windows服务器的安全级

23、磁盘管理—磁盘阵列(RAID)实例详解

磁盘阵列(RAID)实例详解 raid技术分类 软raid技术 硬raid技术 Raid和lvm的区别 为什么选择用raid RAID详解 RAID-0 RAID-1 RAID-5 Raid-10 Raid的管理 案例:创建一个raid10+冗余盘 磁盘阵列(RAID)实例详解 Raid(磁盘阵列)级别介绍 Raid有"廉价磁盘冗余阵列"的意思,就是利用多块廉价的硬盘组成磁盘组,让数据分部储存在这些硬盘里面,从而达到读取和写入加速的目的:也可以用作数据的冗余,当某块硬盘损毁后,其他硬盘

Java--设计模式详解(23种)

一.设计模式的理解 刚开始“不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开一把锁的模式,目的仅仅是着眼于解决现在的问题,而设计模式的“复杂”就在于它是要构造一个“万能钥匙”,目的是提出一种对所有锁的开锁方案.在真正理解设计模式之前我一直在编写“简单”的代码.这个“简单”不是功能的简单,而是设计的简单.简单的设计意味着缺少灵活性,代码很钢硬,只在这个项目里有用,拿到其它的项目中就是垃圾,我

varnish安装及配置详解

varnish系统架构: varnish主要运行两个进程:Management进程和Child进程(也叫Cache进程). Management进程主要实现应用新的配置.编译VCL.监控varnish.初始化varnish以及提供一个命令行接口等.Management进程会每隔几秒钟探测一下Child进程以判断其是否正常运行,如果在指定的时长内未得到Child进程的回应,Management将会重启此Child进程. Child进程包含多种类型的线程,常见的如:Acceptor线程:接收新的连接

Nmap扫描教程之基础扫描详解

Nmap扫描教程之基础扫描详解 Nmap扫描基础扫描 当用户对Nmap工具了解后,即可使用该工具实施扫描.通过上一章的介绍,用户可知Nmap工具可以分别对主机.端口.版本.操作系统等实施扫描.但是,在实施这些扫描工作之前,需要先简单了解下Nmap工具的使用,以方便后面实施扫描.所以,本章将通过使用Nmap工具实施基础的扫描,来帮助用户了解该工具. Nmap扫描扫描概述 在实施基本的扫描之前,需要先了解一些Nmap网络扫描的基本知识,及需要考虑的一些法律边界问题.本节将对网络基本扫描进行一个简单介

给 Android 开发者的 RxJava 详解

作者:扔物线 前言 我从去年开始使用 RxJava ,到现在一年多了.今年加入了 Flipboard 后,看到 Flipboard 的 Android 项目也在使用 RxJava ,并且使用的场景越来越多 .而最近这几个月,我也发现国内越来越多的人开始提及 RxJava .有人说『RxJava 真是太好用了』,有人说『RxJava 真是太难用了』,另外更多的人表示:我真的百度了也谷歌了,但我还是想问: RxJava 到底是什么? 鉴于 RxJava 目前这种既火爆又神秘的现状,而我又在一年的使用