顾名思义,决策树是典型的树形结构。树形结构都比较熟悉,由节点和边两种元素组成的结构。决策树(Decision Tree)利用树结构进行决策,每一个非叶节点是一个判断条件,每一个叶子节点是结论,从跟节点开始,经过多次判断得出结论。
下面通过一个决策树最典型的案例来说明决策树的工作原理。
相亲问题:
女儿:多大年纪了? 母亲:26。
女儿:长的帅不帅? 母亲:挺帅的。
女儿:收入高不? 母亲:不算很高,中等情况。
女儿:是公务员不? 母亲:是,在税务局上班呢。
女儿:那好,我去见见。
通过女儿的一系列问题,以及母亲的回答,最终定下来见或不见。这个女孩的决策过程就是典型的分类树决策。相当于通过年龄、长相、收入和是否公务员将男人分为两个类别:见和不见。假设这个女孩对男人的要求是:30岁以下、长相中等以上并且是高收入者或中等以上收入的公务员,我们通过决策树来进行判定。
女孩的决策过程我们可以看做上图的树结构,上图完整表达了这个女孩决定是否见一个约会对象的策略,其中绿色节点表示判断条件,橙色节点表示决策结果,箭头表示在一个判断条件在不同情况下的决策路径,图中红色箭头表示了上面例子中女孩的决策过程,通过一系列的判断条件,我们最终得到结论。
此时整理思路大家应该理解了,那么对于其他数据,我们如何进行决策树属性的选择是十分关键的,(对于上面相亲问题来说,我们为什么将年龄因素作为首要的判断条件???),也就是首先选哪个属性作为开始的判断条件,下面介绍决策树的属性选择。
构造决策树的关键性内容是进行属性选择度量,属性选择度量是一种选择分裂准则,是将给定的类标记的训练集合的数据划分“最好”地分成个体类的方法,它决定了拓扑结构及分裂点的选择。
ID3算法:在对决策树属性选择中我们使用ID3算法。
ID3算法是一种贪心算法,用来构造决策树。ID3算法起源于概念学习系统(CLS),以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续这个过程,直到生成的决策树能完美分类训练样例。(百度百科)
从信息论知识中我们知道,期望信息越小,信息增益越大,从而纯度越高。核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。还需引入熵的概念,熵是表示随机变量不确定性的度量,白话称为物体内部的混乱程度。
设D为用类别对训练元组进行的划分,则D的熵(entropy)表示为:
其中pi表示第i个类别在整个训练元组中出现的概率,可以用属于此类别元素的数量除以训练元组元素总数量作为估计。(等可能性思想)
熵的实际意义表示是D中元组的类标号所需要的平均信息量。现在我们假设将训练元组D按属性A进行划分,则A对D划分的期望信息为:
信息增益即为两者的差值 :
ID3算法就是在每次需要分裂时,计算每个属性的增益率,然后选择增益率最大的属性进行分裂
下面通过一个案例加以说明:
其中s、m和 l 分别表示小、中和大。设L、F、H和D表示日志密度、好友密度、是否使用真实头像和账号是否真实,下面计算各属性的信息增益。
因此日志密度的信息增益是0.276。用同样方法得到 H 和 F 的信息增益分别为0.033和0.553。因为F具有最大的信息增益,所以第一次分裂选择F为分裂属性。
注: 上图是因为划分属性F时,l与m对应的账号是否真实均为yes,所以只需要分析s的情况,如果l或m中有一个或者两个均为no,则同样需要进行同s的分析!
在上图的基础上,再递归使用这个方法计算子节点的分裂属性,最终就可以得到整个决策树。
sklearn简单实现决策树代码如下
from sklearn.datasets import load_iris
from sklearn import tree
iris = load_iris()
clf = tree.DecisionTreeClassifier()
clf = clf.fit(iris.data,iris.target)