引、
最近老师布置了课堂展示的作业,主题是决策树,老师还举了买西瓜的决策例子,感觉贴近生活也很有意思。在这之前没有了解过这个概念,通过几个礼拜的学习收获不少。
一、
首先,什么是决策树?
百度百科:决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。
个人而言,决策树就是将人在做决策时的思维脉络以树的形式展示出来的产物,即决策的过程模型。
这是一棵去不去打高尔夫球的决策树:
有Outlool、Humidity、Windy三个属性,每条路径代表不同的情况。Outlook下面的Sunny、Overcast和Rainy就是Outlook的三个分支。
在这棵决策树里,我们首先考虑天气,如果是Overcast,就选择Yes。如果是Sunny,就在看看humidity然后根据其是否<=75决定Yes or No。是Rainy的话就考虑Windy。
最后就得到了,打不打高尔夫球的决策结果。
这时就要先说明一下,其实上面的决策树是通过一个数据集生成的,给出数据集:
二、
那么问题来了,为什么我们要首先考虑天气情况而不是考虑湿度或者风力情况呢?
接下来就引入一个概念,属性选择度量---意思是说如何选择哪个属性做为首先考虑。目前比较流行的三个指标是信息增益,信息增益比还有Gini指数。他们分别对应了三种算法。
信息增益对应了ID3算法,是J.Ross.Quinlan提出的。
(1)信息增益:
计算对结果中分类的期望,也称为熵。对“Play Golf?”这一栏的计算。
然后是按某个属性分类所需要的信息量:分别计算Outlook、Humidity和Windy三列。
两个相减就是信息增益:
选择信息增益最高的一个属性进行分裂。
下面我们用SNS社区中不真实账号检测的例子(例子转自EricZhang's Tech Blog)说明如何使用ID3算法构造决策树。为了简单起见,我们假设训练集合包含10个元素:
设L、F、H和R表示日志密度、好友密度、是否使用真实头像和账号是否真实,下面计算各属性的信息增益。
Info(D)=-0.7log0.7-0.3log0.3=0.879
infoL(D)=0.3(-0/3log0/3-3/3log3/3)+0.4*(-1/4log1/4-3/4log3/4)+0.3*(-1/3log1/3-2/3log2/3)=0.603
Gain(L)=info(D)-infoL(D)=0.276u因此日志密度的信息增益是0.276。
用同样方法得到H和F的信息增益分别为0.033和0.553。
在上图的基础上,再递归使用这个方法计算子节点的分裂属性,最终就可以得到整个决策树。上面为了简便,将特征属性离散化了,其实日志密度和好友密度都是连续的属性。
但是ID3算法有缺陷,就是对算法倾向于选择分支情况多的属性作为分裂,但是这样的分类可能毫无意义。比如增加一个ID栏,值从1到10,那么计算结果信息增益是最高的,但是这样的分类毫无实际用处。
为此,Quinlan提出了升级版算法C4.5。对应的属性选择度量是信息增益比。
(2)信息增益比:
信息增益率使用“分裂信息”值将信息增益规范化。分类信息类似于Info(D):
这个值表示通过将训练数据集D划分成对应于属性A测试的v个输出的v个划分产生的信息。
信息增益率定义:
选择信息增益比最大的属性作为分裂。
上面去不去打高尔夫的决策树,就是通过C4.5算法来生成的。
(3)
由于作者比较懒,就不写上Gini指标的相关资料了。但是原理是一样的,只是计算的指标不同。
三、
提到决策树,就不得不提到剪枝。
简单介绍一下:
当我们生成一棵决策树时,我们是通过给定的训练集来生成的,但是生成之后给了新的数据集之后,这棵决策树可能就会犯错。为什么呢,因为我们给的训练集不能完全包括所有情况,是片面的。而算法对每个属性都进行了计算,那么就会导致决策树考虑了一下没那么重要的属性,就会导致“过度拟合”。于是我们既要给决策树“剪枝”。
顾名思义,剪枝就是对决策树进行修改,改变它的结构或高度。方法有两种:
1、 预先剪枝。也就是预先规定一个标准,让决策树生成到这个标准的时候就不再继续生长了。但是这样也可能会导致遇到更好的属性却不能归到决策树中。标准有很多,比如复杂度,高度等等。
2、后剪枝。在决策树生成之后,对其结点进行评估,若删掉这个结点决策树的准确率高了,那么就可以剪掉。
最后:
由于学习的时间不长,也没有深入探究。有很多地方说的不够清楚和全面。若有不对或建议,欢迎指正和提出。
本文出自 “Sunny” 博客,请务必保留此出处http://qmkkd.blog.51cto.com/9511687/1786100