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

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

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

划分数据集的伪代码:

检测数据集中的每个子项是否属于同一分类
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)

大家都在看

  • ThinkPHP5权限管理

    自己写的权限管理,大致思路:用户登陆成功之后,查出该用户的权限列表,并把权限列表存到session中,进入系统后,再判断该模块是否在session中,如果存在就说明有该权限,就显示…

    Linux 2023年6月7日
    098
  • Typora+gitee+picgo搭建本地博客环境

    前言 现在现成的博客平台数不胜数,如果选择服务器+自建博客也有很多方案,可是本人对相片、博客等信息数据总是有本地和互联网各存储一遍才放心的习惯,所以作者本人选择了csdn、博客园、…

    Linux 2023年6月7日
    0123
  • 玩转redis-简单消息队列

    使用 go语言基于 redis写了一个简单的消息队列源码地址使用demo redis的 list 非常的灵活,可以从左边或者右边添加元素,当然也以从任意一头读取数据 添加数据和获取…

    Linux 2023年5月28日
    0109
  • sql server 增删改(查太多了)

    delete(删除) 使用 delete语句删除表中数据。 delete from 表名 [where where_definition] 如果不使用where子句,将删除表中所有…

    Linux 2023年6月7日
    087
  • null和空字符串对于查询where条件语句的影响

    在数据库中我们进行数据处理的过程中,对于null值或者空字符串的情况对于这种数据我们进行计算平均值以及查询过程中如何进行对于这类数据的处理呢? step1:建表:create ta…

    Linux 2023年6月14日
    097
  • 一劳永逸,解决.NET发布云服务器的时区问题

    国内大多数开发者使用的电脑,都是使用的北京时间,日常开发的过程中其实并没有什么不便;不过,等遇到了阿里云等云服务器,系统默认使用的时间大多为 UTC时间,这个时候,时区和时间的问题…

    Linux 2023年6月6日
    095
  • Centos7下载及安装

    Centos7下载及安装 1.下载虚拟机 虚拟机下载地址: https://www.vmware.com 或者 360一键安装(推荐) 2.在虚拟机上安装Centos7 2.1.通…

    Linux 2023年5月27日
    089
  • NO.4 计算机组成原理-笔记

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

    Linux 2023年6月7日
    094
  • 解决Conda改源后无法安装软件包的问题

    前言 有时候哪怕修改了 Conda 源也一直无法安装一个想要的软件包,亦或者找到了目标软件包,下载速度却很慢,速度感人,也可能直接 Conda 就找不到你想安装的软件包 此时有两种…

    Linux 2023年6月14日
    090
  • Git工作流程

    学于2018年6月 总的流程: 一: 首先克隆整个项目到本地 二: 在本地创建一个属于自己的分支, 并push到远程(当时的工作情况是, 每实现一个功能, 或修改一个BUG都创建一…

    Linux 2023年6月6日
    0123
  • 【填坑】树莓派4B上运行Bullseye版本系统,不能登录xrdp的问题~~

    以前使用 buster,安装xrdp后 pi用户xrdp登录正常,可自从使用了 bullseye系统,pi登录xrdp后,出现黑屏不能登录现象。 网上搜寻解决方案,一种方法是: 找…

    Linux 2023年6月7日
    090
  • Linux下使用压力测试工具stress

    首先解压安装包到/usr/local/src/下 mv stress-1.0.4.tar.gz /usr/local/src​tar -zxf stress-1.0.4.tar.g…

    Linux 2023年6月13日
    089
  • Linux网络配置

    第一种 通过编辑网络配置文件/etc/sysconfig/network-scripts/ifcfg-ens32 -> TYPE=Ethernet -> #网卡类型是以…

    Linux 2023年5月27日
    0107
  • 源码安装apache脚本部署

    源码安装apache脚本部署 [root@localhost ~]# ls anaconda-ks.cfg httpd.tar.xz [root@localhost ~]# tar…

    Linux 2023年6月6日
    0105
  • docker search和pull超时

    练习时用docker查找镜像或者pull镜像时总是超时,折腾一圈发现是 时钟同步的问题,实验环境的时间偏差太大,重新同步一次就ok了。 #ntpdate cn.pool.ntp.o…

    Linux 2023年6月14日
    083
  • bare Git 仓库是什么?

    背景 今天,坐我旁边的同事问我一些关于服务器上命令的问题。其中有一个用了特殊参数的 git init 的命令,我也不认识,遂去 Google… bare Git 仓库 …

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