决策树构建过程:
1、将所有训练数据集放在根节点上;
2、遍历每种属性的每种分割方式,找到最好的分割点;
3、根据2中最好的分割点将根节点分割成多个子节点(大于等于2个);
4、对剩下的样本和属性重复执行步骤2、3,直到每个子节点中的数据都属于同一类为止。
C4.5算法:
C4.5算法是采用信息增益率来进行节点的分裂的,公式为:,
其中,
,
而,
,并且要求信息增益率越大越好。
下面举例具体计算,如下图为各种天气下是否打高尔夫球的表格。
Day | Outlook | Temperature | Humidity | Windy | Play Golf |
1 | Sunny | 85 | 85 | F | N |
2 | Sunny | 80 | 90 | T | N |
3 | Overcast | 83 | 78 | F | Y |
4 | Rainy | 70 | 96 | F | Y |
5 | Rainy | 68 | 80 | F | Y |
6 | Rainy | 65 | 70 | T | N |
7 | Overcast | 64 | 65 | T | Y |
8 | Sunny | 72 | 95 | F | N |
9 | Sunny | 69 | 70 | F | Y |
10 | Rainy | 75 | 80 | F | Y |
11 | Sunny | 75 | 70 | T | Y |
12 | Overcast | 72 | 90 | T | Y |
13 | Overcast | 81 | 75 | F | Y |
14 | Rainy | 71 | 80 | T | N |
步骤1:将所有的节点放在根节点上,计算此时根节点的信息熵为:
步骤2:遍历每种属性的每种分割方式,先看Outlook属性,它有三种取值Sunny, Rainy, Overcast,
故,
故按照Outlook属性分裂的话信息增益为:
而Outlook属性本身的分裂信息熵为:
故最终的信息增益率为:
接下来计算Humidity的信息增益率。因为Humidity为连续型的属性,故其计算方法相对于离散型的属性计算会复杂很多。
对于Humidity属性,我们先对其进行升序排列如下:
Day | Humidity | Play Golf |
7 | 65 | Y |
6 | 70 | N |
9 | 70 | Y |
11 | 70 | Y |
13 | 75 | Y |
3 | 78 | Y |
5 | 80 | Y |
10 | 60 | Y |
14 | 80 | N |
1 | 85 | N |
2 | 90 | N |
12 | 90 | Y |
8 | 95 | N |
4 | 96 | Y |
然后就是选取分裂节点,那么对于连续型属性,它的分裂节点是任意相邻的两个取值的中点,我们从第一个开始,取65和70的加权均值:,解释一下,对于65和70这两个数值,
因为65只有一个,70有3个,所以分别乘以1/4和3/4,然后在计算按68.75来分裂的信息熵:
再选取第二个分裂点:
同理可得所有的分裂点的信息熵:
分裂点 | 68.75 | 71.25 | 76.5 | 79.5 | 81.25 | 88.333 | 91.667 | 95.5 |
信息熵 | 0.893 | 0.925 | 0.895 | 0.850 | 0.838 | 0.915 | 0.930 | 0.893 |
由表可知,节点81.25作为分裂节点时,其信息熵最小,所以信息增益最大,故将此节点作为分裂点。这里用信息增益最大而不是信息增益率最大作为连续型属性分裂节点的评判标准,
是为了防止连续型属性每个取值都对应了一个样本,这样的分裂信息熵就最大了。对于分裂点81.25,其对应的信息增益率的计算如下:
同理对于属性Temperature也是如上的操作,先排序,再算信息熵,结果如下:
分裂点 | 64.5 | 66.5 | 68.5 | 69.5 | 70.5 | 71.667 | 73.5 | 76.667 | 80.5 | 82 | 84 |
信息熵 | 0.893 | 0.93 | 0.94 | 0.925 | 0.895 | 0.939 | 0.939 | 0.915 | 0.94 | 0.93 | 0.827 |
其信息增益率为:
最终得到所有的属性的信息增益率为:
属性 | Outlook | Windy | Humidity | Temperature |
信息增益率 | 0.156 | 0.049 | 0.109 | 0.305 |
选取信息增益率最大的Temperature属性作为分裂属性,分类结果如下:
对于Temperature <=84的节点继续进行分裂,只不过分裂的时候去掉Temperature属性以及Temperature>84的节点里的样本,重复上面步骤。