(系列笔记)7.决策树(下)

决策树——告诉你Hello Kitty是人是猫(案例)

1、背景

2014年8月,研究 Hello Kitty 多年的人类学家 Christine R. Yano 在写展品解说时,却被 Hello Kitty 持有商三丽鸥纠正:Hello Kitty 是一个卡通人物,她是一个小女孩,是一位朋友,但她“绝不”是一只猫。那让我们来用计算机给出答案,它到底是什么?

在这里插入图片描述

2、训练数据

如图所示,左边是一群小女孩,右边是一群猫。
在这里插入图片描述

3、特征选取

我们提取7个特征:

  • 是否有蝴蝶结
  • 是否穿衣服
  • 是否高过5个苹果
  • 是否有胡子
  • 是否圆脸
  • 是否有猫耳朵
  • 是否两脚走路
    数据如下:
    表1
    在这里插入图片描述

4、用ID3算法构造分类树

(1)计算Entropy(S)

根据信息熵的概念,我们先计算Entropy(S),因为总共有两个类别:人和猫,故n=2。
在这里插入图片描述

(2)计算各个特征的Entropy

在这里插入图片描述
无论哪个特征,都只有两个特征值:Yes or No,因此 v a l u e ( T ) value(T) value(T)总共只有两个取值。下面以“Has a bow”为例计算:
在这里插入图片描述
然后依次计算其他几项,得出如下结果:
在这里插入图片描述

(3)进一步计算

进一步计算,得出InfoGain(Has cat ears)最大,因此“Has cat ears”是第一个分裂节点。从而这一特征对应的类别也可以看出,所有的特征值为No的一定是Girl;特征值为yes,可能是Girl也可能是Cat,那么第一次分裂结果如下:
在这里插入图片描述
现在“Has cat ears”已经成了分裂点,则下一步将其排除,用剩下的6个Feature继续分裂成树。
表2

在这里插入图片描述
上图数据为第二次分裂所使用的训练数据,相对于之前的数据,“Has cat ears”列,和前7行对应“Has cat ears”为 No 的数据都已经被移除,剩下部分用于第二次分裂。如此反复迭代,最后使得7个特征都成为分裂点。

需要注意的是:如果某个特征被选为当前轮的分裂点,但是它在现存数据中只有一个值,另一个值对应的记录为空,则这个时候针对不存在的特征值,将他标记为该特征在所有训练数据中所占比例最大的类型。
对本例而言,当我们将“Wear Clothes”作为分裂点时,会发现该特征只剩下了一个选项:
在这里插入图片描述
这时就要表1,“Wear Clothes”为 No 的记录中是 Girl 多还是 Cat 多。一目了然,在 表1 中这两种记录数量为 0:6,因此“Wear Clothes”为 No 的分支直接标志成 Cat。据此构建出如下决策树:
在这里插入图片描述
code

DecisionTree induceTree(training_set, features) {
        If(training_set中所有的输入项都被标记为同一个label){
                    return 一个标志位该label的叶子节点;
        } else if(features为空) {
          # 默认标记为在所有training_set中所占比例最大的label 
          return 一个标记为默认label的叶子节点;  
       } else {
           选取一个feature,F;
    以F为根节点创建一棵树currentTree;
           从Features中删除F;
            foreach(value V of F) {                                
       将training_set中feature F的取值为V的元素全部提取出来,组成partition_v;
                   branch_v= induceTree(partition_V, features);
                   将branch_v添加为根节点的子树,根节点到branch_v的路径为F的V值;
            }
            returncurrentTree;
        }
    }

5、后剪枝优化决策树

剪枝是优化决策树的常用手段,方法大致分为两类:

  1. 先剪枝(局部剪枝):在构造过程中,当某个节点满足剪枝条件,则直接停止此分支的构造;
  2. 后剪枝(全局剪枝):先构造完成完整的决策树,再通过某些条件遍历树进行剪枝。
后剪枝优化 Hello Kitty 树

如结果图所示,最后两个分裂点“Has round face”和“Has a bow”存在并无意义,自己想想,无论人猫,都有可能是圆脸,也都可以戴蝴蝶结啊。所以我们遍历所有节点,将没有区分作用的节点删除。完成后,我们的决策树变成了下面这样:
在这里插入图片描述

6、用决策树对Hello Kitty进行分类

我们将 Hello Kitty 的特征带入 Cat-Girl 决策树,发现 Hello Kitty:Has cat ears: Yes -> Walk on 2 feet: Yes -> Wear Clothes: Yes -> Has whiskers: Yes -> Less than 5 apples: Yes -> Cat。

Bingo! Hello Kitty 是只猫!这是我们的 ID3 决策树告诉我们的!

附code

from sklearn import tree
    from sklearn.model_selection im
    port train_test_split
    import numpy as np

    #9个女孩和8只猫的数据,对应7个feature,yes取值为1,no为0
    features = np.array([
        [1, 1, 0, 0, 1, 0, 1],
        [1, 1, 1, 0, 0, 0, 1],
        [0, 1, 0, 0, 0, 0, 1],
        [1, 1, 0, 0, 1, 0, 1],
        [0, 1, 0, 0, 1, 0, 0],
        [0, 1, 0, 0, 1, 0, 1],
        [1, 1, 0, 0, 1, 0, 1],
        [0, 1, 0, 0, 1, 0, 1],
        [0, 1, 0, 1, 1, 1, 1],
        [1, 0, 1, 1, 1, 1, 0],
        [0, 0, 0, 1, 1, 1, 0],
        [1, 0, 1, 1, 1, 1, 0],
        [0, 0, 0, 1, 1, 1, 0],
        [1, 0, 0, 1, 1, 1, 0],
        [0, 0, 1, 0, 1, 1, 0],
        [1, 1, 1, 1, 1, 1, 0],
        [1, 0, 1, 1, 1, 1, 0]
    ])

    #1 表示是女孩,0表示是猫  
    labels = np.array([
        [1],
        [1],
        [1],
        [1],
        [1],
        [1],
        [1],
        [1],
        [1],
        [0],
        [0],
        [0],
        [0],
        [0],
        [0],
        [0],
        [0],
    ])

    # 从数据集中取20%作为测试集,其他作为训练集
    X_train, X_test, y_train, y_test = train_test_split(
        features,
        labels,
        test_size=0.2,
        random_state=0,
    )

    # 训练分类树模型
    clf = tree.DecisionTreeClassifier()
    clf.fit(X=X_train, y=y_train)

    # 测试
    print(clf.predict(X_test))
    # 对比测试结果和预期结果
    print(clf.score(X=X_test, y=y_test))

    # 预测HelloKitty
    HelloKitty = np.array([[1,1,1,1,1,1,1]])
    print(clf.predict(HelloKitty))

最后输出为:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值