【机器学习系列】之“西瓜数据集”决策树构建数学公式计算过程

作者:張張張張
github地址:https://github.com/zhanghekai
【转载请注明出处,谢谢!】

【机器学习系列】之“西瓜数据集”决策树构建数学公式计算过程
【机器学习系列】之决策树剪枝和连续值、缺失值处理数学公式计算
【机器学习系列】之ID3、C4.5、CART决策树构建代码

一、决策树概述

决策树(Decision Tree)算法是一种基本的分类与回归方法,是最经常使用的数据挖掘算法之一。决策树是一种非线性有监督分类模型必须将已有的数据进行离散化,即:从字符串变成数值。构造决策树的基本思想是随着树深度的增加,节点的“熵”迅速降低,熵降低的速度越快越好,这样我们有望得到一棵高度最矮的决策树。

决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是 if-then 规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。

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

用决策树对需要测试的实例进行分类:从根节点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至达到叶结点。最后将实例分配到叶结点的类中。

决策树学习通常包括 3 个步骤:特征选择、决策树的生成和决策树的修剪。

二、决策树场景

  • 一个叫做 “二十个问题” 的游戏,游戏的规则很简单:参与游戏的一方在脑海中想某个事物,其他参与者向他提问,只允许提 20 个问题,问题的答案也只能用对或错回答。问问题的人通过推断分解,逐步缩小待猜测事物的范围,最后得到游戏的答案。

  • 一个邮件分类系统,大致工作流程如下:

在这里插入图片描述

首先检测发送邮件域名地址。如果地址为 myEmployer.com, 则将其放在分类 "无聊时需要阅读的邮件"中。
如果邮件不是来自这个域名,则检测邮件内容里是否包含单词 “曲棍球” , 如果包含则将邮件归类到 “需要及时处理的朋友邮件”, 如果不包含则将邮件归类到 “无需阅读的垃圾邮件” 。

三、决策树概念须知

1.名词定义

熵(entropy):指体系的混乱的程度,在不同的学科中也有引申出的更为具体的定义,是各领域十分重要的参量。

信息熵(information theory):使度量样本集合纯度最常用的一种指标。信息熵度量了事物的不确定性,越不确定的事物,它的熵就越大。

信息增益(information gain):在划分数据集前后信息熵发生的变化称为信息增益。信息增益越大,表明数据“纯度”提升越大。

信息增益率(infor gain ratio):正信息增益的基础上,解决过拟合问题的方法。

基尼系数(Gini index):CART决策树划分属性的指标,数据集的纯度可以用基尼值来度量,基尼值越小,数据集的纯度越高。

纯度(purity):叶子节点中正确分类的标签所占该叶子节点中包含数据的比例。

2.构建“树”时的基本要求

  • 决策树的生成是一个递归过程,即决策树以深度优先遍历进行构建。
  • 每个节点可选择的特征为:除该节点的父节点和祖父节点之外的所有特征。
  • 若当前节点为空集,对应的处理措施为:将其设置为叶节点,类别设置为其父节点,所含样本最多的类别。

四、三种决策树对比

支持模型 树结构 特征选择 连续值处理
ID3 分类 多叉树 信息增益 不支持
C4.5 分类 多叉树 信息增益率 支持
CART 分类、多回归 二叉树 基尼系数、均方差 支持

五、 划分选择

我们希望决策树的分支节点所包含的样本尽可能属于同一类别,即节点的“纯度”越来越高。

我们使用周志华一书《机器学习》中的“西瓜数据集”进行计算:
在这里插入图片描述

1.ID3信息增益

信 息 熵 : E n t ( D ) = − ∑ k = 1 ∣ Y ∣ p k l o g 2 p k 信息熵:Ent(D) = - \sum_{k = 1}^{|Y|}p_k log_2 p_k Ent(D)=k=1Ypklog2pk

信 息 增 益 : G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) 信息增益:Gain(D,a) = Ent(D) - \sum_{v = 1}^{V}\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)v=1VDDvEnt(Dv)

  • |Y|:代表分类标签的数量,“好瓜”、“坏瓜”,所以|Y|=2
  • a:代表数据集所包含的特征,a={色泽,根蒂,敲声,纹理,脐部,触感}
  • v:代表每一个特征下所包含的属性,例如特征“色泽“下v={青绿,乌黑,浅白}
  • 正例:”是“好瓜
  • 反例:”否“好瓜
  • ∣ D v ∣ ∣ D ∣ \frac{|D^v|}{|D|} DDv:代表该节点所包含的数据数量占其父节点数据数量的比例

  1. 根节点包含D中所有数据,数据总数:17,正例占p1=8/17,反例占p2=9/17。

    根节点的信息熵为:
    E n t ( D ) = − ∑ k = 1 2 p k l o g 2 p k = − ( 8 17 l o g 2 8 17 + 9 17 l o g 2 9 17 ) = 0.998 Ent(D)=-\sum_{k=1}^{2}p_k log_2 p_k=-(\frac{8}{17}log_2 \frac{8}{17}+\frac{9}{17}log_2 \frac{9}{17})=0.998 Ent(D)=k=12pklog2pk=(178log2178+179log2179)=0.998

​ 然后,我们要计算出当前特征集合{色泽,根蒂,敲声,纹理,脐部,触感}中每个特征的信息熵和信息增益。

★特征”色泽“:
D 1 D^1 D1(色泽=青绿):{1,4,6,10,13,17},正例p1=3/6,反例p2=3/6
E n t ( D 1 ) = − ( 3 6 l o g 2 3 6 + 3 6 l o g 2 3 6 ) = 1.000 Ent(D^1)=-(\frac{3}{6}log_2 \frac{3}{6} + \frac{3}{6}log_2 \frac{3}{6}) = 1.000 Ent(D1)=(63log263+63log263)=1.000

D 2 D^2 D2(色泽=乌黑):{2,3,7,8,9,15},正例p1=4/6,反例p2=2/6
E n t ( D 2 ) = − ( 4 6 l o g 2 4 6 + 2 6 l o g 2 2 6 ) = 0.918 Ent(D^2)=-(\frac{4}{6}log_2 \frac{4}{6} + \frac{2}{6}log_2 \frac{2}{6}) = 0.918 Ent(D2)=(64log264+62log262)=0.918

D 3 D^3 D3(色泽=浅白):{5,11,12,14,16},正例p1=1/5,反例p2=4/5
E n t ( D 3 ) = − ( 1 5 l o g 2 1 5 + 4 5 l o g 2 4 5 ) = 0.722 Ent(D^3)=-(\frac{1}{5}log_2 \frac{1}{5} + \frac{4}{5}log_2 \frac{4}{5}) = 0.722 Ent(D3)=(51log251+54log254)=0.722

"色泽"特征的信息增益:

G a i n ( D , 色 泽 ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) = 0.998 − ( 6 17 × 1 + 6 17 × 0.918 + 5 17 × 0.722 ) = 0.109 Gain(D,色泽)=Ent(D) - \sum_{v = 1}^{V}\frac{|D^v|}{|D|}Ent(D^v)\\ =0.998-(\frac{6}{17}\times 1 +\frac{6}{17}\times 0.918 + \frac{5}{17}\times 0.722)=0.109 Gain(D,)=Ent(D)v=1VDDvEnt(Dv)=0.998(176×1+176×0.918+175×0.722)=0.109

类似的,计算出其他特征的信息增益:
Gain(D,根蒂)=0.143 \quad Gain(D,敲声)=0.141 \quad Gain(D,纹理)=0.381
Gain(D,脐部)=0.289 \quad Gain(D,触感)=0.006

特征”纹理”的信息增益最大,选他作为划分属性。
在这里插入图片描述

其中节点上方红色字体表示:创建该node节点时可选择的特征。

  1. D 1 D^1 D1中有编号为{1,2,3,4,5,6,8,10,15},可用特征集合为{色泽,根蒂,敲声,脐部,触感},其中正例p1=7/9,反例p2=2/9。

D 1 D^1 D1节点的信息熵为:
E n t ( D 1 ) = − ∑ k = 1 2 p k l o g 2 p k = − ( 7 9 l o g 2 7 9 + 2 9 l o g 2 2 9 ) = 0.763 Ent(D^1)=-\sum_{k=1}^{2}p_k log_2 p_k=-(\frac{7}{9}log_2 \frac{7}{9}+\frac{2}{9}log_2 \frac{2}{9})=0.763 Ent(D1)=k=12pklog2pk=(97log297+92log292)=0.763
★特征”色泽“:
D 11 D^{11} D11(色泽=青绿):{1,4,6,10},正例p1=3/4,反例p2=1/4
E n t ( D 11 ) = − ( 3 4 l o g 2 3 4 + 1 4 l o g 2 1 4 ) = 0.811 Ent(D^{11})=-(\frac{3}{4}log_2 \frac{3}{4} + \frac{1}{4}log_2 \frac{1}{4}) = 0.811 Ent(D11)=(43log243+41log241)=0.811

D 12 D^{12} D12(色泽=乌黑):{2,3,8,15},正例p1=3/4,反例p2=1/4
E n t ( D 12 ) = − ( 3 4 l o g 2 3 4 + 1 4 l o g 2 1 4 ) = 0.811 Ent(D^{12})=-(\frac{3}{4}log_2 \frac{3}{4} + \frac{1}{4}log_2 \frac{1}{4}) = 0.811 Ent(D12)=(43log243+41log241)=0.811

D 13 D^{13} D13(色泽=浅白):{5},正例p1=1,反例p2=0
E n t ( D 13 ) = − ( 1 l o g 2 1 + 0 l o g 2 0 ) = 0 Ent(D^{13})=-(1log_2 1 + 0log_2 0) =0 Ent(D13)=(1log21+0log20)=0

"色泽"特征的信息增益:

G a i n ( D 1 , 色 泽 ) = E n t ( D 1 ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) = 0.763 − ( 4 9 × 0.811 + 4 9 × 0.811 + 1 9 × 0 ) = 0.043 Gain(D^1,色泽)=Ent(D^1) - \sum_{v = 1}^{V}\frac{|D^v|}{|D|}Ent(D^v)\\ =0.763-(\frac{4}{9}\times 0.811 +\frac{4}{9}\times 0.811 + \frac{1}{9}\times 0)=0.043 Gain(D1,)=Ent(D1)v=1V

  • 30
    点赞
  • 195
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
合成大西瓜小程序基于uni-app框架开发,下面是一个示范的代码: 首先,我们需要创建一个uni-app项目,并在pages文件夹下新建一个Game文件夹,用于存放游戏页面相关的文件。 在Game文件夹中,我们需要创建三个文件:Game.vue、Game.json和Game.js。 Game.vue: <template> <view class="container"> <button @click="startGame">开始游戏</button> <view class="game-board"> <view class="fruit" v-for="(fruit, index) in fruits" :key="index" :style="{ top: fruit.y + 'px', left: fruit.x + 'px' }"></view> </view> <text>得分:{{ score }}</text> </view> </template> <script> export default { data() { return { fruits: [], score: 0 }; }, methods: { startGame() { // 游戏逻辑 } } }; </script> <style> .container { width: 100%; height: 100%; display: flex; flex-direction: column; align-items: center; } .game-board { width: 500px; height: 800px; background: url('board-bg.png'); // 游戏背景图 position: relative; margin-top: 20px; } .fruit { width: 100px; height: 100px; background: url('fruit.png'); // 水果图 background-size: cover; position: absolute; } </style> Game.json: { "navigationBarTitleText": "合成大西瓜" } Game.js: export default { config: { enablePullDownRefresh: false } }; 以上是一个简单的合成大西瓜小程序的示例代码,其中包含了开始游戏按钮、水果图和游戏得分的显示。你可以根据实际需求进一步开发游戏的逻辑,比如添加各种水果、碰撞检测等等。祝你顺利完成项目!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值