《决策树入门教程》


1 数学基础
    1.1  概率论入门

    1.2  Bootstrap抽样方法

    1.3  对数的深刻认识

    1.4  信息与信息熵

    1.5  偏差与方差

    1.6  信息增益

    1.7  基尼不纯度

2 决策树基础知识
    2.1  决策树概述

    2.2  ID3算法简介

    2.3  C4.5算法简介

    2.4  CART算法简介

C4.5算法简介

创建时间:2022-04-14 更新时间:2022-04-29 阅读次数:1467 次

C4.5算法简介

C4.5算法是用于生成决策树的一种经典算法,它是ID3算法的一种延伸和优化。C4.5算法对ID3算法主要做了以下改进:

  • 通过信息增益率选择分裂属性,克服了ID3算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足;
  • 能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理;
  • 构造决策树之后进行剪枝操作;
  • 能够处理具有缺失属性值的训练数据;

分裂属性的选择——信息增益率

分裂属性选择的评判标准是决策树算法之间的根本区别。区别于ID3算法通过信息增益选择分裂属性,C4.5算法通过信息增益率选择分裂属性。

关于信息增益以及信息增益率的计算,已经有详细介绍,请移步: 信息增益

通过C4.5算法构造决策树时,信息增益率最大的属性即为当前节点的分裂属性,随着递归计算,被计算的属性的信息增益率会变得越来越小,到后期则选择相对比较大的信息增益率的属性作为分裂属性。

C4.5算法应用实战

C4.5算法是ID3算法的一种延伸和优化,所以C4.5算法应用实战继续沿用 ID3算法 的数据集和代码,只需要做如下修改:

def choose_best_feature(dataSet):
    feature_num = len(dataSet[0]) - 1
    base_entropy = calculate_shannon_entropy(dataSet)
    best_info_gain = 0.0
    best_feature_index = -1
    for i in range(feature_num):
        feature_list = [data[i] for data in dataSet]
        unique_feature_value_set = set(feature_list)
        new_entropy = 0.0
        split_info = 0.0
        for value in unique_feature_value_set:
            subDataSet = split_dataset(dataSet, i, value)
            prob = len(subDataSet) / float(len(dataSet))
            new_entropy += prob * calculate_shannon_entropy(subDataSet)
            split_info -= prob * log(prob, 2)
        info_gain = (base_entropy - new_entropy) / split_info
        if info_gain > best_info_gain:
            best_info_gain = info_gain
            best_feature_index = i
    return best_feature_index

备注:所修订之处仅为第10行,第15行,第16行代码。

运行结果为:

连续型属性的离散化处理

对于决策树算法而言,当属性的值为离散型,无须对数据进行离散化处理;当属性的值为连续型,则需要对数据进行离散化处理。

C4.5算法可以实现对连续型数据的离散化处理,其核心思想是:将属性$feature$的$N$个属性值按照升序排列,然后通过二分法将属性$feature$的所有属性值分成两部分(共有$N-1$种划分方法,二分的阈值为相邻两个属性值的中间值),最后计算每种划分方法对应的信息增益,选取信息增益最大的划分方法的阈值作为属性$feature$二分的阈值。详细流程如下:

(1)将所有数据样本按照属性$feature$的值由小到大进行排列,得到属性$feature$的取值序列$(x_1,x_2,...,x_N)$。

(2)在序列$(x_1,x_2,...,x_N)$中共有$N-1$种二分方法,共产生$N-1$个分隔阈值。例如,对于第$i$种二分方法,其二分阈值为:$\theta_i=\frac{x_i+x_{i+1}}{2}$,此阈值将数据集划分为$2$个子数据集$(x_1,...,x_i),(x_{i+1},...,x_N)$,由此可以计算此种二分方法之后的信息增益。

(3)分别计算$N-1$种二分方法下的信息增益,选取信息增益最大的二分结果作为对属性$feature$的划分结果,并记录此时的二分阈值。

剪枝

由于决策树的建立完全依赖于训练样本,因此该决策树对训练样本能够产生完美的拟合效果。但是,这样的决策树对于测试样本来说过于庞大而复杂,可能产生较高的分类错误率,这种现象就称为“过拟合”。因此需要将复杂的决策树进行简化,即去掉一些节点解决过拟合问题,这个过程称为“剪枝”

剪枝方法分为预剪枝和后剪枝两大类。

预剪枝是在构建决策树的过程中,提前终止决策树的生长,从而避免过多的节点产生。预剪枝方法虽然简单但实用性不强,因为很难精确的判断何时终止树的生长。

后剪枝是在决策树构建完成之后,对那些置信度不达标的节点子树用叶子结点代替,该叶子结点的类标号用该节点子树中频率最高的类标记。

后剪枝方法又分为两种,一类是把训练数据集分成树的生长集和剪枝集;另一类算法则是使用同一数据集进行决策树生长和剪枝。

常见的后剪枝方法有CCP(Cost Complexity Pruning)、REP(Reduced Error Pruning)、PEP(Pessimistic Error Pruning)、MEP(Minimum Error Pruning)。

C4.5算法采用PEP(Pessimistic Error Pruning)剪枝法。PEP剪枝法由Quinlan提出,是一种自上而下的剪枝法,根据剪枝前后的错误率来判定是否进行子树的修剪,因此不需要单独的剪枝数据集。接下来详细介绍PEP(Pessimistic Error Pruning)剪枝法。

对于一个叶子节点,它覆盖了$n$个样本,其中有$e$个错误,那么该叶子节点的错误率为$\frac{(e+0.5)}{n}$,其中0.5为惩罚因子(惩罚因子一般取值为0.5)。

对于一棵子树,它有L个叶子节点,那么该子树的误判率为:

$$ ErrorRatio = \frac{\sum\limits_{i=1}^Le_i + 0.5L}{\sum\limits_{i=1}^Ln_i}$$

其中, $e_i$表示子树第$i$个叶子节点错误分类的样本数量, $n_i$表示表示子树第$i$个叶子节点中样本的总数量。

缺失属性值的处理

训练样本集中有可能会出现一些样本缺失了一些属性值,待分类样本中也会出现这样的情况。当遇到这样的样本集时该如何处理呢?

含有缺失属性的样本集会一般会导致三个问题:

(1)在构建决策树时,每一个分裂属性的选取是由训练样本集中所有属性的信息増益率来决定的。而在此阶段,如果训练样本集中有些样本缺少一部分属性,此时该如何计算该属性的信息増益率;

(2)当已经选择某属性作为分裂属性时,样本集应该根据该属性的值来进行分支,但对于那些该属性的值为未知的样本,应该将它分支到哪一棵子树上;

(3)在决策树已经构建完成后,如果待分类样本中有些属性值缺失,则该样本的分类过程如何进行。

针对上述因缺失属性值引起的三个问题,C4.5算法有多种解决方案。

面对问题一,在计算各属性的信息増益率时,若某些样本的属性值未知,那么可以这样处理:计算某属性的信息増益率时忽略掉缺失了此属性的样本;或者通过此属性的样本中出现频率最高的属性值,賦值给缺失了此属性的样本。

面对问题二,假设属性A已被选择作为决策树中的一个分支节点,在对样本集进行分支的时候,对于那些属性A的值未知的样本,可以送样处理:不处理那些属性A未知的样本,即简单的忽略它们;或者根据属性A的其他样本的取值,来对未知样本进行赋值;或者为缺失属性A的样本单独创建一个分支,不过这种方式得到的决策树模型结点数显然要増加,使模型更加复杂了。

面对问题三,根据己经生成的决策树模型,对一个待分类的样本进行分类时,若此样本的属性A的值未知,可以这样处理:待分类样本在到达属性A的分支结点时即可结束分类过程,此样本所属类别为属性A的子树中概率最大的类别;或者把待分类样本的属性A赋予一个最常见的值,然后继续分类过程。

C4.5算法优缺点分析

优点:

(1)通过信息增益率选择分裂属性,克服了ID3算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足;

(2)能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理;

(3)构造决策树之后进行剪枝操作;

(4)能够处理具有缺失属性值的训练数据。

缺点:

(1)算法的计算效率较低,特别是针对含有连续属性值的训练样本时表现的尤为突出。

(2)算法在选择分裂属性时没有考虑到条件属性间的相关性,只计算数据集中每一个条件属性与决策属性之间的期望信息,有可能影响到属性选择的正确性。

本教程共11节,当前为第10节!
本教程最新修订时间为:2023-02-03 09:43:25