决策树

  • 决策树
    决策树是一种基本的分类与回归方法,它是一种树形模型。一般的,一颗决策树包含一个根节点、若干个内部节点和若干叶子节点,每个内部节点对应一个属性,每个叶子节点对应一种类别。决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的剪枝。

  • 特征选择
    特征选择在于选择对训练数据具有分类能力的特征。通常特征选择的准则是信息增益或信息增益比。


    • 在信息论与概率统计中,熵(entropy)是表示随机变量不确定性的度量。随机变量 X 的熵定义为
      H(X)=inpilogpipi
    • 条件熵
      条件熵 H(Y|X) 表示已知随机变量 X 的条件下随机变量Y的不确定性。随机变量 X 给定的条件下随机变量Y的条件熵记作 H(Y|X) ,定义为 X 给定条件下Y的条件概率分布的熵对 X 的数学期望
      H(X|Y)=i=1npiH(Y|X=xi)(pi=P(X=xi),i=1,2,,n)
    • 信息增益
      特征 A 对训练数据集D的信息增益 g(D,A) ,定义为集合 D 的经验熵H(D)与特征 A 给定条件下D的经验条件熵 H(D|A) 之差,即
      g(D,A)=H(D)H(D|A)

      根据信息增益准则的特征选择方法是:对训练数据集(或子集) D ,计算每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。著名的ID3决策树学习算法就是以信息增益为准则来选择划分属性。信息增益准则对可能取值数目较多的属性有所偏好。
    • 信息增益比
      特征A对训练数据集 D 的信息增益比gR(D,A)定义为其信息增益 g(D,A) 与训练数据集 D 关于A的值的熵 HA(D) 之比,即
      gR(D,A)=g(D,A)HA(D)

      其中,
      HA(D)=i=1n|Di||D|log2|Di||D|,nA

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


输入: 训练集 D=(x1,y1),(x2,y2),,(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=ϕ   OR    D 中样本在A取值相同 then
6:   将node标记为叶节点,其类别标记为 D 中样本数最多的类;return
7: endif
8:从A中选择最优划分属性 a ;
9: for a 的每一个值 av do
10:   为node生成一个分支;令 Dv 表示 a 上取值为 av 的样本子集;
11:    if Dv 为空 then
12:      将分支节点标记为叶节点,其类别标记为 D 中样本最多的类; return
13:    else
14:      以TreeGenerate(Dv,Aa)为分支节点
15:    endif
16: endfor
输出:以node为根节点的一颗决策树


显然决策树的生成是一个递归过程。决策树学习的关键是第8行,即如何选择最优划分属性。可利用上文提到的信息增益和信息增益率准则来划分。

  • 决策树的剪枝
    决策树的剪枝可通过损失函数或代价函数来实现,定义为

    Ca(T)=C(T)+α|T|

    C(T) |T| 为数 T 的叶节点个数,表示模型的复杂度,参数α0控制两者间的影响。

  • 代码测试

     import numpy as np
     from sklearn.model_selection import train_test_split
     from sklearn.pipeline import Pipeline
     from sklearn.preprocessing import StandardScaler
     from sklearn.tree import DecisionTreeClassifier
     depth = np.arange(1, 10)
    for d in depth:
        model = Pipeline([
            # 归一化特征
            ('ss', StandardScaler()),
            # Supported criteria are "gini" for the Gini impurity
            # and "entropy" for the information gain.
            ('DTC', DecisionTreeClassifier(criterion='entropy', max_depth=d))
        ])
        model = model.fit(xtrain, ytrain)
        ytestHat = model.predict(xtest)
        result = (ytestHat == ytest)
        accuracy = np.mean(result)
        print(d, ' depth 准确率: %.4f%%' % (100 * accuracy))
    • 输出
    1  depth 准确率: 60.0000%
    2  depth 准确率: 95.5556%
    3  depth 准确率: 95.5556%
    4  depth 准确率: 95.5556%
    5  depth 准确率: 95.5556%
    6  depth 准确率: 95.5556%
    7  depth 准确率: 95.5556%
    8  depth 准确率: 95.5556%
    9  depth 准确率: 95.5556%
  • 补充

    • 参考
      [1] 李航.统计学习方法
      [2] 周志华.机器学习
    • 代码数据来源
      iris
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值