决策树相关知识小结
2017-08-08 14:30
459 查看
前言
本文是一篇关于决策树方面知识的小结,不包含具体的例子(想看例子推荐文献[1]的第4章),主要总结了ID3、C4.5和CART树三者的区别,剪枝处理,连续值和缺失值的处理。决策树的基本算法
决策树的学习目的是为了产生一颗泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循“分治”的策略,基本算法如下所示:***********************输入******************** 训练集 D={(x1,y1),(x2,y2),...,(xm,ym)} x中有 (col1,col2,...,colk) 共k组特征 每个col下有相应的属性值(a1,a2,...,ap) y中有 (l1,l2,...,ln) 共n种类标签 ***********************过程******************** if 数据集中的每个子项属于同一分类 then return 类标签 else 寻找划分数据集的最好特征* 划分数据集 创建分支结点 for 每个划分的子集 递归调用该函数并增加返回结果到分支结点中 end for return 分支结点 end if ***********************输出******************** 一颗决策树
其中,最为重要的是“寻找划分数据集的最好特征”这一步(我特意打上了*号),这也是不同算法的区别所在。
ID3、C4.5和CART的区别
ID3算法
在划分数据集的过程当中,我们希望决策树的分支结点所包含的样本尽可能地属于同一类别,即结点的纯度越来越高。在ID3算法中,利用了信息增益这一准则来划分数据集,要了解信息增益,首先要知道信息熵的概念。信息熵是度量样本集合纯度最常用的一项指标。假设当前样本D的第k类样本所占的比例为pk(k=1,2,...,n),则,D的信息熵定义为
Ent(D)=−∑nk=1pk⋅log2pk
En(D)的值越小,D的纯度就越高。
假定特征col有V个可能的取值{a1,a2,...,aV},若使用col来对样本集D划分,则会划分成V个子集,其中以av划分出来的子集,记为Dv,那么信息增益可以表示为
Gain(D,col)=Ent(D)−∑Vv=1|Dv||D|Ent(Dv)
其中,|D|表示数据集中的样本个数。
ID3就是使用信息增益最大为准则来划分数据集的,计算出每个col下的Gain(D,col),然后选择值最大的那一个。
但这样的做法为偏袒于属性数量较多的特征,即V较大的col,为解决这个问题,就有了C4.5算法。
C4.5算法
与ID3算法不同,C4.5是利用增益率来进行划分的,其定义如下:Gain_ratio(D,col)=Gain(D,col)IV(col)
其中
IV(col)=−∑Vv=1|Dv||D|log2DvD
IV(col)称为特征col的固有值,特征col的属性越多,IV(col)的值就越大。
这样一来就可以解决ID3的弊端,然而,值得注意的是,增益率准则对属性值数目较少的特征有所偏好,故C4.5并不是直接取增益率最大的特征来划分数据集的,而是采用了一种启发式的方法:先从数据集中找出信息增益高于平均水平的特征,然后从中选择增益率最高的。
CART算法
CART则采用了基尼指数来划分属性,数据集D的纯度可以用基尼值来度量:Gini(D)=∑nk1=1∑nk1!=k2pk1pk2=1−∑nk=1p2k
基尼值反应了从数据集中随机抽取两个样本,其类标签不一致的概率,因此基尼值越小,数据集的纯度越高。
特征col的基尼指数定义为
Gini_index(D,col)=∑Vv=1|Dv|DGini(Dv)
CART就是选择划分后基尼指数最小的特征为最优划分特征的。
剪枝
剪枝是解决过拟合问题的重要手段,主要分为“预剪枝”和“后剪枝”两种。在剪枝的时候我们要引入验证集用来帮助我们判断是否需要剪枝。预剪枝
预剪枝是边生成决策树边剪枝的一种做法。基于信息增益准则或者增益率准则或者基尼指数,我们会选出最优的特征来进行数据集的划分,这个时候预剪枝做的就是判断划分前后,验证集的精度是否会提高,如果提高的话就进行划分,否则不进行划分,也就是剪枝了。预剪枝可以降低过拟合的风险,而且还显著减少了决策树的训练时间开销和测试时间开销。
不过,预剪枝是一种贪心的做法,有些划分可能在当前不能提高性能,但在之后的划分中可以显著提高决策树的性能,所以预剪枝有着欠拟合的风险。
后剪枝
后剪枝是先生成一颗完整的决策树,然后自底向上地进行剪枝,判断某个分支结点替换为叶子结点后是否会提高验证集的精度,可以提高则将分支结点替换为叶子结点,否则不替换。后剪枝比预剪枝保留了更多的分支,欠拟合的风险很小,泛化性能也往往优于预剪枝。但后剪枝的训练时间开销要比预剪枝大得多。
连续值的处理
以上讨论的都是针对离散特征进行处理的,如果遇到了属性为连续值的特征,往往采用二分法进行处理。给定样本集D和连续特征col,假定在col上出现了m个不同的取值,将这些值从小到大进行排序,即为{a1,a2,...,am}。基于划分点t可将D划分为子集D−t和D+t,其中D−t中包含了在特征col上取值小于t的样本,而D+t中包含了在特征col上取值不小于t的样本,t的取值属于集合
Ta={ai+ai+12|1≤i≤m−1}
之后可以基于不同的t值进行数据集划分,选择使得信息增益准则或者增益率准则最大,或者基尼指数最小的t作为划分点。
缺失值的处理
现实数据中往往会遇到不完成的样本,即样本的某些值有缺失,这时候如果放弃该样本不用则太过浪费,所以一般做如下处理。给定训练集D和特征col,令D^表示在特征col上没有缺失值的样本子集。我们给每个样本x赋予一个权重wx,并定义
ρ=∑x∈D^wx∑x∈Dwx
不难看出,对于特征col,ρ表示无缺失值样本所占的比例。这样一来,比如信息增益就可以推广为
Gain(D,col)=ρ⋅Gain(D^,col)
其它的准则也可以用类似的方法进行转换。
结束语
以上是对决策树部分知识的小结。如有不足,还请指正~参考文献
[1] 周志华. 机器学习 : = Machine learning[M]. 清华大学出版社, 2016.[2] Peter Harrington. 机器学习实战[M]. 人民邮电出版社, 2013.
相关文章推荐
- volatile与synchronized 相关知识小结
- 针对web阶段http相关知识小结
- 【C语言】【指针相关知识小结】
- perl 调试命令的相关知识小结
- JSONP相关知识小结
- 无线路由器相关知识小结
- JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
- java中数组的相关知识小结(推荐)
- Mitchell机器学习-决策树学习中信息论的相关知识
- 【C语言】【指针相关知识小结】
- 8583报文相关(知识小结)
- 数组相关知识小结
- 数组的相关知识个人小结
- JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
- Python3中的列表,元组,字典,字符串相关知识小结
- ssh相关知识小结
- c运算符优先级相关知识小结
- JVM相关知识小结
- C++中指针的数据类型和运算相关知识小结
- JVM相关知识小结