[机器学习] 决策树1

决策树(decision tree)

理论

决策树就是用树状结构来进行分类的一种机器学习算法,是有监督学习的一种。以二分类学习为例子, 如果我们要对一个瓜是好瓜还是坏瓜进行分类, 通常要经过一系列决策。我们首先要判断“它是什么颜色的?”, 如果是青绿色,再判断“它的根蒂是什么形状的?”, 如果根蒂是蜷缩的,还要判断“敲击这个瓜的声音是浊响的么?”,如果是浊响的,那么判断为是好瓜。
这里写图片描述
一般的,一个决策树包括一个根结点,若干内部结点和若干叶结点;叶节点对应决策结果,其它结点则对应一个属性测试。从根结点到每个叶子结点的路径对应了一个测试判定序列。决策树学习的目的是为了产生一棵泛化能力强的决策树。基本原理遵循分而治之。

划分选择

一般的随着划分的不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的纯度(purity)越来越高。

信息增益

信息熵(information entropy)是度量样本集合纯度的最常用的一种指标,若变量的不确定性越大,那么信息熵越大。假设当前样本集合 D D 中第k类样本所占的比例 pk(k=1,2,...γ) p k ( k = 1 , 2 , . . . , γ ) , 则 D D 的信息熵为

Ent(D)=k=1γpklogpk

Ent(D)的值越小,则D的纯度就越高。

from math import log

def calcShannonEnt(dataset):
    num_entries = len(dataset)
    lable_counts = {}
    for feat_vec in dataset:
        current_label = feat_vec[-1]
        if current_label not in lable_counts.keys():
            lable_counts[current_label] = 0
        lable_counts[current_label] += 1
    shannon_ent = 0.0
    for key in lable_counts:
        prob = float(lable_counts[key]) / num_entries
        shannon_ent -= prob * log(prob, 2)
    return shannon_ent

def createDataset():
    dataSet = [[1, 1, 'yes'],
               [1, 1, 'yes'],
               [1, 0, 'no'],
               [0, 1, 'no'],
               [0, 1, 'no']]
    labels = ['no sufacing', 'flippers']
    return dataSet, labels

if __name__ == "__main__":
    dataSet, labels = createDataset()
    # dataSet[0][-1] = 'maybe'
    print(calcShannonEnt(dataSet))
  • 当我将main函数里的dataSet[0][-1] = ‘maybe’注释掉之后,我们的label共有两种可能性‘yes’ ‘no’。这是结果是: 0.9709505944546686

  • 当我解除注释, 我们的label有三种可能性:’yes’, ‘no’, ‘maybe’三种。此时结果是1.3709505944546687

  • 也就是说,分类的类数就越多,熵越大。

假设离散属性a有V个可能的取值{ a1,a2,...,av a 1 , a 2 , . . . , a v }, 若使用a来对样本集D进行划分,则会产生V个分支结点,其中第v个分支结点包含D中所有在属性a 上取值为 av a v 的样本, 记为 Dv D v .
这个如果看不懂可以看下面这个, 我用了一个例子带入进去,比较好理解。

——————————————————————————————————————————
假设一个银行贷款的案例,有三个特征分别是:1. 是否有房 2. 是否有工作 3. 年龄(青年,中年,老年)。分类的结果是准许贷款和不许贷款。

有房否有工作否年龄贷款/不贷款

年龄这个属性有3个可能的取值,青年,中年,老年。如果要用年龄这个属性对来对样本集D进行划分,则会产生3个分支结点。其中第一个分支记为 D1 D 1 ,包括的就是D中所有青年的数据集,第二个分支记为 D2 D 2 , 是D中所有中年的数据集, D3 D 3 包括所有D中老年的数据集。 我们可以根据上面公式计算出 Dv D v 的信息熵。再考虑到不同分支包含样本数不一样,给分支结点赋予权重 |Dv|/|D| | D v | / | D | 这句话的意思应该是比如我们的第一个结点是是否有房,有房的所有人都被批准了贷款,之后这部分人我们就不考虑他们了,我们只从没房的人里继续向下分析,可能没房的下一个结点就是年龄,此时没房的样本数目少于总体的样本数目)即样本数越多的分支结点的影响越大。
——————————————————————————————————————————

对于属性a(例如年龄)对样本集D进行划分所获得的信息增益(information gain)。

Gain(D,a)=Ent(D)v=1V|Dv||D|EntDv G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V | D v | | D | E n t D v

一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升”越大。

这里写图片描述

以上图为例,该数据集包括17个训练样例,用以学习一棵能预测没剖开的是不是好瓜的决策树。显然,分类结果的个数为 |γ|=2 | γ | = 2

  • 在决策树开始的时候,根结点包含D中所有样例,其中正例 p1=817 p 1 = 8 17 , 负例为 p2=917 p 2 = 9 17 ,于是计算根结点交叉熵:

    Ent(D)=k=12pklogpk=(817log817+917log917)=0.998 E n t ( D ) = − ∑ k = 1 2 p k l o g p k = − ( 8 17 l o g 8 17 + 9 17 l o g 9 17 ) = 0.998

  • 计算当前属性集合{色泽, 根蒂, 敲声, 纹理, 脐部, 触感}中每个属性的信息增益。以属性色泽为例,它有三个可能的取值:{青绿,乌黑,浅白}。若使用该属性对D进行划分,则可得3个子集,分别记为 D1(=绿),D2(=),D3(=) D 1 ( 色 泽 = 青 绿 ) , D 2 ( 色 泽 = 乌 黑 ) , D 3 ( 色 泽 = 浅 白 ) 。子集 D1 D 1 包含编号{1,4, 6,10,13,17} 的6个例子,其中正例占 p1=36 p 1 = 3 6 ,反例 p2=36 p 2 = 3 6 ; D2 D 2 包含编号{2,3, 7, 8,9, 15}的6个样例,其中正例占 p1=46 p 1 = 4 6 ,反例 p2=26 p 2 = 2 6 ; D3 D 3 包含编号{5,11,12,14,16}的5个样例。其中正例占 p1=15 p 1 = 1 5 ,反例 p2=45 p 2 = 4 5 ;

    Ent(D1)=(36log36+36log36)=1.0 E n t ( D 1 ) = − ( 3 6 l o g 3 6 + 3 6 l o g 3 6 ) = 1.0

    Ent(D2)=(46log46+26log26)=0.918 E n t ( D 2 ) = − ( 4 6 l o g 4 6 + 2 6 l o g 2 6 ) = 0.918

    Ent(D3)=(15log36+45log45)=0.722 E n t ( D 3 ) = − ( 1 5 l o g 3 6 + 4 5 l o g 4 5 ) = 0.722

  • 色泽的信息增益为:
    Gain(D,)=Ent(D)3v=1|Dv||D|EntDv G a i n ( D , 色 泽 ) = E n t ( D ) − ∑ v = 1 3 | D v | | D | E n t D v
    =0.998(6171.0+6170.918+5170.722)=0.109 = 0.998 − ( 6 17 ∗ 1.0 + 6 17 ∗ 0.918 + 5 17 ∗ 0.722 ) = 0.109

    类似的,我们也可以计算其它属性的信息增益:

Gain(D,)=0.143,Gain(D,)=0.141 G a i n ( D , 根 蒂 ) = 0.143 , G a i n ( D , 敲 声 ) = 0.141

Gain(D,)=0.381,Gain(D,)=0.289 G a i n ( D , 纹 理 ) = 0.381 , G a i n ( D , 脐 部 ) = 0.289

Gain(D,)=0.006 G a i n ( D , 触 感 ) = 0.006
属性纹理的信息增益最大,故它被选为划分属性。
这里写图片描述
然后决策树算法,对每个分支结点做进一步划分。

增益率

如果把编号那一列也作为一个候选划分属性,可算出他的信息增益为0.998,远大于其它候选划分。理解起来就是编号会产生17个分支,每个分支结点仅仅包含一个样本,这些分支结点的纯度已达到最大,然而这样的决策树显然不具有泛化能力,无法对新样本进行有效预测。

实际上,信息增益的准则对可取值数目较多的属性有偏好, 为减少这种偏好可能带来的不利影响,著名的C4.5决策树算法不直接用信息增益,而是使用增益率来选择最优划分属性,增益率为:

GainRatio(D,a)=Gain(D,a)IV(a) G a i n R a t i o ( D , a ) = G a i n ( D , a ) I V ( a )

IV(a)=i=1VDvDlogDvD I V ( a ) = − ∑ i = 1 V D v D l o g D v D

IV(a) 称为属性a的固有值。 属性a可能取值数目越多(V越大),IV(a)的值通常会越大。例如:IV(触感)=0.874 (V=2), IV(色泽)=1.580 (V=3), IV(编号)= 4.088 (V=17)

需要注意的是增益率准则对可取数值数目较小的属性有所偏好,因此C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性, 再从中选择增益率最高的。

实践

决策树的构造

优点:计算法复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。

缺点:可能产生过度匹配问题

适用数据类型:
数值型(数值型目标变量则可以从无限的数值集合中取值,如0.100,42.001等 (数值型目标变量主要用于回归分析))
标称型(标称型目标变量的结果只在有限目标集中取值,如真与假(标称型目标变量主要用于分类))。

决策树的一般流程

  1. 收集数据: 可以用任意方法。
  2. 准备数据: 树构造算法只适用于标称型数据,因此数值型数据必须离散化
  3. 分析数据: 可以使用任意方法,构造树完成之后,我们应该检查图形是否符合预期。
  4. 训练算法: 构造树的数据结构
  5. 测试算法: 使用经验树计算错误率
  6. 使用算法: 此步骤可以用于任何监督学习算法, 而使用决策树可以更好的理解数据的内在含义。

未完待续,下一篇链接

参考资料

机器学习(周志华)
机器学习实战
数学之美

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值