模式识别(Pattern Recognition)学习笔记(三十)--随机森林(Random Forest)

引言

模式识别是一门基于数据的学科,因此所有的模式识别问题都会面临的同一个问题就是数据的随机性问题。模式识别中每个方法的实现都是基于一个特定的数据样本集的,但是这个样本集只是所有可能的样本中的一次随机抽样,毕竟在我们的生活实际中存在着万物众生,多到我们数也数不清,甚至计算机都无法统计的清,而我们搜集到的充其量只是其中很小很小的一部分,这也是为什么机器学习中缺少的只是数据,只要有足够多的学习数据,就一定能取得惊人的结果,因此模式识别和机器学习中的很多方法的实现结果都无疑会受到这种随机性的影响,我们训练得到的分类器也因此具有偶然性,尤其是样本不足够多时更为明显。

对于决策树而言,其树的生长是采用的贪心算法,只考虑当前局部的最优,因此其受这种随机性影响会更加严重,这也是为什么有的决策树泛化能力那么差的原因。

针对这种随机性的影响,最早在统计学中有人提出了一种叫做”自举(Bootstrap)“的策略,基本思想是对现有样本进行重复采样而产生多个样本子集,通过这种多次重复采样来模拟数据的随机性,然后在最后的输出结果中加进去这种随机性的影响。随后有人把这种自举的思想运用到了模式识别中,衍生出了一系列的解决方法,像随机森林、Bagging、Adaboost等,这篇博客就来学习下什么是随机森林。

基本思想

随机森林是以决策树为基础的,从其名字”森林“俩字可以看出肯定有很多个什么鬼组成的一片茂密的大森林啊,那到底是什么鬼捏,其实就是决策树;随机森林其实就是建立很多个决策树,组建成决策树”森林“,然后通过对多个决策树投票来进行决策,通常决策为投票最多的。随机森林跟C4.5算法一样,不光可以处理离散数值特征,而且可以处理连续数值特征,这是ID3算法所不具备的。

具体做法

1)根据实际需要,得出需要构造的决策树数目T;

2)首先对样本数据进行自举重采样,生成多个样本子集;什么是自举重采样,就是高中学概率问题的时候接触到最多的有放回问题,即每次从N个样本中有放回的随机取出一个,这样取N次,最后会得到N个样本,当然有可能取到重复样本,但是没关系;

3)随机抽取用来构造决策树的特征:每次从所有候选特征中随机的选出m个特征,作为当前节点下决策用的备选特征,然后根据比较信息增益的方法选取出可以最好划分训练样本的特征;

4)利用上述已经选好的代表性特征,将每个重采样的样本集作为训练样本构造决策树;

5)得到事先给定的决策树数目的众多决策树后,分别对每棵树的输出结果进行投票,将票数最多的类决策为随机森林最后的决策;

上述原理如图所示,一目了然:

可以发现,在上面的步骤中,随机森林做了两方面的采样:1)对训练样本采样;2)对特征进行采样,因此保证了每一颗树之间的独立性,彼此不相关,从而使得最后的投票结果是无偏的。另外上面实现过程中涉及到两个人为给定的参数:1)树的个数;2)备选的特征数;这两个参数在实际应用中一定要结合实际和经验来选取,通常来说,树的个数最好多一些,毕竟多一些人投票就公平些,而对备选的特征数,不宜太多不宜太少,可设为总的候选特征数的平方根;

优缺点分析

优点:

1)可以处理离散特征和连续特征;

2)不会出现过学习的现象;

3)减少样本偶然性,结果无偏;

4)在样本数据分布严重不均的情况下,仍然能保障结果的可靠性;

5)可以处理高维数据;

6)训练和预测速度快;

7)训练完后,会明确给出那些特征具有高辨别力;

8)简单高效;

缺点:

1)需要人为确定特征数,对于没经验者不太好拿捏;

2)尽管树之间的独立性可以保证不会出现过学习,但是当数据中夹杂噪声的情况下不能保证;

3)会被有多个候选特征属性的样本数据误导;

时间: 2024-07-30 17:48:48

模式识别(Pattern Recognition)学习笔记(三十)--随机森林(Random Forest)的相关文章

【Unity 3D】学习笔记三十四:游戏元素——常用编辑器组件

常用编辑器组件 unity的特色之一就是编辑器可视化,很多常用的功能都可以在编辑器中完成.常用的编辑器可分为两种:原有组件和拓展组件.原有组件是编辑器原生的一些功能,拓展组件是编辑器智商通过脚本拓展的新功能. 摄像机 摄像机是unity最为核心组件之一,游戏界面中显示的一切内容都得需要摄像机来照射才能显示.摄像机组件的参数如下: clear flags:背景显示内容,默认的是skybox.前提是必须在render settings 中设置天空盒子材质. background:背景显示颜色,如果没

马哥学习笔记三十二——计算机及操作系统原理

缓存方式: 直接映射 N路关联 缓存策略: write through:通写 write back:回写 进程类别: 交互式进程(IO密集型) 批处理进程(CPU密集型) 实时进程(Real-time) CPU: 时间片长,优先级低IO:时间片短,优先级高 Linux优先级:priority 实时优先级: 1-99,数字越小,优先级越低 静态优先级:100-139,数据越小,优先级越高 实时优先级比静态优先级高 nice值:调整静态优先级   -20,19:100,139   0:120 ps

【Unity 3D】学习笔记三十二:游戏元素——游戏光源

游戏光源 在3D游戏中,光源是一个非常具有特色的游戏组件.用来提升游戏画面质感的.如果没有加入光源,游戏场景可能就会显得很昏暗.在unity中提供了三种不同的光源类型:点光源,聚光灯,平行光. 点光源 顾名思义,点光源是从一个点向周围散发出光的光源,就像电灯一样.创建点光源在hierarchy视图中点击create--point light: 创建完以后,点击点光源对象,在右侧inspector视图中可以看到点光源的所有信息: type:光源的类型.有point(点光源),directional

angular学习笔记(三十)-指令(5)-link

这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数:scope,iEle,iAttrs,ctrl,linker scope:指令所在的作用域,这个scope和指令定义的scope是一致的.至于指令的scope,会在讲解scope属性的时候详细解释 iEle:指令元素的jqLite封装.(也就是说iEle可以调用angular封装的简版jq的方法和属

angular学习笔记(三十)-指令(6)-transclude()方法(又称linker()方法)-模拟ng-repeat指令

在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指令(5)-link文章也提到了link函数的第五个参数linker. 这篇文章就来讲解一下transclude()方法(linker()方法),是怎么使用的,另外,它也是compile函数的第三个参数,用法一样. 下面就通过自己写一个简易的模拟ngRepeat的指令cbRepeat,来了解linke

angular学习笔记(三十)-指令(7)-compile和link(2)

继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的代码: html: <body> <div ng-controller="compileCtrl"> <level-one> <level-two> <level-three> hello,{{name}} </level-

马哥学习笔记三十——tomcat

Java体系结构包含四个独立却又彼此相关的技术: Java程序设计语言 Java API Java Class文件格式 JVM: Java Virtual Machine JVM的实现方式: 1.一次性解释器,解释字节码并执行: 2.即时编译器(just-in-time complier) 依赖于更多内存缓存解释后的结果 3.自适应编译器 缓存20%左右代码,提高80%左右的速度: 运行时数据区: 线程私有内存区: 程序计数器 java虚拟机栈 线程共享内存区: 方法区 堆:java自动内存回收

angular学习笔记(三十)-指令(2)

本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: E 2. 属性: A 3. 样式类: C 4. 注释: M restrict的值可以是上面四个字母的任意一个或多个的组合. 不指定的话默认为A. 二. replace: 布尔值.是否将指令元素替换,可以有两个值: 1.true: 替换整个使用指令的元素 2.false: 不替换整个使用指令的元素,而

angular学习笔记(三十)-指令(10)-require和controller

本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐directive> <inner‐directive></inner‐directive> </outer‐directive> 这里有两个指令,一个outer-directive指令元素,它里面又有一个inner-directive指令元素. js: app.directiv

angular学习笔记(三十)-指令(1)

之前在 angular学习笔记(十九)-指令修改dom 里面已经简单的提到了angular中的指令,现在来详细的介绍 '指令' 一.指令的创建: dirAppModule.directive('directive-name',function(){ var obj = { restrict:'string', priority:number, template:'string', templateUrl:'string', replace:bool, transclude:bool or str