模式识别(Pattern Recognition)学习笔记(二十九)--决策树的剪枝

在有限的样本下,如果决策树生长得很大,树枝很多,那么就有可能导致有限样本中对采样的偶然性或噪声比较敏感,导致过学习,从而范化能力差。

首先来看一幅图,如图:

上图是一次测试中用ID3算法得到的有关决策树的大小与在训练数据和测试数据上的正确率的关系,不难看出,出现了过学习,如果样本不足够多,随着决策树达到一定规模大小,训练数据上的正确率会不断增加,而在测试数据上的正确率不增反降,因此像这种只要生长到叶节点只包含单一类样本的方法来构建决策树的算法是存在瑕疵的,我们的目标是要兼顾训练数据上的正确率和测试数据上的正确率,跟所有模式识别问题一样,必须要保证良好的泛化能力。

在决策树算法中,控制算法的范化性能,防止出现过学习的主要手段,是控制决策树生成算法的终止条件和对决策树进行剪枝,而控制决策树大小的办法就是剪枝(Prunning),主要有两种策略:先剪枝和后剪枝。

先剪枝

定义:控制决策树的生长;在决策树生长过程中决定某节点是否需要继续分枝还是直接作为叶节点,一旦某节点被判断为叶节点后,该枝就停止生长。

判断决策树何时停止生长的方法:

1)数据划分法:将样本数据分成训练样本和测试样本,先在训练样本上生长决策树,直到才测试样本上的正确率达到最大就停止生长。

缺点:由于要划分数据样本,所以训练时只利用了总样本中的一部分,没有充分利用数据信息,因此需要多次交叉验证;

2)阈值法:设置一个合适的信息增益(熵不纯度的较小幅度)阈值,当发现当前某一节点得到的信息增益小于阈值,就停止生长。

缺点:阈值的选取不太好把握;

3)信息增益的统计显著性分析:对已有节点得到的所有信息增益统计出分布,如果再继续生长得到的信息增益与该分部相比显著性不明显,就停止生长;

缺点:不直观,显著性不太好考察,可考虑用卡方分布;

后剪枝

定义:后剪枝就是等到决策树生长完成后再进行优化和修剪,主要就是对一些分枝进行合并;从叶节点出发,如果去掉具有相同父节点的叶节点后不会导致熵不纯度的明显增加,就执行消除,并以其父节点作为新的叶节点,这样不断的回溯,直到没有再适合合并的分枝为止。

后剪枝对分枝进行合并过程中,往往有以下三种原则可遵循:

1)减少分类错误率的修剪法:估计剪枝前后的分类错误率变化,基于错误率来判断是否应该合并分枝;

2)最小代价与复杂度的平衡:同时兼顾考虑两个指标:剪枝后错误率增加和复杂度降低,两者之间折中考虑,最后得到一个综合性能的决策树;

3)最小描述长度准则:基于”简简单单就是幸福“的想法;先对决策树编码,再剪枝得到编码最短的决策树;

总结

先剪枝与后剪枝的选择需要结合具体问题来具体分析。先剪枝看起来更加直接,但它的困难在于需要判断何时应该停止生长决策树,由于决策树的生长过程中,每一步都只以当前准则最优为依据(是一种贪心算法),没有全局观,且不会回溯,因此先剪枝缺乏对最后效果的考虑,可能会导致生长提前终止。对于后剪枝(实践中运用的较为成功,C4.5和CART中都用到了后剪枝进行修剪),一来充分利用所有的样本信息,二来考虑到全局(补偿机制),缺陷是样本数据足够大时增加比较重的计算负担,因此实践中也可以将二者进行结合。

时间: 2024-12-12 23:12:08

模式识别(Pattern Recognition)学习笔记(二十九)--决策树的剪枝的相关文章

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

【Unity 3D】学习笔记二十九:游戏实例——简单小地图制作

任何的学习,光看不练是学不好的.所以这次就总结回顾下怎么制作MMROPG类游戏中的小地图.在MMROPG类游戏里,主角在游戏世界里走动时,一般在屏幕右上角都会有一个区域来显示当前游戏场景的小地图.主角在游戏世界里走动,小地图里代表着主角的小标记也会随之移动.那怎么实现咧? 首先需要确定两个贴图,第一个是右上角的小地图背景贴图,应该是从Y轴俯视向下截取主角所在的位置大地图.第二个就是主角的位置大贴图.在本例中,因为没有学习unity地图制作,所以地图用一个面对象代替,主角用立方体代替,使用GUI来

[傅里叶变换及其应用学习笔记] 二十九. 高维Ш函数修改版

一维Ш函数复习 我们前面(十六课,十七课)已经学习过一维的Ш函数,标准的Ш函数表现为无数个脉冲函数分布在整数点上, 我们定义Ш为 $Ш(x) = \displaystyle{ \sum_{k=-\infty}^{\infty}\delta(x-k) }$ 而Ш函数最为深刻的一个性质就是:Ш的傅里叶变换是它自身 $\mathcal{F}Ш=Ш$ 进一步推广到脉冲间隔为$p$的函数$Ш_p$ $\displaystyle{ Ш_p(x)=\sum_{k=-\infty}^{\infty}\delta

PHP学习笔记二十九【接口】

<?php //定义接口 //接口可以定义属性,但必须是常量而且是public //接口的所有方法必须是public interface Iusb{ public function start(); public function stop(); } //手机类实现接口关键字implements,必须实现这个所有方法 //类可以同时实现多个接口 //一个类可以实现多个接口 implements 接口1,接口2,接口 class Phone implements Iusb{ public func

Linux学习笔记&lt;二十九&gt;——http服务

基础概念: HTTP:Hyper Text Transfer Protocol 超文本传输协议 versions: HTTP/0.9:只接收GET一种请求方法,只支持纯文本 HTTP/1.0:支持PUT.POST.DELETE和HEAD,支持MINE HTTP/1.1:在HTTP/1.0的基础上,增加了缓存功能,支持长连接,支持管道方式同时                  发送多个请求 HTTP请求方法:获取资源的方法 HTTP/0.9:GET HTTP/1.0:PUT(修改服务器上的内容),

《Javascript权威指南》学习笔记之十九--HTML5 DOM新标准---处理文档元信息和管理交互能力

一.了解DOM 1.DOM是Document Object Model的缩写,即文档对象类型,是文档在内存中的表示形式,是一个应用程序接口,定义了文档的逻辑结构以及一套访问和处理文档的方法. 2.HTML DOM与Core DOM的区别:前者提供了大量的方法和属性,与现有的程序模型一致,更便于脚本的编写者控制. 二.document对象 使用window.document属性返回一个document对象,代表当前window内加载的文档.window可以省略.winName.document返回

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource

【Unity 3D】学习笔记二十六:unity游戏脚本(六)

在3D游戏世界中,任何一个游戏对象在创建的时候都会附带Transform(变换)组件,并且该组件是无法删除的,也不应该删除.在unity中,Transform面板一共有3个属性: Position  (位置) Rotation(旋转) Scale(缩放) 这三个值都是用来调整游戏对象在游戏界面中的位置,状态等相关参数. Position  (位置) 任何一个游戏对象的三维坐标都保存在Vector3容器中,该容器记录对象在X轴,Y轴,Z轴的坐标.一旦Vector33容器中的坐标发生变化,那么Sce