决策树剪枝算法原理
来源:互联网 发布:java 外贸电商平台 编辑:程序博客网 时间:2024/05/22 13:44
算法目的:决策树的剪枝是为了简化决策树模型,避免过拟合。
- 同样层数的决策树,叶结点的个数越多就越复杂;同样的叶结点个数的决策树,层数越多越复杂。
- 剪枝前相比于剪枝后,叶结点个数和层数只能更多或者其中一特征一样多,剪枝前必然更复杂。
- 层数越多,叶结点越多,分的越细致,对训练数据分的也越深,越容易过拟合,导致拟合测试数据时反而效果差。
算法基本思路:剪去决策树模型中的一些子树或者叶结点,并将其上层的根结点作为新的叶结点,从而减少了叶结点甚至减少了层数,降低了决策树复杂度。
模型损失函数
- 变量预定义:
|Tleaf| 表示树T的叶结点个数,t表示树T的叶结点,同时,Nt 表示该叶结点含有的样本点个数,其中属于k类的样本点有Ntk 个,K表示类别的个数,Ht(T) 为叶结点t上的经验熵,α≥0 为参数。
显然有Nt=∑k=1KNtk - 经验熵:
Ht(T)=−∑kKNtkNtlogNtkNt - 评价函数即损失函数:
C(T)=∑t=1|Tleaf|NtHt(T) 避免过拟合修正后的评价函数:
Ca(T)=∑t=1|Tleaf|NtHt(T)+α|Tleaf|
损失函数简化形式:Ca(T)=C(T)+α|Tleaf|
- 经验熵反映了一个叶结点中的分类结果的混乱程度。经验熵越大,说明该叶结点所对应的分类结果越混乱,也就是说分类结果中包含了较多的类别,表明该分支的分类效果较差。
- 评价函数其实是求叶结点的经验熵期望。用
Nt 给经验熵加权的依据是叶子节点含有的样本个数越多,其分类效果或混乱程度越占主导,相当于求了期望,可以更好的描述分支前后的关系。例如设一个结点r有n个样本,其组成是第i类有ni 个样本,在分了几个孩子结点后各个叶结点的成分仍保持原比例,记新的子树为R,可以计算得出评价函数C(r)=C(R) ,即在随机分组后不会有任何分类效果的改进。- 评价函数越小越好。熵的期望和熵一样,越小越好。所以,评价函数越大,说明模型的分类效果越差,因而又称损失函数。
- 修正项
α|Tleaf| 是基于复制度的考虑。如上面提到的情况,r与R其实是一样的,没有进行任何分类的处理,但是我们仍然觉得r更好,原因在于R的复杂度更高。加了此修正项后具有现实的意义:如果α=0 表示未剪枝的完全树损失更小(熵更小的占主导地位),如果α−>∞ 表示剪枝到只剩根结点更好(叶结点个数占主导地位)。
修正项α|Tleaf| 可以避免过拟合。修正项α|Tleaf| 考虑到了复杂度,α 值设置得好可以避免出现完全树和根结点这类的极端情况,因此可以避免过拟合。纯结点的经验熵
Hp=0 最小,即设Ntj=Nt 则有Hp=−(1log1+∑k=1且k≠jK0)=0
均结点的经验熵Hu=logK 最大,即Hp=−∑k=1K1Klog1K=logK
剪枝类型:预剪枝、后剪枝
- 预剪枝是在决策树生成过程中,对树进行剪枝,提前结束树的分支生长。
- 后剪枝是在决策树生长完成之后,对树进行剪枝,得到简化版的决策树。
预剪枝依据:
- 作为叶结点或作为根结点需要含的最少样本个数
- 决策树的层数
- 结点的经验熵小于某个阈值才停止
后剪枝思路:
如何由
Ti 剪枝得到Ti−1 :
如图
Cα(r)=C(r)+α
Cα(R)=C(R)+NR∗α ,其中NR 为子树R的叶子结点数一般地有
C(r)>=C(R) , 我们可以令Cα(r)=Cα(R) 求出α=C(r)−C(R)NR−1 - 当我们把所有的非叶结点的
α 求出来后比较它们的α 值,在最小的α 所在结点处剪枝。
为什么要在最小的α 所在结点处剪枝:设给定一α 来求两个结点r1 、r2 处的损失函数Cα(r1) 和Cα(r2) 以判定是否适合继续分支,且使得给定的α 介于它们自己的阈值参数α1 与α2 之间,假设α1 <α <α2 。则
对于r1 来说,α1 <α ,α 给大了,参数占主导,剪枝能使得叶结点数(即参数的系数)变小,剪枝能使得Cα(r1) 较小,剪枝更好;
对于r2 来说,α <α2 ,α 给小了,C(r2)−C(R2) 的值占主导,即
Cα(r)−Cα(R)
=C(r)+α−C(R)+NR∗α
=[C(r2)−C(R2)]+[1−NR]∗α
不剪枝能使得叶结点数(即参数的系数)更大,Cα(r)−Cα(R) 更接近0,剪枝更好。
我们看出参数阈值较小的r1 处剪枝更好,因此要在最小的α 所在结点处剪枝。- 由
Ti 剪枝得到Ti−1 后,可以得出T0−>T1−>T2−>...−>Tn ,但不一定每次剪枝都能使得损失函数降低,可以对每一个Ti 算出其损失函数进行比较,取损失函数值最小的那棵决策树。
注:10 决策树和随机森林实践
参考:http://blog.csdn.net/ritchiewang/article/details/50254009
阅读全文
0 0
- 决策树剪枝算法原理
- 决策树之剪枝原理与CART算法
- 决策树剪枝算法
- 决策树剪枝算法
- 决策树-剪枝算法(二)
- 决策树剪枝算法(二)
- 决策树算法与剪枝处理
- 决策树算法 生成 剪枝 in Python
- 决策树的剪枝和CART算法
- 决策树-Cart生成和剪枝算法
- 决策树算法与不同的剪枝方法
- 机器学习算法-决策树的剪枝
- 决策树-剪枝
- 决策树算法原理(上)
- 决策树算法原理
- 决策树ID3算法原理
- 决策树算法原理及案例
- 决策树分类算法-ID3算法原理
- 代码网站及UI界面库
- Spring Boot (教程二:安装spring-tool-suite插件 )
- 操作系统2
- JavaBean
- 透过-128看原码,反码,补码(c语言中char类型)
- 决策树剪枝算法原理
- 代码健壮性 --- 失误点:对规则的变动不能良好处理
- Kotlin编程之代理模式
- Java实现设计模式之适配器模式
- 搭建服务器(Tomcat,struts)
- 微擎模块安装文件manifest.xml
- struts2第十讲学习笔记,获取Servlet.api的两种方式
- Java中变量的说明,常量的表示方式,Java数据类型,个别运算符的说明
- Linux下守护进程编程c语言实例