决策树php,决策树模型组合之随机森林与GBDT

前言:

决策树这种算法有着很多良好的特性,比如说训练时间复杂度较低,预测的过程比较快速,模型容易展示(容易将得到的决策树做成图片展示出来)等。但是同时,单决策树又有一些不好的地方,比如说容易over-fitting,虽然有一些方法,如剪枝可以减少这种情况,但是还是不够的。

模型组合(比如说有Boosting,Bagging等)与决策树相关的算法比较多,这些算法最终的结果是生成N(可能会有几百棵以上)棵树,这样可以大大的减少单决策树带来的毛病,有点类似于三个臭皮匠等于一个诸葛亮的做法,虽然这几百棵决策树中的每一棵都很简单(相对于C4.5这种单决策树来说),但是他们组合起来确是很强大。

在最近几年的paper上,如iccv这种重量级的会议,iccv 09年的里面有不少的文章都是与Boosting与随机森林相关的。模型组合+决策树相关的算法有两种比较基本的形式 - 随机森林与GBDT((Gradient Boost Decision Tree),其他的比较新的模型组合+决策树的算法都是来自这两种算法的延伸。本文主要侧重于GBDT,对于随机森林只是大概提提,因为它相对比较简单。

在看本文之前,建议先看看机器学习与数学(3)与其中引用的论文,本文中的GBDT主要基于此,而随机森林相对比较独立。

基础内容:

这里只是准备简单谈谈基础的内容,主要参考一下别人的文章,对于随机森林与GBDT,有两个地方比较重要,首先是information gain,其次是决策树。这里特别推荐Andrew Moore大牛的Decision Trees Tutorial,与Information Gain Tutorial。Moore的Data Mining Tutorial系列非常赞,看懂了上面说的两个内容之后的文章才能继续读下去。

决策树实际上是将空间用超平面进行划分的一种方法,每次分割的时候,都将当前的空间一分为二,比如说下面的决策树:

2778cbd4fc9e74c6e1bd9bee7aa8c5fa.png

就是将空间划分成下面的样子:

9123fed4828959c8ddafeeefcd357159.png

这样使得每一个叶子节点都是在空间中的一个不相交的区域,在进行决策的时候,会根据输入样本每一维feature的值,一步一步往下,最后使得样本落入N个区域中的一个(假设有N个叶子节点)

随机森林(Random Forest):

随机森林是一个最近比较火的算法,它有很多的优点:在数据集上表现良好

在当前的很多数据集上,相对其他算法有着很大的优势

它能够处理很高维度(feature很多)的数据,并且不用做特征选择

在训练完后,它能够给出哪些feature比较重要

在创建随机森林的时候,对generlization error使用的是无偏估计

训练速度快

在训练过程中,能够检测到feature间的互相影响

容易做成并行化方法

实现比较简单

随机森林顾名思义,是用随机的方式建立一个森林,森林里面有很多的决策树组成,随机森林的每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就让森林中的每一棵决策树分别进行一下判断,看看这个样本应该属于哪一类(对于分类算法),然后看看哪一类被选择最多,就预测这个样本为那一类。

在建立每一棵决策树的过程中,有两点需要注意 - 采样与完全分裂。首先是两个随机采样的过程,random forest对输入的数据要进行行、列的采样。对于行采样,采用有放回的方式,也就是在采样得到的样本集合中,可能有重复的样本。假设输入样本为N个,那么采样的样本也为N个。这样使得在训练的时候,每一棵树的输入样本都不是全部的样本,使得相对不容易出现over-fitting。然后进行列采样,从M个feature中,选择m个(m << M)。之后就是对采样之后的数据使用完全分裂的方式建立出决策树,这样决策树的某一个叶子节点要么是无法继续分裂的,要么里面的所有样本的都是指向的同一个分类。一般很多的决策树算法都一个重要的步骤 - 剪枝,但是这里不这样干,由于之前的两个随机采样的过程保证了随机性,所以就算不剪枝,也不会出现over-fitting。

按这种算法得到的随机森林中的每一棵都是很弱的,但是大家组合起来就很厉害了。我觉得可以这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域的专家(因为我们从M个feature中选择m让每一棵决策树进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题(新的输入数据),可以用不同的角度去看待它,最终由各个专家,投票得到结果。

。这个页面上写的比较清楚了,其中可能不明白的就是Information Gain,可以看看之前推荐过的Moore的页面。

Gradient Boost Decision Tree:

GBDT是一个应用很广泛的算法,可以用来做分类、回归。在很多的数据上都有不错的效果。GBDT这个算法还有一些其他的名字,比如说MART(Multiple Additive Regression Tree),GBRT(Gradient Boost Regression Tree),Tree Net等,其实它们都是一个东西(参考自wikipedia – Gradient Boosting),发明者是Friedman

Gradient Boost其实是一个框架,里面可以套入很多不同的算法,可以参考一下机器学习与数学(3)中的讲解。Boost是"提升"的意思,一般Boosting算法都是一个迭代的过程,每一次新的训练都是为了改进上一次的结果。

原始的Boost算法是在算法开始的时候,为每一个样本赋上一个权重值,初始的时候,大家都是一样重要的。在每一步训练中得到的模型,会使得数据点的估计有对有错,我们就在每一步结束后,增加分错的点的权重,减少分对的点的权重,这样使得某些点如果老是被分错,那么就会被“严重关注”,也就被赋上一个很高的权重。然后等进行了N次迭代(由用户指定),将会得到N个简单的分类器(basic learner),然后我们将它们组合起来(比如说可以对它们进行加权、或者让它们进行投票等),得到一个最终的模型。

而Gradient Boost与传统的Boost的区别是,每一次的计算是为了减少上一次的残差(residual),而为了消除残差,我们可以在残差减少的梯度(Gradient)方向上建立一个新的模型。所以说,在Gradient Boost中,每个新的模型的简历是为了使得之前模型的残差往梯度方向减少,与传统Boost对正确、错误的样本进行加权有着很大的区别。

在分类问题中,有一个很重要的内容叫做Multi-Class Logistic,也就是多分类的Logistic问题,它适用于那些类别数>2的问题,并且在分类结果中,样本x不是一定只属于某一个类可以得到样本x分别属于多个类的概率(也可以说样本x的估计y符合某一个几何分布),这实际上是属于Generalized Linear Model中讨论的内容,这里就先不谈了,以后有机会再用一个专门的章节去做吧。这里就用一个结论:如果一个分类问题符合几何分布,那么就可以用Logistic变换来进行之后的运算。

假设对于一个样本x,它可能属于K个分类,其估计值分别为F1(x)…FK(x),Logistic变换如下,logistic变换是一个平滑且将数据规范化(使得向量的长度为1)的过程,结果为属于类别k的概率pk(x),

acf7a510e7212ac40141d6d1c20c456d.png

对于Logistic变换后的结果,损失函数为:

b85baa688fa6e6b87e5fc8628f3b0310.png其中,yk为输入的样本数据的估计值,当一个样本x属于类别k时,yk = 1,否则yk = 0。

将Logistic变换的式子带入损失函数,并且对其求导,可以得到损失函数的梯度:

c247110ceb49c733962c1fda493bab2d.png上面说的比较抽象,下面举个例子:

假设输入数据x可能属于5个分类(分别为1,2,3,4,5),训练数据中,x属于类别3,则y = (0, 0, 1, 0, 0),假设模型估计得到的F(x) = (0, 0.3, 0.6, 0, 0),则经过Logistic变换后的数据p(x) = (0.16,0.21,0.29,0.16,0.16),y - p得到梯度g:(-0.16, -0.21, 0.71, -0.16, -0.16)。观察这里可以得到一个比较有意思的结论:

假设gk为样本当某一维(某一个分类)上的梯度:

gk>0时,越大表示其在这一维上的概率p(x)越应该提高,比如说上面的第三维的概率为0.29,就应该提高,属于应该往“正确的方向”前进

越小表示这个估计越“准确”

gk<0时,越小,负得越多表示在这一维上的概率应该降低,比如说第二维0.21就应该得到降低。属于应该朝着“错误的反方向”前进

越大,负得越少表示这个估计越“不错误 ”

总的来说,对于一个样本,最理想的梯度是越接近0的梯度。所以,我们要能够让函数的估计值能够使得梯度往反方向移动(>0的维度上,往负方向移动,<0的维度上,往正方向移动)最终使得梯度尽量=0),并且该算法在会严重关注那些梯度比较大的样本,跟Boost的意思类似。

得到梯度之后,就是如何让梯度减少了。这里是用的一个迭代+决策树的方法,当初始化的时候,随便给出一个估计函数F(x)(可以让F(x)是一个随机的值,也可以让F(x)=0),然后之后每迭代一步就根据当前每一个样本的梯度的情况,建立一棵决策树。就让函数往梯度的反方向前进,最终使得迭代N步后,梯度越小。

这里建立的决策树和普通的决策树不太一样,首先,这个决策树是一个叶子节点数J固定的,当生成了J个节点后,就不再生成新的节点了。

算法的流程如下:(参考自treeBoost论文)

5a7d7b8ac4f7a7f94b1b0c63bc92cde2.png

0. 表示给定一个初始值

1. 表示建立M棵决策树(迭代M次)

2. 表示对函数估计值F(x)进行Logistic变换

3. 表示对于K个分类进行下面的操作(其实这个for循环也可以理解为向量的操作,每一个样本点xi都对应了K种可能的分类yi,所以yi, F(xi), p(xi)都是一个K维的向量,这样或许容易理解一点)

4. 表示求得残差减少的梯度方向

5. 表示根据每一个样本点x,与其残差减少的梯度方向,得到一棵由J个叶子节点组成的决策树

6. 为当决策树建立完成后,通过这个公式,可以得到每一个叶子节点的增益(这个增益在预测的时候用的)

每个增益的组成其实也是一个K维的向量,表示如果在决策树预测的过程中,如果某一个样本点掉入了这个叶子节点,则其对应的K个分类的值是多少。比如说,GBDT得到了三棵决策树,一个样本点在预测的时候,也会掉入3个叶子节点上,其增益分别为(假设为3分类的问题):

(0.5, 0.8, 0.1),  (0.2, 0.6, 0.3),  (0.4, 0.3, 0.3),那么这样最终得到的分类为第二个,因为选择分类2的决策树是最多的。

7. 的意思为,将当前得到的决策树与之前的那些决策树合并起来,作为新的一个模型(跟6中所举的例子差不多)

GBDT的算法大概就讲到这里了,希望能够弥补一下上一篇文章中没有说清楚的部分:)

实现:

看明白了算法,就需要去实现一下,或者看看别人实现的代码,这里推荐一下wikipedia中的gradient boosting页面,下面就有一些开源软件中的一些实现,比如说下面这个:http://elf-project.sourceforge.net/

参考资料:

除了文章中的引用的内容(已经给出了链接)外,主要还是参考Friedman大牛的文章:Greedy function approximation : A Gradient Boosting Machine

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461064.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于uboot的简介——uboot的目录结构

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 不同版本的uboot&#xff0c;或者同一版本不同人员移植的uboot&#xff0c;目录结构和文件内容都会有所不同&#xff0c;也就是说&#xff0c;可以根据需要去添加、删除或者更改目录结构。在以三星的…

为何不精通C? 03 深入剖析声明

对于复杂的C函数声明&#xff0c;或者被typedef别名后的声明&#xff0c;很多人往往一头雾水。本文主要解析下C语言中声明过程所遵循的原则。 声明 引用《C专家编程》的第三章内容&#xff0c;说明下声明的优先级规则&#xff1a; 声明从它的名字开始读&#xff0c;然后按照优先…

Photoshop绘制植物大战僵尸中的食人花

本人意见&#xff1a;我打算使用本文中的食人花形象作为我的一次讲课中的主要参考。我想说明的是&#xff0c;通过FLASH和PS都能够轻松地绘制出如本文所描述的食人花卡通效果。独立游戏开发者如果安排好时间&#xff0c;完全可以通过1-2个月掌握FLASH和PS绘制&#xff08;想精通…

ios手机 php无法上传文件,【已解决】uni.uploadFile 苹果ios图片上传不成功

安卓正常上传&#xff0c;苹果里我到相册里选了一张20k的图片&#xff0c;服务器都得不到数据&#xff0c;服务器端是PHP&#xff0c;$_FILES居然是空的&#xff0c;下面是简单的代码openPic(){var that this;uni.chooseImage({count: 1,sourceType: [album, camera],sizeType…

uboot源码——uboot启动内核过程总结

总结的思维导图&#xff0c;其下载地址&#xff1a;Uboot启动.mmap_免费高速下载|百度网盘-分享无限制 第一阶段&#xff1a;汇编阶段&#xff0c;即start.S文件的工作。 第二阶段&#xff1a;C代码阶段&#xff0c;即start_armboot函数的工作。 值得一提的是&#xff0c;star…

虚拟化运行[OpenStack] VMWare产品介绍

最近使用开发的过程中出现了一个小问题&#xff0c;顺便记录一下原因和方法--虚拟化运行 世界上最早研制虚拟化软件的厂商之一。目前是是寰球桌面到数据中心虚拟化解决方案的引导厂商。中文名“威睿”&#xff0c;纽约证券交易所代码&#xff1a;VMW。总部设在加利福尼亚州的帕…

oracle模拟重叠事务,ORACLE的事务读一致性与语句读一致性

SET TRANSACTION READ ONLY来实现事物级别的一致性。一个事物所有语句读到的数据都是一致的。我们开始试验一&#xff0c;模拟语句级别读一致性。第一个session使用显示打开一个游标模拟数据读&#xff0c;同时在游标读数据的过程中&#xff0c;启动另外一个session更改数据&am…

内核源码——kernel启动过程的思维导图

参考博客 内核源码——汇编阶段的head.S文件_天糊土的博客-CSDN博客___head汇编 内核源码——C语言阶段的start_kernel函数_天糊土的博客-CSDN博客_start_kernel 思维导图 kernel启动过程的思维导图下载地址&#xff1a;内核启动过程.mmap

能力=知识+技能+经验

知识少则眼光不够深远&#xff1b;技能不精则难以服众经验太少则容易应变不灵。那么如果想让老板提升你&#xff0c;最“靠谱”的方法就是用这几方面检验自己&#xff0c;寻找机会进行自我提升&#xff0c;全面而优质的能力自然会让HR对你另眼相看。 然而这种理想的状态并非短期…

oracle 01013 02063,Oracle11g dblink用户密码大写限制-ORA-02063: preceding line from FOR244_DBLINK...

[oracleKY22 ~]$ sqlplus admin/admin4567SQL*Plus: Release 10.2.0.1.0 - Production on D???t 6?? 12 13:52:50 2012Copyright (c) 1982, 2005, Oracle. All rights reserved.Connected to:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bit Product…

oracle的等保,3.Oracle 检查(部分)

这是3级等保中oracle的检查方法&#xff0c;剩下的检查项可通过询问的方式进行检查。1.身份鉴别a.1 查看数据库用户select username,account_status from dba_users;b.1 检查用户的profileselect username,account_status,profile from dba_users;b.2 检查密码策略select profi…

Activiti配置实例以及Spring集成配置

public class TestDB {public static void main(String[] args) {//1。 创建Activiti配置对象的实例ProcessEngineConfiguration configuration ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();//2. 设置数据库连接信息// 设置数据库地址configura…

Linux字符设备驱动剖析

以下内容整理于Linux字符设备驱动剖析&#xff0c;如有侵权请告知删除 。 一、应用层的程序 应用程序一般都是open打开设备文件&#xff0c;read、write、ioctl设备文件&#xff0c;最后close设备文件退出。 int main(int argc ,char *argv[]) { unsigned char val[1] 1; …

php处理form多文件上传,ajax利用FormData、FileReader实现多文件上传php获取

前台代码(注意&#xff0c;不需要用到form标签)&#xff1a;a. html部分&#xff1a;b. js部分&#xff1a;c. 完整代码&#xff1a;function loadDoc(file,data,asynctrue){if(window.XMLHttpRequest){ // code for IE7, Firefox, Chrome, Opera, Safarixmlhttpnew XMLHttpReq…

getattr

getattr(object, name[, default]) -> value Get a named attribute from an object; getattr(x, y) is equivalent to x.y. When a default argument is given, it is returned when the attribute doesnt exist; without it, an exception is raised in that case转载于:h…

rpmbuild FILE

2、一些rpm相关信息rpm软件包系统的标准分组&#xff1a;/usr/share/doc/rpm-4.3.3/GROUPS各种宏定义&#xff1a; /usr/lib/rpm/macros已经安装的rpm包数据库&#xff1a; /var/lib/rpm如果要避免生成debuginfo包&#xff1a;这个是默认会生成的rpm包。则可以使用下面的命令&a…

Linux设备文件的创建和mdev

以下内容源于微信公众号嵌入式企鹅圈&#xff0c;有格式内容上的修改&#xff0c;如有侵权请告知删除。 本文将从代码级去理解Linux设备类和设备文件的创建过程。 一、设备类相关知识 设备类是虚拟的&#xff0c;并没有直接对应的物理实物&#xff0c;只是为了更好地管理同一类…

linux查看执行过的命令行,在Linux命令终端中查看和编辑曾执行过的命令 – LINUX笔记 – CFEI.NET...

今天我们来讲讲linux的知识,积累的这些知识就是我们以后的财富,各位加油.因为水平有限&#xff0c;难免有疏忽或者不准确的地方&#xff0c;希望大家能够直接指出来&#xff0c;我会及时改正。一切为了知识的分享。history 命令可以用来显示曾执行过的命令&#xff0c;也可以根…

烂泥:【解决】word复制windows live writer没有图片

本文由秀依林枫提供友情赞助&#xff0c;首发于烂泥行天下。 在使用windows live writer发表博客&#xff0c;博客先是在是word2013中进行编辑&#xff0c;编辑完毕后我会复制到windows live writer中&#xff0c;然后发表出去。 使用了几年都没有问题&#xff0c;就是最近这个…

平台设备与平台驱动的注册

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 参考资料 linux中 probe函数何时调用 platform总线的probe函数调用_Linux编程_Linux公社-Linux系统门户网站 Linux设备驱动模型之platform(平台)总线详解 Linux设备驱动模型2——总线式设备驱动组织方式_天…