决策树ID3详解(西瓜案例)

一、决策树

决策树(decision tree)是一种基本的分类与回归方法。一般情况下,回归方法可以转换为分类方法,因此,本文主要讨论用于分类的决策树。
首先如果是小白,推荐一个比较好的视频讲解,简单易懂。

机器学习经典算法——决策树与随机森林

建议先看这个视频,然后看懂如下案例

决策树主要算法有:ID3、C4.5、CART。以及进化后的C4.5算法C5.0、分类有极大提升的Tsallis等算法。这些算法的区别就在于选择最优特征的方式。但C5.0的核心原理与C4.5是相同的,它对于C4.5的改进在于计算速率,尤其是对于大数据,C4.5的速度非常慢,而C5.0对大数据运算效率极高。但C5.0一直是商用算法,之前一直未开源,但官方提供了可将C5.0构建的分类器嵌入到自己组织中的C源码。

二、决策树的构建策略

那么决策树的构建策略是什么的?
一句话:
随着树的深度增加,节点的熵迅速降低。熵降低的速度越快越好,这样我们有希望得到一颗高度最矮的决策树。

三、决策树之ID3生成算法

输入:训练数据集D和特征A
输出:特征A对训练数据集D的信息增益g(D,A)

(1)经验熵
经验熵公式
(2)经验条件熵
在这里插入图片描述
看不懂公式没关系,待会有例子直接秒懂!建议看了例子再回来回味下公式的含义哦。
(3)信息增益

info_gain(D,A) = H (X) - H (D | A)
简单来说就是我如果把A特征作为本次的根节点,那么熵则变化多少。

四、案例

(数据集在文章尾部给出)

import numpy as np
import pandas as pd
import math
data = pd.read_csv('./西瓜数据.txt')
data
# ID3

# 定义一个函数专门求解每一个特征的一种情况的熵
def info(x,y):
    if x != y and x != 0:
        # 计算当前情况的熵
        return -(x/y)*math.log2(x/y) - ((y-x)/y)*math.log2((y-x)/y)
    if x == y or x == 0:
        # 纯度最大,熵值为0
        return 0
info_D = info(8,17)
info_D

这里求得最开始的系统熵:0.9975025463691153

1.计算色泽的信息熵


# # 计算色泽的信息熵色泽信息增益: 
#      - 乌黑6 好瓜4   
#      - 青绿6 好瓜3
#      - 浅白5 好瓜1

# 计算每种情况的熵
seze_black_entropy = -(4/6)*math.log2(4/6)-(2/6)*math.log2(2/6)
seze_green_entropy = -(3/6)*math.log2(3/6)*2
seze_white_entropy = -(1/5)*math.log2(1/5)-(4/5)*math.log2(4/5)

# 计算色泽特征色信息熵
seze_entropy = (6/17)*seze_black_entropy+(6/17)*seze_green_entropy+(5/17)*seze_white_entropy
print(seze_entropy)
# 计算信息增益
info_D - seze_entropy

色泽的信息熵:0.88937738110375
选择色泽的信息增益:0.10812516526536531

2.计算根蒂的信息熵

# 查看根蒂的值得情况
data.根蒂.value_counts()
# 查看每种根蒂中好坏瓜情况的分布情况
print(data[data.根蒂=='蜷缩'])
print(data[data.根蒂=='稍蜷'])
print(data[data.根蒂=='硬挺'])
gendi_entropy = (8/17)*info(5,8)+(7/17)*info(3,7)+(2/17)*info(0,2)
gain_col = info_D - gendi_entropy
gain_col

选择根蒂的信息增益:0.14267495956679277

3.计算敲声的信息熵

# 查看敲声的值得情况
data.敲声.value_counts()
# 查看每种敲声中好坏瓜情况的分布情况
print(data[data.敲声=='浊响'])
print(data[data.敲声=='沉闷'])
print(data[data.敲声=='清脆'])
qiaosheng_entropy = (10/17)*info(6,10)+(5/17)*info(2,5)+(2/17)*info(0,2)
info_gain = info_D - qiaosheng_entropy
info_gain

选择敲声的信息增益:0.14078143361499584

4.计算纹理的信息熵

# 查看纹理的值得情况
data.纹理.value_counts()
# 查看每种纹理中好坏瓜情况的分布情况
print(data[data.纹理=="清晰"])
print(data[data.纹理=="稍糊"])
print(data[data.纹理=="模糊"])
wenli_entropy = (9/17)*info(7,9)+(5/17)*info(1,5)+(3/17)*info(0,3)
info_gain = info_D - wenli_entropy
info_gain

选择纹理的信息增益:0.3805918973682686

5.计算脐部的信息熵

# 查看脐部的值得情况
data.脐部.value_counts()
# 查看每种脐部中好坏瓜情况的分布情况
print(data[data.脐部=="凹陷"])
print(data[data.脐部=="稍凹"])
print(data[data.脐部=="平坦"])
qidai_entropy = (7/17)*info(5,7)+(6/17)*info(3,6)+(4/17)*info(0,4)
info_gain = info_D - qidai_entropy
info_gain

选择脐部的信息增益:0.28915878284167895

6.计算触感的信息熵

# 查看触感的值得情况
data.触感.value_counts()
# 查看每种脐部中好坏瓜情况的分布情况
print(data[data.触感=="硬滑"])
print(data[data.触感=="软粘"])
chugna_entropy = (12/17)*info(6,12)+(5/17)*info(2,5)
info_D - chugna_entropy

选择脐部的信息增益:0.006046489176565584

7. 结果分析

起始熵(前面已经计算过):0.9975025463691153

特征 信息熵 信息增益
色泽 0.88937738110375 0.10812516526536531
根蒂 0.8548275868023225 0.14267495956679277
敲声 0.8567211127541194 0.14078143361499584
纹理 0.6169106490008467 0.3805918973682686
脐部 0.7083437635274363 0.28915878284167895
触感 0.9914560571925497 0.006046489176565584

可以看到信息增益最大的特征是纹理这个特征,也就是说本次最优选择纹理作为根节点进行分类

然后继续上面的操作,遍历剩余的特征。

编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜
1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,0.697,0.46,2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,0.774,0.376,3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,0.634,0.264,4,青绿,蜷缩,沉闷,清晰,凹陷,硬滑,0.608,0.318,5,浅白,蜷缩,浊响,清晰,凹陷,硬滑,0.556,0.215,6,青绿,稍蜷,浊响,清晰,稍凹,软粘,0.403,0.237,7,乌黑,稍蜷,浊响,稍糊,稍凹,软粘,0.481,0.149,8,乌黑,稍蜷,浊响,清晰,稍凹,硬滑,0.437,0.211,9,乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,0.666,0.091,10,青绿,硬挺,清脆,清晰,平坦,软粘,0.243,0.267,11,浅白,硬挺,清脆,模糊,平坦,硬滑,0.245,0.057,12,浅白,蜷缩,浊响,模糊,平坦,软粘,0.343,0.099,13,青绿,稍蜷,浊响,稍糊,凹陷,硬滑,0.639,0.161,14,浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,0.657,0.198,15,乌黑,稍蜷,浊响,清晰,稍凹,软粘,0.36,0.37,16,浅白,蜷缩,浊响,模糊,平坦,硬滑,0.593,0.042,17,青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,0.719,0.103,

五、C4.5

1.ID3算法的缺陷

对于ID3算法,它存在以下问题:

  • 取值多的属性,更容易使数据更纯,其信息增益更大;
  • 训练得到的是一棵庞大且深度浅的树,这样的树是不合理的。

C4.5算法可以抑制ID3的上述缺点。

2.C4.5算法

C4.5算法改进了信息增益,它选用信息增益比来选择最优特征。
特征A对训练数据集D的信息增益比gR(D,A)定义为其信息增益g(D,A)与训练数据集D关于特征A的值的熵HA(D)之比,即
在这里插入图片描述
其中g( D, A)为本特征计算的信息增益
在这里插入图片描述
是训练数据集D关于特征A的值的熵

  • n是特征A取值的个
  • 其他部分与ID3算法完全相同。

最好是自己打一遍代码,能更好的体会决策树的构建过程。

需要代码可以评论留言我,代码是我在jupyter上写的。

可能写的不太好,希望大家能提提意见,共同进步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章