sklearn.tree

  • 决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。
  • 构造决策树的关键步骤是分裂属性,就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。分裂属性分为三种不同的情况:
    1.属性是离散值且不要求生成二叉决策树。此时用属性的每一个结果作为一个分支。
    2.属性是离散值且要求生成二叉决策树。此时使用属性划分的一个子集进行测试,按照“属于 此子集”和“不属于此子集”分成两个分支
    3.属性是连续值。此时确定一个值作为分裂点split_point,按照>split_point和<=split_point生成两个分支。

ID3

  • 决策树ID3算法的核心思想是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。
  • 熵度量了事物的不确定性,越不确定的事物,熵就越大。(如1/2,1/2 > 1/3, 2/3)

举例进行描述
Decision Trees

  • 现状态的信息熵(熵度量):
    Decision Trees

    • pi为 yes/no类别在整个训练元组中出现的概率
    • m即为2
  • 划分后的期望信息熵:
    Decision Trees
    如对日志密度进行划分:

    • v为3,D为10
    • Djs = 3
      Djl = 3
      Djm = 4
    • info(Djs) = -(1/3log(1/3) + 2/3log(2/3)) —即yes/no在s中出现的概率
      info(Djl) = -(1log(1))
      info(Djm) = -(1/4
      log(1/4) + 3/4*log(3/4))
  • 信息增益就是两者的差值:
    Decision Trees

  • ID3决策树算法就是在每次分裂的时候贪心选择信息增益最大的属性,作为本次树分裂属性,所谓信息增益最大,实际上就是对最后的输出影响最大。

实现

  1. 初始化信息增益的阈值ε
  2. 判断样本是否为同一类输出Di,如果是则返回单节点树T。标记类别为Di
  3. 判断特征是否为空,如果是则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别
  4. 计算A中的各个特征(一共n个)对输出D的信息增益,选择信息增益最大的特征Ag
  5. 如果Ag的信息增益小于阈值ε,则返回单节点树T,标记类别为样本中输出类别D实例数最多的类别。
  6. 否则,按特征Ag的不同值Agi将对应的样本输出D分成不同的类别Di。每个类别产生一个子节点。对应特征值为Agi。返回增加了节点的数T。
  7. 对于所有子节点,令D = Di ,A = A- {Ag}递归调用2-6步,得到子树Ti并返回。

ID3缺陷

  • ID3没考虑连续特征,比如长度,密度都是连续值
  • ID3用信息增益作为标准容易偏向取值较多的特征。然而在相同条件下,取值比较多的特征比取值少的特征信息增益大。(如:每个ID都对应一个类别)
  • ID3算法没考虑缺失值问题

C4.5

  • C4.5算法定义的分裂信息(和ID3类似):
    Decision Trees
  • 不同于ID3的信息增益,C4.5将其定义为信息增益率:
    Decision Trees
  • 选择最大增益率的属性来分裂。(特征数越多的特征对应的特征熵越大,它作为分母,可以校正信息增益容易偏向于取值较多的特征的问题)

C4.5将连续的特征离散化

  1. 将m个样本根据连续特征值从小到大排列。
  2. 取相邻两样本特征值的平均数,会得m-1个划分点。
  3. 对于这m-1个点,分别计算以该点作为二元分类点时的信息增益(不是信息增益率)。
  4. 选择信息增益最大的点作为该连续特征的二元离散分类点。(比如取到的增益最大的点为at,则小于at的值为类别1,大于at的值为类别2,这样就做到了连续特征的离散化。)

对于缺失值处理的问题

  • 将缺失特征的样本同时划分入所有的子节点,划分权重按各个子节点无缺失样本的数量比例来分配

C4.5缺陷

  • C4.5由于使用了熵模型,里面有大量的耗时的对数运算,如果是连续值还有大量的排序运算。
  • C4.5只能用于分类。
  • C4.5生成的是多叉树,相较二叉树运算效率低。

CART

分类树

  • CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,不纯度越低,特征越好。这和信息增益(比)相反。

  • 样本D的基尼系数表达式:
    Decision Trees
    样本D,个数为|D|,假设K个类别,第k个类别的数量为|Ck|

  • CART分类树算法每次仅对某个特征的值进行二分,而不是多分,这样CART分类树算法建立起来的是二叉树,而不是多叉树。

  1. CART分类树算法对连续值的处理:
    和C4.5类似,都是将连续的特征离散化。区别在于选择特征划分点时,C4.5是信息增益,CART是基尼系数
  2. CART分类树算法对离散值的处理:
    不停的二分离散特征。
  3. 二分没有将特征A的取值完全分开,后面还会对子节点特征划分有影响。在ID3或C4.5的一颗子树中,离散特征(连续特征二分除外)只会参与一次节点的建立。

建立实现(基尼系数的阈值,样本个数阈值)

  1. 对于当前节点的数据集为D,如果样本个数小于阈值或没有特征,则返回决策子树,当前节点停止递归。
  2. 计算样本集D的基尼系数,如果基尼系数小于阈值,则返回决策树子树,当前节点停止递归。
  3. 计算当前节点现有的各个特征的各个特征值对数据集D的基尼系数。
  4. 在计算出来的各个特征的各个特征值对数据集D的基尼系数中,选择基尼系数最小的特征A和对应的特征值a。根据这个最优特征和最优特征值,把数据集划分成两部分D1和D2,同时建立当前节点的左右节点,左节点的数据集D为D1,右节点的数据集D为D2。
  5. 对左右的子节点递归的调用1-4步,生成决策树。

回归树

  • 分类树的输出是样本的类别
    回归树的输出是一个实数。

  • 分类模型:采用基尼系数的大小度量特征各个划分点的优劣。
    回归模型:采用和方差度量,对于划分特征A划分点s两边的数据集D1和D2,使D1和D2各 自集合的均方差最小,同时D1和D2的均方差之和最小。

  • 分类树采用叶子节点里概率最大的类别作为当前节点的预测类别。
    回归树采用叶子节点的均值或者中位数来预测输出结果。

CART树缺陷

  • 选择一个最优的特征做分类决策,但大多数,分类决策不是由某一个特征决定,而是一组特征。
  • 样本一点点改动,树结构剧烈改变。
  • 比较复杂的关系,决策树很难学习

剪枝处理

  1. Overfitting
    噪音数据:训练数据中存在噪音数据,决策树的某些节点有噪音数据作为分割标准,导致决策树无法代表真实数据。
    缺少代表性数据:训练数据没有包含所有具有代表性的数据,导致某一类数据无法很好的匹配,这一点可以通过观察混淆矩阵(Confusion Matrix)分析得出。
    多重比较:决策树在每个变量的每一个值中选取一个作为分割点,所以选出一个噪音分割标准的概率是很大的。

  2. 停止
    决策树的构建过程是一个递归的过程,所以需要确定停止条件。
    一种最直观的方式是当每个子节点只有一种类型的记录时停止,但是这样往往会导致过拟合问题。
    另一种可行的方法是当节点中的记录数低于一个阀值时就停止分割,将max(P(i))对应的分类作为当前叶节点的分类。

  3. 前置裁剪 (prepruning)
    在构建决策树的过程时,提前停止。那么会将切分节点的条件设置的很苛刻,导致决策树很短小。结果就是决策树无法达到最优,实践证明这种策略无法得到较好的结果。

  4. 后置裁剪 (postpruning)
    决策树构建好后,然后才开始裁剪。采用两种方法:1)用单一叶节点代替整个子树,叶节点采用子树中最主要的分类;2)将一个子树完全替代另一个子树。后置裁剪问题在于计算效率的浪费。

  5. K-Fold Cross Validation
    计算出决策树T(训练数据集),N个叶节点。剪裁后剩余i个叶节点,i属于[1,N]。
    对每种可能的i,使用K-Fold Validataion方法(验证数据集)计算裁剪到i个节点后的决策树的错误率,最后求出平均错误率。
    用具有最小错误率对应的i作为最终决策树的大小,对原始决策树进行裁剪,得到最优决策树。

  6. Random Forest
    Random Forest是用训练数据随机计算出许多决策树,形成了一个森林。然后用这个森林对未知数据进行预测,选取投票最多的分类。

Decision Trees

相关文章: