周志华《机器学习》书中决策树学习基本算法的个人理解

# p74图4.2 决策树学习基本算法
输入:训练集D = {(x1, y1), (x2, y2), (x3, y3),..., (xm, ym)};
      属性集A = {a1, a2,..., ad}.
过程:函数TreeGenerate(D, A)
1: 生成结点node;
2: if D中样本全属于同一类别C then
3:       将node标记为C类叶节点; return;
4: end if
5: if A = NULL OR D中样本在A上取值相同 then
6:       将node标记为叶结点,令其类别标记为D中样本数最多的类; return;
7: end if
8: 从A中选择最优划分属性a*;
9: for a*中的每一个值a*v do
10:       为node生成一个分支,令Dv表示D中在a*上取值为a*v的样本子集;
11:       if Dv为空 then
12:             将分支结点标记为叶结点,其类别标记为D中样本最多的类; return;
13:       else
14:             以TreeGenerate(Dv, A\{a*})为分支结点
15:       end if
16: end for

根结点包含所有样本
递归结束的条件有:
第2行:当前结点所有样本属于同一类别(标记),无需划分,将当前结点标记为叶结点,类别为当前样本类别。
第5行:当前属性集为空,或是所有样本在所有属性上的取值相同,无法划分
一开始我很纳闷为啥会出现这种情况,仔细想了一下应该是训练样本中存在冲突数据(即特征向量完全相同但标记不同),冲突数据的判定测试序列(从根节点到每个叶结点的路径)完全相同,但是直至属性集划分为空或者当前结点下所有样本在所有属性上的取值相同时仍然无法进行类别划分。举个例子:假设西瓜有三个属性A,B,C,有两个训练样本在A,B,C上的取值完全相同,但是这两个样本最后的标记不同,一个为好瓜,另一个为坏瓜。这样在生成决策树时,这两个训练样本的判定测试序列完全相同,但是此时属性集已经为空,这两个样本还没有划分成为确定类别。于是就有了第6行的划分选择,将当前结点标记为叶结点并将其类别标记成D中样本数最多的类。
第11行:当前结点包含的样本集合为空,不能划分
当前训练集在当前最优属性的某一个属性取值上无样本,将该分支结点标记为叶结点,类别标记成D中样本最多的类(当然这只是一种处理方法,可以有其他合理的方法)。我当时的问题是,既然当前结点包含的样本集合为空,为什么不能删除该结点,而是要把它归为D中样本最多的类呢?答案是出现这种为空的情况只是当前训练样本集的情况,不能代表所有数据,如果某个待测试数据划分到当前结点时发现决策树没有这种情况岂不是很崩溃。

posted @ 2020-10-18 18:25  zdkk  阅读(237)  评论(0)    收藏  举报