本文参考如下两个来源,在下面的文章中没有一个完整的生成示例,在本人学习过程当中带来了不少的困惑,这篇文档展现一个完整的决策树的生成过程,但愿对学习过程当中的咱们有所帮助:算法
文章所使用的数据集以下,来源于《数据分析实战45讲》17讲中机器学习
天气 | 温度 | 湿度 | 刮风 | 是否打篮球 |
---|---|---|---|---|
晴 | 高 | 中 | 否 | 否 |
晴 | 高 | 中 | 是 | 否 |
阴 | 高 | 高 | 否 | 是 |
小雨 | 高 | 高 | 否 | 是 |
小雨 | 低 | 高 | 否 | 否 |
晴天 | 中 | 中 | 是 | 是 |
阴天 | 中 | 高 | 是 | 否 |
以上面的表格数据为例,好比咱们考虑要不要去打篮球,先看天气是否是阴天,是阴天的话,外面刮风没,没刮风咱们就去,刮风就不去。决策树就是把上面咱们判断背后的逻辑整理成一个结构图,也就是一个树状结构。学习
在决策树构造中有三个著名算法:ID三、C4.五、CART,ID3算法计算的是信息增益,C4.5计算使用的是增益率、CART计算使用的是基尼系数,下面简单介绍下其算法,这里也不要求彻底看懂,扫一眼有个印象就行,在后面的例子中有计算示例,回过头结合看应该就懂了。code
在信息论中,随机离散事件的出现的几率存在不肯定性,为了衡量这种信息的不肯定性,信息学之父香农引入了信息熵的概念,并给出了计算信息熵的数学公式。接口
Entopy(t)=-Σp(i|t)log2p(i|t)
信息增益指的是划分能够带来纯度的提升,信息熵的降低。它的计算公式是父亲节点的信息熵减去全部子节点的信息熵。信息增益的公式能够表示为:事件
Gain(D,a)=Entropy(D)- Σ|Di|/|D|Entropy(Di)
信息增益率 = 信息增益 / 属性熵。属性熵,就是每种属性的信息熵,好比天气的属性熵的计算以下,天气有晴阴雨,各占3/7,2/7,2/7:ip
H(天气)= -(3/7 * log2(3/7) + 2/7 * log2(2/7) + 2/7 * log2(2/7))
基尼系数在经济学中用来衡量一个国家收入差距的经常使用指标.当基尼指数大于0.4的时候,说明财富差别悬殊.基尼系数在0.2-0.4之间说明分配合理,财富差距不大.扩展阅读下基尼系数文档
基尼系数自己反应了样本的不肯定度.当基尼系数越小的时候,说明样本之间的差别性小,不肯定程度低.get
CART算法在构造分类树的时候,会选择基尼系数最小的属性做为属性的划分.数据分析
基尼系数的计算公式以下:
Gini = 1 – Σ (Pi)2 for i=1 to number of classes
下面是一个完整的决策树的构造生成过程,已完整开头所给的数据为例
在上面的列表中有四个属性:天气,温度,湿度,刮风.须要先计算出这四个属性的信息增益、信息增益率、基尼系数
数据集中有7条数据,3个打篮球,4个不打篮球,不打篮球的几率为4/7,打篮球的几率为3/7,则根据信息熵的计算公式能够获得根节点的信息熵为:
Ent(D)=-(4/7 * log2(4/7) + 3/7 * log2(3/7))=0.985
其数据表格以下:
天气状态 | 打篮球数量 | 不打篮球数量 | 总数 |
---|---|---|---|
晴 | 1 | 2 | 3 |
阴 | 1 | 1 | 2 |
小雨 | 1 | 1 | 2 |
若是将天气做为属性划分,分别会有三个叶节点:晴天、阴天、小雨,其中晴天2个不打篮球,1个打篮球;阴天1个打篮球,1个不打篮球;小雨1个打篮球,1个不打篮球,其对应相应的信息熵以下:
D(晴天)=-(1/3 * log2(1/3) + 2/3 * log2(2/3)) = 0.981 D(阴天)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0 D(雨天)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0
在数据集中晴天有3条数据,阴天有2条数据,雨天有2条数据,对应的几率为3/七、2/七、2/7,那么做为子节点的归一化信息熵为:
3/7 * 0.918 + 2/7 * 1.0 * 2/7 * 1.0 = 0.965
其信息增益为:
Gain(天气)=0.985 - 0.965 = 0.020
天气有三个选择,晴天有3条数据,阴天有2条数据,雨天有2条数据,对应的几率为3/七、2/七、2/7,其对应的属性熵为:
H(天气)=-(3/7 * log2(3/7) + 2/7 * log2(2/7) + 2/7 * log2(2/7)) = 1.556
则其信息增益率为:
Gain_ratio(天气)=0.020/1.556=0.012
其数据表格以下:
温度状态 | 打篮球数量 | 不打篮球数量 | 总数 |
---|---|---|---|
高 | 2 | 2 | 4 |
中 | 1 | 1 | 2 |
低 | 0 | 1 | 1 |
各状况的信息熵以下:
D(高)=-(2/4 * log2(2/4) + 2/4 * log2(2/4)) = 1.0 D(中)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0 D(低)=-(0/1 * log2(0/1) + 1/1 * log2(1/1)) = 0.0
做为子节点的归一化信息熵为:
4/7 * 1.0 + 2/7 * 1.0 * 1/7 * 0.0 = 0.857
其信息增益为:
Gain(温度)=0.985 - 0.857 = 0.128
属性熵为:
H(温度)=-(4/7 * log2(4/7) + 2/7 * log2(2/7) + 1/7 * log2(1/7)) = 1.378
则其信息增益率为:
Gain_ratio(温度)=0.128/1.378=0.0928
其数据表格以下:
湿度状态 | 打篮球数量 | 不打篮球数量 | 总数 |
---|---|---|---|
高 | 2 | 2 | 4 |
中 | 2 | 1 | 3 |
各状况的信息熵以下:
D(高)=-(2/4 * log2(2/4) + 2/4 * log2(2/4)) = 1.0 D(中)=-(2/3 * log2(2/3) + 1/3 * log2(1/3)) = 0.918
做为子节点的归一化信息熵为:
4/7 * 1.0 + 3/7 * 0.918 = 0.964
其信息增益为:
Gain(湿度)=0.985 - 0.964 = 0.021
属性熵为:
H(湿度)=-(4/7 * log2(4/7) + 3/7 * log2(3/7) = 0.985
则其信息增益率为:
Gain_ratio(湿度)=0.021/0.985=0.021
其数据表格以下:
刮风状态 | 打篮球数量 | 不打篮球数量 | 总数 |
---|---|---|---|
是 | 1 | 2 | 3 |
否 | 2 | 2 | 4 |
各状况的信息熵以下:
D(是)=-(2/3 * log2(2/3) + 1/3 * log2(1/3)) = 0.918 D(否)=-(2/4 * log2(2/4) + 2/4 * log2(2/4)) = 1.0
做为子节点的归一化信息熵为:
3/7 * 1.0 + 4/7 * 0.918 = 0.964
其信息增益为:
Gain(刮风)=0.985 - 0.964 = 0.021
属性熵为:
H(刮风)=-(4/7 * log2(4/7) + 3/7 * log2(3/7) = 0.985
则其信息增益率为:
Gain_ratio(刮风)=0.021/0.985=0.021
以下汇总全部接口,第一个为信息增益的,第二个为信息增益率的,第三个为基尼系数的。其中信息增益和信息增益率选择最大的,基尼系数选择最小的。从下面的结果能够获得选择为:温度
Gain(刮风)=0.985 - 0.964 = 0.021
Gain_ratio(刮风)=0.021/0.985=0.021
Gini(刮风)=(4/7) * 0.5 + (3/7) * 4/9 = 2/7 + 4/21 = 10/21 ~ 0.47619
肯定跟节点之后,大体的树结构以下,温度低能肯定结果,高和中须要进一步的进行分裂,从剩下的数据中再次进行属性选择:
其剩下的数据集以下,温度再也不进行下面的节点选择参与:
天气 | 温度(不参与这次分裂) | 湿度 | 刮风 | 是否打篮球 |
---|---|---|---|---|
晴 | 高 | 中 | 否 | 否 |
晴 | 高 | 中 | 是 | 否 |
阴 | 高 | 高 | 否 | 是 |
小雨 | 高 | 高 | 否 | 是 |
根据信息熵的计算公式能够获得子节点温度高的信息熵为:
Ent(D)=-(2/4 * log2(2/4) + 2/4 * log2(2/4)) = 1.0
其数据表格以下:
天气状态 | 打篮球数量 | 不打篮球数量 | 总数 |
---|---|---|---|
晴 | 1 | 1 | 2 |
阴 | 1 | 0 | 1 |
小雨 | 1 | 0 | 1 |
相应的信息熵以下:
D(晴天)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0 D(阴天)=-(1/1 * log2(1/1) + 0/1 * log2(0/1)) = 0.0 D(雨天)=-(1/1 * log2(1/1) + 0/1 * log2(0/1)) = 0.0
归一化信息熵为:
2/4 * 1.0 + 1/4 * 0.0 * 1/4 * 0.0 = 0.5
其信息增益为:
Gain(天气)=1.0 - 0.5 = 0.5
对应的属性熵为:
H(天气)=-(2/4 * log2(2/4) + 1/4 * log2(1/4) + 1/4 * log2(1/4)) = 1.5
则其信息增益率为:
Gain_ratio(天气)=0.5/1.5=0.33333
其数据表格以下:
湿度状态 | 打篮球数量 | 不打篮球数量 | 总数 |
---|---|---|---|
高 | 2 | 0 | 2 |
中 | 0 | 2 | 2 |
各状况的信息熵以下:
D(高)=-(2/2 * log2(2/2) + 0/2 * log2(0/2)) = 0.0 D(中)=-(0/2 * log2(0/2) + 2/2 * log2(2/2)) = 0.0
做为子节点的归一化信息熵为:
2/4 * 0.0 + 2/4 * 0.0 = 0.0
其信息增益为:
Gain(湿度)=1.0 - 0.0 = 1.0
属性熵为:
H(湿度)=-(2/4 * log2(2/4) + 2/4 * log2(2/4) = 1.0
则其信息增益率为:
Gain_ratio(湿度)=1.0/1.0=1.0
其数据表格以下:
刮风状态 | 打篮球数量 | 不打篮球数量 | 总数 |
---|---|---|---|
是 | 0 | 1 | 1 |
否 | 2 | 1 | 3 |
各状况的信息熵以下:
D(是)=-(0/1 * log2(0/1) + 1/1 * log2(1/1)) = 0 D(否)=-(2/3 * log2(2/3) + 1/3 * log2(1/3)) = 0.918
做为子节点的归一化信息熵为:
1/4 * 0.0 + 3/4 * 0.918 = 0.688
其信息增益为:
Gain(刮风)=1.0 - 0.688 = 0.312
属性熵为:
H(刮风)=-(1/3 * log2(1/3) + 2/3 * log2(2/3) = 0.918
则其信息增益率为:
Gain_ratio(刮风)=0.312/0.918=0.349
以下汇总全部接口,第一个为信息增益的,第二个为信息增益率的,第三个为基尼系数的。其中信息增益和信息增益率选择最大的,基尼系数选择最小的。从下面的结果能够获得选择为:湿度
Gain(刮风)=1.0 - 0.688 = 0.312
Gain_ratio(刮风)=0.312/0.918=0.349
Gini(刮风)=(1/4) * 0 + (3/4) * 4/9 = 1/3 = 0.333333
肯定跟节点之后,大体的树结构以下,选择湿度做为分裂属性后能直接肯定结果:
其剩下的数据集以下,温度再也不进行下面的节点选择参与:
天气 | 温度(不参与这次分裂) | 湿度 | 刮风 | 是否打篮球 |
---|---|---|---|---|
晴天 | 中 | 中 | 是 | 是 |
阴天 | 中 | 高 | 是 | 否 |
根据信息熵的计算公式能够获得子节点温度高的信息熵为:
Ent(D)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0
其数据表格以下:
天气状态 | 打篮球数量 | 不打篮球数量 | 总数 |
---|---|---|---|
晴 | 1 | 0 | 1 |
阴 | 0 | 1 | 1 |
相应的信息熵以下:
D(晴天)=-(1/1 * log2(1/1) + 0/1 * log2(0/1)) = 0.0 D(阴天)=-(0/1 * log2(0/1) + 1/1 * log2(1/1)) = 0.0
归一化信息熵为:
1/2 * 0.0 + 1/2 * 0.0 = 0
其信息增益为:
Gain(天气)=1.0 - 0 = 1.0
对应的属性熵为:
H(天气)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0
则其信息增益率为:
Gain_ratio(天气)=1.0/1.0=1.0
其数据表格以下:
湿度状态 | 打篮球数量 | 不打篮球数量 | 总数 |
---|---|---|---|
高 | 0 | 1 | 1 |
中 | 1 | 0 | 1 |
各状况的信息熵以下:
D(高)=-(0/1 * log2(0/1) + 1/1 * log2(1/1)) = 0.0 D(中)=-(1/1 * log2(1/1) + 0/1 * log2(0/1)) = 0.0
做为子节点的归一化信息熵为:
1/2 * 0.0 + 1/2 * 0.0 = 0
其信息增益为:
Gain(湿度)=1.0 - 0.0 = 1.0
属性熵为:
H(湿度)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0
则其信息增益率为:
Gain_ratio(湿度)=1.0/1.0=1.0
其数据表格以下:
刮风状态 | 打篮球数量 | 不打篮球数量 | 总数 |
---|---|---|---|
是 | 1 | 1 | 2 |
各状况的信息熵以下:
D(是)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0
做为子节点的归一化信息熵为:
1/1 * 1.0 = 1.0
其信息增益为:
Gain(刮风)=1.0 - 1.0 = 0
属性熵为:
H(刮风)=-(2/2 * log2(2/2) = 0.0
则其信息增益率为:
Gain_ratio(刮风)=0/0 = 0
以下汇总全部接口,第一个为信息增益的,第二个为信息增益率的,第三个为基尼系数的。其中信息增益和信息增益率选择最大的,基尼系数选择最小的。从下面的结果能够获得天气和湿度是同样好的,咱们随机选天气吧
Gain(刮风)=1.0 - 1.0 = 0
Gain_ratio(刮风)=0/0 = 0
Gini(刮风)=2/2 * 0.5 = 0.5
肯定跟节点之后,大体的树结构以下,选择天气做为分裂属性后能直接肯定结果:
在上面的步骤已经进行完整的演示,获得当前数据一个完整的决策树:
在构造的过程当中咱们能够发现,有可能同一个属性在同一级会被选中两次,好比上面的决策树中子节点温度高中都能选中温度做为分裂属性,这样是否合理?
完整的构造整个决策树后,发现整个决策树的高度大于等于属性数量,感受决策树应该是构造时间较长,但用于决策的时候很快,时间复杂度也就是O(n)
周志华的《机器学习》是本好书,极客专栏感兴趣的能够去看看