统计学习笔记之决策树(二)

1.CART分类树的特征选择

分类问题中,假设有K个类,样本点属于第k类的概率为,则概率分布的基尼指数定义为:

  

如果,集合D根据特征A是否取某一可能值a被分割成,在特征A的条件下,集合D的基尼指数定义为:

  

基尼指数代表了模型的不纯度,基尼指数越小,不纯度越小,特征越好.

2.CART分类树的生成算法

输入:训练数据集D,停止计算条件;

输出:CART决策树.

根据训练数据集,从根结点开始,递归的对每个结点进行以下操作,构建二叉树:

(1)计算现有特征对该数据集的基尼指数;

(2)在所有可能的特征A以及它们所有可能的切分点a中,选择基尼指数最小的特征,以及其对应的切分点作为最优特征和最优切分点,依此从现结点生成两个子结点,将数据集集体依特征分配到两个子结点中去;

(3)对两个子结点递归的调用(1)(2),直至满足停止条件;

(4)生成CART决策树

3.CART回归树的建立

在CART分类树中,用基尼指数来选择最优特征和最优切分点,而在回归树当中用的是均方差.选择最优切分变量j与切分点s的方式是,求解:

  

  其中的样本输出均值,的样本输出均值。CART分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。而回归树输出不是类别,它采用的是用最终叶子的均值或者中位数来预测输出结果。

4.CART剪枝思想

  由于决策树算法容易过拟合,导致泛化能力较差,为了解决此问题,便引入了决策树剪枝,即类似于线性回归的正则化,来增强决策树的泛化能力。CART树采用后剪枝,分为两步:一、从生产算法产生的决策树不断剪枝,直到根结点,产生剪枝后的决策树;二、通过交叉验证法在独立的实验数据集上对子树进行测试,选择最优子树。

  在剪枝过程中,计算子树的损失函数:

    

其中,T为任意子树,是对训练数据的预测误差(如基尼指数),为子树的叶结点个数,为参数,并权衡训练数据的拟合程度与模型的复杂度。表示参数为时的整体损失。偏大时,最优子树偏小,偏小时,最优子树偏大,时,整体树是最优的。

  剪枝时,从整体树开始,对的任意内部结点t,以t为单结点树的损失函数是:

    

  以t为根结点的子树的损失函数是:

    

  当及充分小时,有不等式:

    

可以这么理解,剪枝后的损失函数值比剪枝前的损失函数值要小.

  当增大时,在某一有:

    

  当再增大时,不等式反向.那么,只要,与t有相同的损失函数值,而t的结点减少,因此t比更可取,对进行剪枝.

  为此,对中每一个内部结点t,计算

    

它表示剪枝后整体损失函数减少的程度,在中减去最小的,得到的子树作为,同时将最小的设为.为区间的最优子树.如此剪枝下去,直到得到根结点.在这一过程中,不断的增加的值,产生新的区间.

  最后,利用独立的验证数据集,测试子树序列中各棵子树的平均方误差或者基尼指数,值最小的决策树被认为是最优的决策树.在子树序列中,每棵子树都对应一个参数.所以,当最优子树确定时,对应的也就确定下来了,即得到最优决策树.

5.CART剪枝算法

输入:CART算法生成的决策树;

输出:最优决策树.

(1)设k=0,

(2)设

(3)自下而上地对各内部结点t计算,以及

  

  

这里,表示以t为根结点的子树,是对训练数据的预测误差,的叶结点个数

(4)对的内部结点t进行剪枝,并对叶结点t以多数表决法决定其类,得到树

(5)设

(6)如果不是由根结点及两个叶结点构成的树,返回到(3);否则

(7)采用交叉验证法在子树序列中选择最优子树

时间: 2024-07-29 17:03:45

统计学习笔记之决策树(二)的相关文章

SaltStack 学习笔记 - 第十二篇: SaltStack Web 界面

SaltStack 有自身的用python开发的web界面halite,好处是基于python,可以跟salt的api无缝配合,确定就比较明显,需要个性化对web界面进行定制的会比较麻烦,如果喜欢体验该界面的可以参考下面的文章  http://rfyiamcool.blog.51cto.com/1030776/1275443/ 我是运用另一个python+php来进行web开发,具体需要的工具有在我的另一篇文章里面介绍过,这里再重新进行整个开发介绍 首先介绍php 跟python通信的工具 pp

【Unity 3D】学习笔记四十二:粒子特效

粒子特效 粒子特效的原理是将若干粒子无规则的组合在一起,来模拟火焰,爆炸,水滴,雾气等效果.要使用粒子特效首先要创建,在hierarchy视图中点击create--particle system即可 粒子发射器 粒子发射器是用于设定粒子的发射属性,比如说粒子的大小,数量和速度等.在创建完粒子对象后,在右侧inspector视图中便可以看到所有的粒子属性: emit:是否是使用粒子发射器. min size:粒子最小尺寸. max size:粒子最大尺寸. min energy:粒子的最小生命周期

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

缓存方式: 直接映射 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 Shaders】学习笔记——SurfaceShader(二)两个结构体和CG类型

[Unity Shaders]学习笔记——SurfaceShader(二)两个结构体和CG类型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5596698.html 写作本系列文章时使用的是Unity5.3. 写代码之前: 当然啦,如果Unity都没安装的话肯定不会来学Unity Shaders吧? 阅读本系列文章之前你需要有一些编程的概念. 在VS里面,Unity Shaders是没有语法高亮显示和智能提示的,VS党可以参考一下这篇文章使代码高亮显示

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

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

《Javascript权威指南》学习笔记之十二:数组、多维数组和符合数组(哈希映射)

Array(数组)是JavaScript中较为复杂的数据类型,同Java.C#.VB等程序语言的数组相比,Javascript数组中的元素不必为相同的数据类型,可以在数组每个元素上混合使用数字.日期.字符串.Object,甚至添加一个嵌套数组. 一.创建数组 1.var arr1 = new Array(); /var  arr2 = new Array(length); /var arr3 = new Array(element1,element2...); var arr4 = [eleme

汇编入门学习笔记 (十二)—— int指令、port

疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引发一个n号中断. 运行过程相当于: (1)取中断类型吗n. (2)标志寄存器入栈:设置IF=0,TF=0. (3)CS.IP入栈 (4)(IP)=(n*4),(CS)=(n*4+2) 样例1:编写.安装中断7ch.实现求一个word型数据的平方,用ax存放这个数据. assume cs:code code s

Android学习笔记(十二)——使用意图传递数据的几种方式

使用意图传递数据的几种方式 点此获取完整代码 我们除了要从活动返回数据,也常常要传递数据给活动.对此我们可以使用Intent对象将这些数据传递给目标活动. 1.创建一个名为PassingData的项目,在activity_main.xml文件中添加一个Button: <Button android:id="@+id/btn_SecondActivity" android:layout_width="fill_parent" android:layout_hei

Unity3d之Hash&amp;Slash学习笔记之(二)--角色基础类的构建

Hash&Slash学习笔记之(二)--角色基础类的构建 BaseStat类的构建 基本成员变量: _baseValue //基础属性值 _buffValue //增加的buff值 _expToLevel //升级所需经验值 _levelModifier //每一级的增长率,即下一等级所需经验为_expToLevel*_levelModifier 成员函数: private int CalculateExpToLevel(){ //计算下一级升级所需经验 return (int)(_expToL