机器学习学习笔记之二:决策树

使用决策树算法的基本思路

划分数据集,使被划分的特征作为决策树的节点。通常采用二叉树(也可以采用非二叉树)作为最终形成的决策树形式,即将数据集按照某个特征进行划分成两个子数据集,并对这些子数据集递归地进行划分,直到无法划分为止。

划分数据集的伪代码:

检测数据集中的每个子项是否属于同一分类
If true then return 类标签
Else
    寻找划分数据集的最好特征
    划分数据集
    创建分支节点
    for 每个划分的子集
        递归执行此过程并将返回结果增加到分支节点中
    return 分支节点

信息增益和信息熵

信息增益

在划分数据集之前之后信息发生的变化称为信息增益。

信息熵

集合信息的度量方式称为香农熵或简称为熵。

  1. 概率和频率
    这里我们采用频率来计算概率。假设一个随机变量 (X) 可取 (N) 个不同的值(x_1, x_2, …, x_N),其中值 (x_i)出现的次数记为(|x_i|),则 (x_i) 出现的概率可表示为$$p(x_i)=\frac{|x_i|}{\sum_{i=1}^N{|x_i|}}$$
  2. 信息量
    上面我们计算出了随机变量 (X) 取 (x_i) 时的概率 (p(x_i)),则此时的信息量定义为 $$I(x_i) = -\log_2{p(x_i)}$$
  3. 信息熵
    信息熵定义为随机变量 (X) 所包含的所有信息量的数学期望,即 $$H(X) = -\sum_{i=1}^Np(x_i)\log_2{p(x_i)}$$ 它表示这个随机变量所包含信息的随机程度。熵值越大,则数据的随机程度越高,反之随机程度越低,数据趋向于集中于某一个值。

一个例子

给定一个数据集 (D),其中包含两个标签类别(y_1, y_2),根据统计它们的出现概率分别为(\frac{2}{5})和(\frac{3}{5}),则 (D) 的信息熵 $$\begin{align }H(D) & = -(\frac{2}{5}\log_2\frac{2}{5} + \frac{3}{5}\log_2\frac{3}{5}) \ & \approx 0.971 \end{align}$$

如何构建一棵决策树

给定数据集

[X = \begin{pmatrix} x_{11} & x_{12} & … & x_{1M} \ x_{21} & x_{22} & … & x_{2M} \ . & . & & . \ . & . & & . \ . & . & & . \ x_{N1} & x_{N2} & … & x_{NM} \end{pmatrix}]

以及标签集

[Y = \begin{pmatrix} y_1 & y_2 & … & y_N \end{pmatrix}^T ]

首先我们计算原数据集的熵 (H_{base}),然后针对每一个特征 (\vec{X_1}, \vec{X_2}, …, \vec{X_M}),对数据集做划分。
之后分别计算划分后数据集的熵 (H_i),并计算它们和 (H_{base}) 的差值(即信息增益) (G_i = H_{base} – H_i)
最后找出最大的差值 (\max{G_i}),将产生该差值的特征 (x_i) 作为此次划分的最佳特征,并将其作为决策树的一个节点。

对剩余的数据集,重复上述步骤,将整个数据集划分完毕,并将划分特征作为决策树的节点,构造决策树。

又是一个例子

[D = \begin{pmatrix} 1 & 1 \ 1 & 1 \ 1 & 0 \ 0 & 1 \ 0 & 1 \end{pmatrix}, Y = \begin{pmatrix} 1 \ 1 \ 0 \ 0 \ 0 \end{pmatrix}]

首先按照第一列进行划分。可以看到数据集中只包含0和1两个数,因此如果我们按照第一列进行划分,则数据集可以分为

[D_1 = \begin{pmatrix} 1 \ 1 \ 0 \end{pmatrix}, D_2 = \begin{pmatrix} 1 \ 1 \end{pmatrix}]

其对应的标注集划分为

[Y_1 = \begin{pmatrix} 1 \ 1 \ 0 \end{pmatrix}, Y_2 = \begin{pmatrix} 0 \ 0 \end{pmatrix}]

分别计算 (D_1) 和 (D_2)的信息熵,可以得到

[H(D_1) \approx 0.918, H(D_2) = 0 ]

由于原数据集被划分成了两个,所以用它们对应的标注在原数据集中的比例作为权重计算它们熵的和。

[H_1=0.6\times0.918 + 0.4 \times 0 = 0.5508 ]

信息增益$$G_1 = H_{base} – H_1 = 0.971 – 0.5508 = 0.4202$$

同样的,我们按第二列进行划分

[D’_1 = \begin{pmatrix} 1 \ 1 \ 0 \ 0 \end{pmatrix}, D’_2 = \begin{pmatrix} 1 \end{pmatrix}]

对应的标注集划分为

[Y’_1 = \begin{pmatrix} 1 \ 1 \ 0 \ 0 \end{pmatrix}, Y’_2 = \begin{pmatrix} 0 \end{pmatrix}]

则它们的信息熵

[H(D’_1) = 1, H(D’_2)=0 ]

[H_2 = 0.8 * 1 + 0.2 * 0 = 0.8 ]

[G_2 = H_{base} – H_2 = 0.971 – 0.8 = 0.171 ]

由于 (G_1 > G_2),因此我们认为第一列的特征更可以用于划分。
因此我们先以第一列特征作为树根,构造一棵二叉决策树

机器学习学习笔记之二:决策树

同理我们可以对剩下的部分进行划分,由于过程很简单,我们不再赘述过程。因此得到最后的决策树

机器学习学习笔记之二:决策树

Original: https://www.cnblogs.com/ryuasuka/p/7382607.html
Author: 飞鸟_Asuka
Title: 机器学习学习笔记之二:决策树

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/610468/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java秒杀系统一:环境搭建和DAO层设计

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    0115
  • PHP使用pdfparser实现对PDF转换成本文

    使用pdfparser对PDF转换成文本形式,转换后没有格式。 原始PDF: 转换成文本: 第一步:安装pdfparser composer require smalot/pdfp…

    Linux 2023年6月7日
    0103
  • Android(Java)控制GPIO的方法及耗时分析

    前面两篇分别介绍了通过脚本和C代码读写/sys/class/gpio以控制GPIO。实际项目调试时经常还需要在Java代码里控制GPIO,其实现与C代码类似,唯一不同是Androi…

    Linux 2023年6月7日
    080
  • Docker基础用法

    Docker基础用法 1、Docker为什么会出现? 一款软件产品必须经过:开发 -> 上线 开发人员负责将应用程序开发制作出来。运维人员负责上线,配置应用程序。 在这里存在…

    Linux 2023年6月7日
    074
  • 跳石板—牛客网

    #include #include #include using namespace std; //计算第i个&#x7684…

    Linux 2023年6月13日
    0104
  • 小白上手Linux系统安装Tomcat教程

    1.准备阶段: 要有JDK环境,在安装好JDK后再配置tomcat,JDK安装详情在我博客中可以看到。 3.导入 进入到Xshell输入在自己的文件中(cd /home/lzh)好…

    Linux 2023年6月13日
    093
  • 【Jmeter】jmeter提取response中的返回值,并保存到本地文件–BeanShell后置处理器

    有个需求,需要在压测环境中,创建几十万的账号数据,然后再根据创建结果,查询到某些账号信息。 按照之前我的做法,直接Python调用API,然后再数据库查询; 但是近期所有开发人员的…

    Linux 2023年5月28日
    071
  • Redis快速度特性及为什么支持多线程及应用场景

    转载请注明出处: 1.Redis 访问速度快特性 正常情况下,Redis执行命令的速度非常快,官方给出的数字是读写性能可以达到10万/秒,当然这也取决于机器的性能;Redis使用了…

    Linux 2023年5月28日
    081
  • 软件基础的理论(1)

    软件基础的理论 一, 什么是软件产品 它是一个逻辑产品,没有实体,包括程序,文档和数据,需要通过终端设备才能体现出来功能和作用 二, 软件产品的中间过程文档 客户需求 &#…

    Linux 2023年6月7日
    078
  • K8S部署之VMWare网络拓扑踩坑

    知乎上最近发现一篇好文 图解K8S(01):基于Ubuntu 20.04部署1.23版K8S集群,想着之前 K8S 部署一直不成功,那么就照着这篇文章中说的试一试。结果在实验时遇到…

    Linux 2023年6月13日
    080
  • Linux 0.11源码阅读笔记-文件管理

    Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件。 磁盘分区 生磁盘可以被分区,分区…

    Linux 2023年5月27日
    084
  • Python闭包

    前言 学习Python的单例实现的时候,遇到了下面这样的代码。很不理解为什么局部变量 _instance没有重新初始化。后来看到有人说这是闭包,于是又去了解了下 闭包。没想到闭包竟…

    Linux 2023年6月7日
    086
  • prometheus监控

    介绍 Prometheus是一个开源监控系统,它前身是SoundCloud的警告工具包。从2012年开始,许多公司和组织开始使用Prometheus。该项目的开发人员和用户社区非常…

    Linux 2023年6月6日
    091
  • 什么是视频编码?编解码器和压缩技术

    想知道什么是视频编码,为什么它很重要? 在本文中,我们将研究编码、编解码器和压缩技术的过程。这包括什么使得一个推荐的编解码器,虽然是取决于情况。它还涵盖了为什么某些伪影,与压缩有关…

    Linux 2023年6月7日
    0106
  • 关于熵,条件熵,交叉熵等的介绍

    参考:《数学之美》一文搞懂交叉熵在机器学习中的使用,透彻理解交叉熵背后的直觉详解机器学习中的熵、条件熵、相对熵和交叉熵常用的分类问题中的损失函数 1.信息量与信息熵 香农在他著名的…

    Linux 2023年6月13日
    092
  • git 那些事儿 —— 基于 Learn Git Branching

    推荐一个 git 图形化教学网站:Learn Git Branching,这个网站有一个沙盒可以直接在上面模拟 git 的各种操作,操作效果使用图形的方式展示,非常直观。本文可以看…

    Linux 2023年5月27日
    0116
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球