前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python决策树-1

python决策树-1

作者头像
bear_fish
发布2018-09-14 10:01:49
8550
发布2018-09-14 10:01:49
举报
文章被收录于专栏:用户2442861的专栏

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1338374

本文主要内容:

  1. 通过简单的示例说明决策树,以及决策树的定义
  2. 信息熵概念,以及决策树,树生成节点划分的依据。三种计算方法方法:
代码语言:txt
复制
- 1.信息增益(由ID3算法作为特征选取标准)
- 2.信息增益比/率(由C4.5算法作为特征选取标准)
- 3.基尼指数(由CART作为特征选取标准)树的生成ID3算法,C4.5算法算法python实现以及示例

决策树示例,以及决策树的定义

下图决策树预测贷款用户是否具有偿还贷款的能力,其中贷款用户主要具备三个属性:是否拥有房产,是否结婚,平均月收入。

每一个内部节点都表示一个属性条件判断,叶子节点表示贷款用户是否具有偿还能力(即类别)。 例如:用户甲没有房产,没有结婚,月收入5K。通过决策树的根节点判断,用户甲符合右边分支 (拥有房产为“否”);再判断是否结婚,用户甲符合左边分支(是否结婚为否);然后判断月收入是否大于 4k,用户甲符合左边分支 (月收入大于4K),该用户落在“可以偿还”的叶子节点上。所以预测用户甲具备偿还贷款能力。

定义(决策树)

分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)有向边(directed edge)组成。结点有两种类型:内部结点(internal node )和叶结点(leaf node)。内部结点表示一个特征或属性叶结点表示一个

分类过程

使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。


信息熵,决策树,树生成节点划分的依据

在信息论里面,熵(entropy)是信息不确定性的一个测度,熵越大则表示信息的不确定程度越高。这么说好像的确有点抽象,还是用公式解释吧:

这里H是熵,U可以理解为所有可能事件的集合,P(x)则是某一具体事件x发生的概率,对数的底一般取2。举个例子,预测明天的天气,如果能100%确定明天一定是晴天,那么熵就是-1*log1=0,也就是说不确定性为零。如果说明天有50%概率晴天,50%概率下雨,那么熵就是2*(-0.5)log0.5=2*(-0.5)(-1)=1,可以说不确定性为1。而如果明天有25%概率晴天,25%概率下雨,25%概率阴天,25%概率下雪,那么熵就是4*(-0.25)(log0.25)=2, 也就是说随着不确定程度的增加,熵也在不断地增大。 多少信息用信息量来衡量,我们接受到的信息量跟具体发生的事件有关。信息的大小跟随机事件的概率有关。越小概率的事情发生了产生的信息量越大,如四川发生地震了;越大概率的事情发生了产生的信息量越小,如太阳从东边升起来了(肯定发生嘛,没什么信息量)。这很好理解!

当随机变量只能取两个值,例如1,0即X的分布为:

P(X=1)=p, P(X=0)=1-p, 0<=p<=1

当p=0.5时,熵取值最大,随机变量不确定性最大(这个概率对我们”分类基本没什么用”)

计算增益,有三种方法:

  1. 信息增益(由ID3算法作为特征选取标准)
  2. 信息增益比/率(由C4.5算法作为特征选取标准)
  3. 基尼指数(由CART作为特征选取标准)
信息增益

首先说明下条件熵:

定义(信息增益(information gain))

信息增益表示的是:得知特征X的信息而使得类Y的信息的不确定性减少的程度。 具体定义如下: 特征A对训练数据集D的信息增益g(D,A)定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即g(D,A)=H(D)-H(D|A) 根据信息增益准则进行特征选择的方法是:对训练数据集D,计算其每个特征的信息增益,选择信息增益最大的特征。

信息增益算法:

输入:训练数据集D和特征A;

输出:特征A对训练数据集D的信息增益g(D,A)

(1)计算数据集D的经验熵H(D).

(2)计算特征A对数据集D的经验条件熵H(D|A).

(3)计算信息增益: g(D, A) = H(D) - H(D|A)

下面给出李航书中贷款申请判断的数据,以及计算示例。四个属性:

年龄: 0 -> 青年, 1 -> 中年, 2 -> 老年

有工作: 0 -> 否, 1 -> 是

有房子: 0 -> 否, 1 -> 是

信贷情况: 0 -> 一般, 1 -> 好, 2 -> 非常好

对应的Y类别0 -> 不能提供贷款, 1 -> 能提供贷款,

代码语言:javascript
复制
def get_loan_data_lh():
    x = np.array([
        [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2],
        [0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0],
        [0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0],
        [0, 1, 1, 0, 0, 0, 1, 1, 2, 2, 2, 1, 1, 2, 0]
    ])

    x = x.T
    y = np.array([0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0])
    return x, y

首先计算类别的经验熵:

对应的代码如下:

代码语言:javascript
复制
def _cal_class_entropy(self, y):
    num = len(y)
    print num  # 15
    unique_class, counter = np.unique(y, return_counts=True)
    print unique_class, counter
    # [0 1] [6 9]
    # calculate each class probability
    class_prob = [c * 1.0 / num for c in counter]
    print class_prob
    # [0.40000000000000002, 0.59999999999999998]
    print self._cal_entropy(class_prob)
    # 0.970950594455

def _cal_entropy(self, arr_prob):
    """
    for example  arr_prob like [0.5, 0.5]
    return -1 * 0.5 *log0.5 + -1 * 0.5 * log0.5 = 1
    """
    # -1 * sum(Pi * logPi)
    return np.sum(-1 * np.log2(arr_prob) * arr_prob)

def test_cal_class_entropy():
    from create_data import get_loan_data_lh
    X, Y = get_loan_data_lh()
    dt = DTree()
    dt._cal_class_entropy(Y)

树的生成ID3算法,C4.5算法


算法python实现以及示例

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017年12月08日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 决策树示例,以及决策树的定义
    • 定义(决策树)
      • 分类过程
      • 信息熵,决策树,树生成节点划分的依据
        • 信息增益
        • 树的生成ID3算法,C4.5算法
        • 算法python实现以及示例
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档