【Python机器学习】决策树的构造——信息增益

news2024/11/20 10:43:55

决策树是最经常使用的数据挖掘算法。它之所以如此流行,一个很重要的原因就是不需要了解机器学习的知识,就能搞明白决策树是如何工作的。

决策树的优缺点:

优点:计算复杂度不高,输出结果易于理解,对中间值的缺失不敏感,可以处理不相关特征数据。

缺点:可能会产生过度匹配问题。

使用数据类型:数值型和标称型。

在构造决策树时,我们需要解决的第一个问题就是,当前数据集上哪个特征在划分数据分类时起到决定性作用。为了找到决定性的特征,划分出最好的结果,我们必须评估每个特征。完成测试之后,原始数据集就被划分为几个数据集。这些数据子集会分布在第一个决策点的所有分支上。如果某个分支下的数据属于同一类型,则已经正确地划分数据分类,无需进一步对数据集进行分割。如果数据子集内的数据不属于同一类型,则需要重复划分数据子集的过程。划分数据子集的算法与划分原始数据集的方法相同,直到所有具有相同类型的数据均在一个数据子集内。

创建分支的伪代码:

    If so return 类标签

    else 

        寻找划分数据集的最好特征

        划分数据集

        创建分支节点

            for 每个划分的子集

                调用函数并增加返回结果到分支节点中

        return 分支节点

上面的伪代码是一个递归函数,在倒数第二行调用它自己。

决策树的一般流程:

1、收集数据

2、准备数据:树构造算法只适用于标称型数据,因此数值型数据必须离散化

3、分析数据:构造树完成字后,我们应该检查图形是够符合预期

4、训练算法

5、测试算法

6、使用算法

一些决策树算法采用二分法划分数据,但如果依据某个属性划分数据将会产生4个可能的值,我们也可以将数据划分成4块。

以下面的数据为例,这里有5个海洋生物,我们要将动物划分为两类:鱼类和非鱼类。现在我们要决定依据第一个特征还是第二个特征:

不浮出水面能否生存是否有脚蹼属于鱼类
1
2
3
4
5

划分数据集的大原则是:将无序的数据变得更加有序。我们可以使用多种方法划分数据集,但是每种方法都有各自的优缺点。组织杂乱无章数据的一种方法是使用信息论度量信息,信息论是量化处理信息的分支科学。我们可以在划分数据之前或之后使用信息论量化度量信息的内容。

在划分数据集之前之后信息发生的变化称为信息增益,知道如何计算信息增益,我们就可以计算每个特征值划分数据即获得的信息增益,获得信息增益最高的特征就是最好的选择。

在可以评测那种数据划分方式是最好的数据划分之前,我们必须学习如何计算信息增益。集合信息的度量方式称为香农熵或者简称为熵。

熵定义为信息的期望值,在明晰这个概念之前,我们必须指导信息的定义。如果待分类的失误肯呢个划分在多个分类之中,则符号X_{i}的信息定义为:

l(X_{i})=-log_{2}p(X_{i})

其中p(X_{i})是选择改分类的概率

为了计算熵,我们需要计算所有类别所有可能值包含的信息期望值,通过下面的公式得到:

H=-\sum _{i=1}^{n}p(X_{i})log_{2}p(X_{i})

其中n是分类的数目。

下面代码的功能是计算给定数据集的熵:

from math import log

def calcShannonEnt(dataSet):
    numEntries=log(dataSet)
    labelCounts={}
    for featVec in dataSet:
        currentLabel=featVec[-1]
        if currentLabel not in labelCounts.keys():
            labelCounts[currentLabel]=0
        labelCounts[currentLabel] += 1
    shannonEnt=0.0
    for key in labelCounts:
        prod=float(labelCounts[key])/numEntries
        shannonEnt-=prod*log(prod,2)
    return shannonEnt

函数中,首先计算数据中实例的总数,我们也可以在需要时再计算这个值,但是由于代码中多次用到这个值,为了提高代码的效率,我们显示地声明一个变量保存实例总数。然后创建了一个数据字典,它的键值是最后一列的数值。如果当前键值不存在,则扩展字典并将当前键值加入字典。每个键值都记录了当前类别出现的次数。最后,使用所有类标签的发生频率计算类别出现的概率。我们将用这个概率计算香农熵,统计所有类标签发生的次数。

我们输入上面的鱼类分类数据:

def createDataSet():
    dataSet=[[1,1,'yes'],
             [1,1,'yes'],
             [1,0,'no'],
             [0,1,'no'],
             [0,1,'no'],]
    labels=['no surfacing','flippers']
    return dataSet,labels
myDat,labels=createDataSet()
print(calcShannonEnt(myDat))

熵越高,则混合的数据也越多,我们可以在数据集中添加更多的分类,观察熵是如何变化的。这里我们增加第三个名为maybe的分类,测试熵的变化。

myDat[0][-1]='maybe'
print(calcShannonEnt(myDat))

得到熵之后,我们就可以按照获取最大信息增益的方法划分数据集。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1954851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RabbitMq手动ack的超简单案例+Confirm和Return机制的配置和使用

最简单的例子 先简单介绍一下这三个方法 basicAck 表示确认成功,使用此方法后,消息会被rabbitmq broker删除 basicNack 表示失败确认,一般在消费消息业务异常时用到此方法,可以将消息重新投递入队列 basicReject 拒绝消息&am…

Chainlit一个快速构建成式AI应用的Python框架,无缝集成与多平台部署

概述 Chainlit 是一个开源 Python 包,用于构建和部署生成式 AI 应用的开源框架。它提供了一种简单的方法来创建交互式的用户界面,这些界面可以与 LLM(大型语言模型)驱动的应用程序进行通信。Chainlit 旨在帮助开发者快速构建基于…

全网最适合入门的面向对象编程教程:25 类和对象的 Python 实现-Python 判断输入数据类型

全网最适合入门的面向对象编程教程:25 类和对象的 Python 实现-Python 判断输入数据类型 摘要: 本文主要介绍了在使用 Python 面向对象编程时,如何使用 type 函数、isinstance 函数和正则表达式三种方法判断用户输入数据类型,并对…

PWA(渐进式网页应用)方式实现TodoList桌面应用

参考: https://cloud.tencent.com/developer/article/2322236 todlist网页参考: https://blog.csdn.net/weixin_42357472/article/details/140657576 实现在线网页当成app应用: 一个 PWA 应用首先是一个网页, 是通过 Web 技术编写出的一个网…

如何全面提升架构设计的质量?

当我们从可扩展、高可用、高性能等角度设计出来架构的时候,我们如何优化架构呢?就需要从成本、安全、测试等角度进行优化。 如何设计更好的架构 - 步骤 成本 低成本复杂度本质 低成本手段和应用 低成本的主要应用场景 安全 安全性复杂度本质 架构安全…

大语言模型系列-Transformer:深入探索与未来展望

大家好,我是一名测试开发工程师,已经开源一套【自动化测试框架】和【测试管理平台】,欢迎大家联系我,一起【分享测试知识,交流测试技术】 Transformer模型自其问世以来,便迅速在自然语言处理领域崭露头角&a…

2024年【危险化学品生产单位安全生产管理人员】最新解析及危险化学品生产单位安全生产管理人员考试总结

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员最新解析参考答案及危险化学品生产单位安全生产管理人员考试试题解析是安全生产模拟考试一点通题库老师及危险化学品生产单位安全生产管理人员操作证已考过的学员汇总,…

mysql基本数据类型(整型)

一、 常见面试题 整型都有哪些基础类型,各占几个字节 tinyint, smallint, mediumint, int, bigint: 1 2 3 4 8 int(n) 是什么意思,什么时候用到 指定显示位宽,需配合 zerofill 使用(不够位宽则在前面补0),…

Could not find a version that satisfies the requirement

Could not find a version that satisfies the requirement 目录 Could not find a version that satisfies the requirement 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,2…

MATLAB被360误杀的解决方案

前面被误杀,今天又被误杀。 前面误杀结果是缺少文件,重装MATLAB也不行。 结果重装了操作系统。 这次,看到了提示额外小心。 当时备份了“病毒”文件,结果备份的也被杀了。 解铃还须系铃人 在360安全卫士里面恢复,步骤…

线性代数|机器学习-P27用于深度学习的神经网络结构

文章目录 1. 概述2. 参数定义3. CNN 网络 1. 概述 – 1. 卷积神经网络 CNNs – 2. 连续型线性分段函数 F – 3. 损失函数 – 4. 链式法则计算反向传播算法梯度 ∇ F g r a d F \nabla F \mathrm{grad}\; F ∇FgradF 2. 参数定义 我们定义每个样本有m维度特征,有…

java找不到符号解决办法

一、java找不到符号 如果你的代码里没有报错,明明是存在的。但是java报错找不到符号。如下所示, 二、解决步骤 1.清除编码工具缓存 本人用的idea, eclipse清除缓存方式有需要的可以百度一下! 2.如果是mavne项目的 先clean 再…

流媒体服务器一:使用成熟的流媒体SRS 搭建 RTMP流媒体服务器

1 安装和测试srs流媒体服务器 服务器:SRS(Simple RTMP Server,⽀持RTMP、HTTP-FLV,HLS) 推流端:ffmpeg OBS 拉流端:ffplay VLC srs播放器 1.1 安装srs流媒体服务器 官网 SRS (Simple Realtime Server) | SRS 码…

大模型算法面试题(十四)

本系列收纳各种大模型面试题及答案。 1、微调后的模型出现能力劣化,灾难性遗忘是怎么回事 微调后的模型出现能力劣化,灾难性遗忘(Catastrophic Forgetting)是一个在机器学习领域,尤其是在深度学习和大模型应用中频繁出…

【SpringBoot】6 全局异常捕获

介绍 在项目开发中,如果每个 Controller 都增加 try catch 方法去捕获异常及处理,就会导致代码变得很繁琐、效率低下,而大部分异常是不能直接向外抛出,需要有个统一的显示处理方法,因此需要加上全局异常捕获统一获取并…

深度学习中常用损失函数介绍

选择正确的损失函数对于训练机器学习模型非常重要。不同的损失函数适用于不同类型的问题。本文将总结一些常见的损失函数,并附有易于理解的解释、用法和示例 均方误差损失(MSE) loss_fn nn.MSELoss()py均方误差(Mean Squared Error,简称 MSE…

Navidrome音乐服务器 + 音流APP = 释放你的手机空间

20240727 By wdhuag 目录 前言: 参考: Navidrome音乐服务器 Demo试用: 支持多平台: 下载: 修改配置: 设置用NSSM成服务启动: 服务器本地访问网址: 音流 歌词封面API&am…

Golang | Leetcode Golang题解之第292题Nim游戏

题目: 题解: func canWinNim(n int) bool {return n%4 ! 0 }

网站打包封装成app,提高用户体验和商业价值

网站打包封装成app的优势 随着移动互联网的普及,用户对移动应用的需求越来越高。网站打包封装成app可以满足用户的需求,提高用户体验和商业价值。 我的朋友是一名电商平台的运营负责人,他曾经告诉我,他们的网站流量主要来自移动…

vite + xlsx + xlsx-style 导出 Excel

如下 npm i 依赖 npm i xlsxnpm i xlsx-style-vite1、简单的使用:.vue文件中使用 const dataSource ref([]) // 数据源const columns [{title: 用户名,key: userName,width: 120,},{title: 用户组,key: userGroup,width: 120,},{title: 状态,key: enable,width: …