决策树基本原理:基于信息增益、增益率与基尼系数的划分选择,预剪枝与后剪枝,多变量决策树以及决策树优缺点概述

本文深入浅出地介绍了决策树算法的基本流程、划分选择方法、剪枝优化策略等内容,并对比了不同划分标准的优劣,同时提供了详细的计算示例。

一、基本流程

决策树算法是数据挖掘分类算法中常见的一种方法。它以树状结构表现,叶子结点代表分类结果,内部结点描述一个属性,从上到下的一条路径,确定一条分类规则。
[1]谢妞妞.决策树算法综述[J].软件导刊,2015,14(11):63-65.

决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树。其名字由两部分构成,也代表了它的两个典型特点:

  • 决策:决策树具有可解释性,这在辅助决策方面非常有用,在实际的决策行为中,不仅需要知道最终结果,最好还能知道得出这样结果的原因和过程。
  • :树形结构有各种非常好的功能和特性,表达能力强。

决策树的一般过程的文字表述

(1)首先,创建结点 t t t,初始情况下训练集中所有样本都与结点 t t t 关联,记为 D t D_t Dt,将 t t t 记为当前结点。
(2)如果当前结点 t t t 中所有样本类别相同,则将该结点标记为叶子结点,并停止进一步分裂。接着处理其他非叶子结点。否则,进入下一步。
(3)为数据集 D t D_t Dt选择分裂属性和分裂条件,根据分裂条件将 D t D_t Dt 分裂为m个自己,为 t t t 创建m个子节点,将分裂出的m个数据集分别与这m个结点关联。依次将每个结点设为当前结点,转到(2)处理,直至所有结点都被标记为叶子结点。

结合下面这个非常简易的例子可以更直观地理解,现在要根据这个数据集构建决策树,以根据一个人的性别、年龄、婚姻等属性判断他的年收入是否大于50w。要注意的是,分类属性的选择并不是随意的,其中有各种判定规则,后续会进行介绍。另外,根据决策树的递归过程,在处理完t1,创建好t3、t4后,未处理的结点有t2、t3、t4,但下一个当前结点应是t3或t4,而不会是t2.

这样一棵树数创建好后,如果有一个人:男,27,已婚,就会被判定为年收入大于50w。不过这个例子是非常简易的,可以看到年龄属性根本没用到,而一个女性,无论其年龄如何,婚姻状态如何,都会被认为年收入大于50w,这显然是不合理的。从中也可以看出,决策树的构建和数据集本身的特性有很大关系。如果我们第一个分类属性选的是年龄,那会因为有三个年龄值而创建3个子节点吗?或者选择一个年龄界限,比如30岁以上和30岁以下,可是这个界限怎么选择才合理呢?这都是后面要解决的问题。


西瓜书中的算法表述:

输入:训练集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中样本最多的类; return13:       else
14:             以TreeGenerate(Dv, A\{
   
   a*})为分支结点
15:       end if
16: end for

显然,决策树的生成是一个递归过程,有三种情形导致递归返回

  • 1.当前结点所包含的样本都属于同一类别,无需划分
    • 做法: 将当前结点标记为叶结点,并令该类别为结点的类别
  • 2.所有的属性都已被使用,或所有样本在所有属性上取值相同,无法划分
    • 做法:将当前结点标记为叶结点,但将其类别设定为父结点所含样本最多的类别(利用当前结点的后验分布)
  • 3.当前结点包含的样本集合为空,不能划分
    • 做法:将当前结点标记为叶结点,但将其类别设定为父结点所含样本最多的类别(把父结点的样本分布作为当前结点的先验分布)

我一开始也很疑惑,第二和第三种情况为什么会出现。其实是这样的,如下图所示,李华和张宇所有的属性值都相同,但是年收入的分类却不同,属于第二章情况。这种情况有时候是由于脏数据,数据不一致导致的,而有时候是符合实际情况的,例如性别年龄婚姻都一样但年收入天差地别简直太正常了,这是数据本身的不完全。而第三种情况是这样,如果我们首先按性别划分,然后按婚姻划分,发现女性的子集里全都是未婚的。

注意上述代码块的第9、10行,在当前结点上,对于属性“婚姻”的每一个值,即"已婚/未婚",都要生产一个分支,所以在女性的子集中进一步划分“已婚”和“未婚”的样本子集。由于女性已婚是空集,该结点的类别标记为父结点中数量最多的那个。

也就是说,对当前结点按某一属性进行划分时,属性的取值集合是看整个数据集中所有样本的值,而不是只看当下的子集。否则,就不会有“女——已婚”的分支,那么如果测试数据中有一个女性已婚样本,决策树就无法做出判断。

9for a*中的每一个值a*v do
10:       为node生成一个分支,令Dv表示D中在a*上取值为a*v的样本子集;

二、划分选择

如何选择最优点划分属性?一般我们希望,决策树的分支结点所包含的样本尽可能属于同一类别,即结点的纯度(purity)越来越高。 所以,选择划分属性就是看:按照哪一个属性进行划分能使结点的纯度升高的程度最大。

1. 信息增益(ID3算法)

ID3算法是一个从上到下、分而治之的归纳过程。 ID3算法选择具有最高信息增益的属性作为测试属性。

首先,“纯度”要用什么指标来衡量呢?信息熵(information entropy) 是度量样本集合纯度最常用的一种指标。假定当前样本集合 D D D 中第k类样本所占的比例为 p k ( k = 1 , 2 , . . . , n ) p_k(k=1,2,...,n) pk(k=1,2,...,n) D D D 的信息熵定义为 E n t ( D ) = − ∑ k = 1 n p k l o g 2 p k Ent(D)=-\sum_{k=1}^np_klog_2p_k Ent(D)=k=1npklog2pk 注:
(1) p = 0 p=0 p=0,则 p l o g 2 p = 0 plog_2p=0 plog2p=0
(2) E n t ( D ) Ent(D) Ent(D) 最大为 l o g 2 n log_2n log2n,最小为 0。
(3) E n t ( D ) Ent(D) Ent(D)越小,则 D D D 纯度越高。

信息熵是怎么度量纯度的呢?集合纯度是怎么影响熵值变化的呢?了解“熵”的原始含义以及熵是如何引入信息论的将有助于进行理解。
1、从熵到信息熵,熵在不同领域的含义
2、熵的引入与各种不同的熵

假设数据集 D D D 中所有样本都是同一类别, E n t ( D ) = 0 Ent(D)=0 Ent(D)=0

如果有两个类别,且个数相等,则 E n t ( D ) = − 1 2 l o g 2 1 2 − 1 2 l o g 2 1 2 = 1 Ent(D)=-\dfrac{1}{2}log_2\dfrac{1}{2}-\dfrac{1}{2}log_2\dfrac{1}{2}=1 Ent(D)=21log22121log221=1

若每个样本都各自为一个类别,一共有n个类别,则 E n t ( D ) = n ( − 1 n l o g 2 1 n ) = l o g 2 n Ent(D)=n(-\dfrac{1}{n}log_2\dfrac{1}{n})=log_2n Ent(D)=n(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值