ID3还存在许多需要改进的地方,于是,Quinlan在1993年提出了ID3算法的改进版本C4.5。C4.5算法的核心思想与ID3完全一样,它与ID3算法不同的地方包括:
(1)划分度量采用增益率;
(2)能够处理数值属性;
(3)能够处理未知属性;
(4)采用 k 次迭代交叉验证来评估模型的优劣程度;
(5)提供了将决策树模型转换为If-then规则的算法。
1.增益率
信息增益趋向选择具有最大不同取值的属性。因为具有大量不同值的属性被选为分支属性后,能够产生许多小而纯的子集,会很明显地降低子女结点的不纯性,但这种属性很多时候不是一个具有预测性的属性。例如用户ID,根据这样的属性划分的子集都是单元集,对应的结点当然就是纯结点。即使在不太极端的情况下,也不希望产生大量输出的条件,因为与每个划分相关联的记录太少,以致不能够做出可靠的预测。
解决以上问题的方法有两种。一种方法是限制测试条件的划分个数,例如CART算法就限制测试条件只能二元划分;另一种方法是修改度量标准,把划分属性的输出数也考虑进去。Quinlan提出使用增益率来代替增益比例。
我们先来考虑训练数据集关于属性 A 的信息量(熵) SplitInfo ( A ),这个信息量与训练数据集的类别无关,计算公式如下:
假设,属性 A 的值将数据集 D 分成子集合 A 1 , A 2 ,…, A l ,那么式子中 x i 表示 A i 所包含的训练数据的个数, N 表示训练数据集的样本总数。训练数据集在属性 A 上的分布越均匀 SplitInfo ( A )的值越大。因此, SplitInfo ( A )可以用来衡量分裂属性数据的广度和均匀性。关于属性 A 的增益率计算如下:
如果某个属性产生了大量的划分,那么数据集关于该属性的信息量就会很大,从而降低了信息率。但是,当某个属性存在一个 x i ≈ N 时,它的 SplitInfo 将非常小,从而导致增益率异常大,为了解决此问题C4.5算法进行了进一步的改进,它计算每个属性的信息增益,只对超过平均信息增益的属性通过增益率来进一步比较选取。
2.处理有连续值的属性
C4.5算法处理具有连续值属性的方法如下:
(1)按照属性值对训练数据集进行排序;
(2)取当前样本的属性值和前一个样本属性值的中点作为一个阈值;
(3)按照步骤(1)中排好的顺序,依次改变当前样本的属性值,重复步骤(2);
(4)得到所有可能的阈值、增益、增益率。
如此,每个具有连续值的属性就会被划分为两个区间,大于阈值或者小于阈值。
3.对未知属性值的处理
C4.5算法在处理训练数据集时,若遇到未知属性值一般会采取以下方法之一:
(1)将未知值用最常用的值代替;
(2)将未知值用该属性所有取值的平均值代替;
(3)采用概率的办法,为未知属性值取每一个值赋予一个概率,这些概率的获取依赖于已知的属性值的分布,在建立决策树时将这些概率分配到子结点中去。
4. k 次迭代交叉验证
把数据分为大小相同的 k 份,每次运行,选择其中一份作为检验集,其余的全作为训练集,并重复 k 次该过程,使得每份数据都用于验证恰好一次。这么做可以使尽可能多的样本用于训练模型,从而更加接近原始样本的分布。另外,也可以减少随机因素对实验结果的影响。