机器学习 - 决策树

场景

之前有说过k近邻算法,k近邻算法是根据寻找最相似特征的邻居来解决分类问题。k近邻算法存在的问题是:不支持自我纠错,无法呈现数据格式,且吃性能。k近邻算法的决策过程并不可视化。对缺失数据的样本处理很不友好,而且当处理具有许多特征的高维数据时,K-NN的性能可能会下降。

在了解决策树之前,有必要了解一个熵的概念,这是高数必学的一个东西。

熵(Entropy)的定义

熵是信息论中的一个核心概念,最初由克劳德·香农提出。它是用来量化信息中的不确定性或混乱度的度量。在信息论中,熵可以理解为传输的信息量或系统的无序程度。

举例

抛硬币,硬币有正有反,理论上抛到正面和抛到负面的概率是一样大,我跑了三次硬币,分别是

次数结果
1
2
3

问:我第四抛硬币的结果是什么?
这不扯淡吗?我怎么会知道?这种情况下的熵是最大的。

拿小球,我一个袋子里有一百个球,其中一个黑球,九十九个白球,问:你会拿到什么球?
我可以直接预测:白球。

结论是:不确定性较小,熵也相应较低。不确定性越高,熵就越高。

数学上,对于一个离散随机变量 X,其熵 H(X) 可以通过以下公式定义:
在这里插入图片描述
有了公式我们可以计算一下抛一枚硬币的熵值是多少?

from math import log2

# 抛硬币是一个典型的二分类问题,正面和反面出现的概率相等,都是0.5
prob_head = 0.5  # 正面的概率
prob_tail = 0.5  # 反面的概率

# 根据熵的公式计算熵
entropy = - (prob_head * log2(prob_head) + prob_tail * log2(prob_tail))
entropy

结果是 1

熵和决策树

案例

假设我们有以下简单的数据集,它包含了一些关于天气条件的观察结果,以及人们是否选择出门郊游的决定:

天气温度风速出门郊游
晴朗
雨天
阴天温暖
晴朗
晴朗温暖
雨天
阴天
步骤1:计算数据集的熵

首先,我们计算整个数据集的熵。熵是衡量数据集不确定性的度量,它基于最终决定(出门郊游)的分布。

在这个数据集中,有4个“是”和3个“否”。因此,数据集的熵将基于这两个类别的分布来计算。

# 计算熵
def calcShannonEnt(dataSet):
    # 统计实例总数
    numEntries = len(dataSet)
    # 字典标签,统计标签出现的次数
    labelCounts = {}
    for data in dataSet:
        # 每个实例的最后一个元素是标签元素
        currentLabel = data[-1]
        if currentLabel not in labelCounts:
            labelCounts[currentLabel] = 0
            # 为当前类别标签的计数加一
        labelCounts[currentLabel] += 1

    # 设置初始熵
    shannonEnt = 0.0  # 初始化熵为0
    for key in labelCounts:
        prob = float(labelCounts[key]) / numEntries  # 计算每个类别标签的出现概率
        shannonEnt -= prob * log(prob, 2)  # 使用香农熵公式计算并累加熵
    return shannonEnt  # 返回计算得到的熵
步骤2:特征分割

接下来,我们尝试不同的特征来分割数据集,并计算每种分割的熵。
例如,以“天气”为分割特征:
当天气为“晴朗”时,我们有3个样本,其中有1个“是”和2个“否”。
当天气为“雨天”时,有2个样本,都是“否”。
当天气为“阴天”时,有2个样本,都是“是”。
除了天气,我们还有其他的特征,遍历所有的特征,并且得到所有特征的熵累加

    for i in range(numFeatures):  # 遍历所有特征
        featList = [example[i] for example in dataSet]  # 提取当前特征列的所有值
        uniqueVals = set(featList)  # 获取当前特征的唯一值集合
        newEntropy = 0.0  # 初始化新熵
        for value in uniqueVals:  # 遍历当前特征的每个唯一值
            subDataSet = splitDataSet(dataSet, i, value)  # 根据当前特征和值分割数据集
            prob = len(subDataSet) / float(len(dataSet))  # 计算子数据集的比例
            newEntropy += prob * calcShannonEnt(subDataSet)  # 计算新熵,并累加
步骤3:计算信息增益
  什么是信息增益?
  信息增益衡量的是在知道某个特征的信息之后,数据集熵的减少量,即该特征给我们带来多少信息。

在这里插入图片描述
H(D) 是数据集的熵,H(D∣A) 是在知道特征 A 的信息之后数据集 D 的条件熵。

这是数据集当前的熵,初始化最佳信息增益, 初始化最佳特征的索引,初始化新熵

 baseEntropy = calcShannonEnt(dataSet)  # 计算数据集当前的熵
 bestInfoGain = 0.0  # 初始化最佳信息增益
 bestFeature = -1    # 初始化最佳特征的索引
   newEntropy = 0.0  # 初始化新熵
   

目前我们有三种天气,分别是晴朗,雨天,阴天。
那么,晴朗占总数据的多少?subDataSet是总数据集中晴朗的数据明细,那么算出晴朗的熵,然后到了雨天,阴天同理,将他们的熵累加起来。

       for value in uniqueVals:  # 遍历当前特征的每个唯一值
          subDataSet = splitDataSet(dataSet, i, value)  # 根据当前特征和值分割数据集
          prob = len(subDataSet) / float(len(dataSet))  # 计算子数据集的比例
          newEntropy += prob * calcShannonEnt(subDataSet)  # 计算新熵,并累加
构建决策树
决策树

决策树是一种流行的机器学习算法,用于分类和回归任务。它模拟了人类决策过程的方式,通过一系列的问题来推导出结论。

基本原理:
节点:决策树由节点组成,包括决策节点和叶节点。决策节点表示一个属性或特征,叶节点代表决策的结果。

分割:从根节点开始,根据数据集的特征对数据进行分割,每个分割创建子节点。

信息增益:选择分割的特征基于信息增益(或其他类似指标,如Gini不纯度)。目标是选择能最有效提高决策纯度的特征。

递归:重复这个过程,为每个子节点继续创建更深层次的分割,直到满足停止条件(如达到预定深度,或子节点纯度足够高)。

和熵关联起来

我们之前得到了每一个特征的熵,也得到了他们的信息增益。根据前面的例子(自行计算)我们选择具有最大信息增益的特征来分割数据集。这意味着该特征在减少预测是否去郊游的不确定性方面最有效。在我们的例子中,假设“天气”特征带来了最大的信息增益,那么它将成为决策树的第一个决策点。基于“天气”特征构建决策树的顶部。然后,针对“晴朗”、“雨天”和“阴天”这三个子集重复上述过程,选择下一个最佳分割特征,直到所有子集都足够“纯净”或达到树的最大深度。通过这个过程,熵和信息增益帮助我们识别哪些特征对于预测结果最重要,从而可以构建一个有效的决策树模型。每次分割旨在创建更“纯净”的子集,最终构建出能够准确预测新样本类别的决策树。

总结

我们通过信息增益构建决策树,决策树类似于if else条件流程,我们可以使用python的绘图工具画出来。决策树的范例,如下,我们通过决策树就可以直接得到预测结果。
在这里插入图片描述

结束

决策树虽然是一个强大且易于理解的机器学习工具,但它们也有一些缺点和局限性:
过拟合问题:决策树非常容易过拟合,尤其是当树变得非常深或复杂时。过拟合意味着树对训练数据过于精确地建模,从而捕捉到了噪声和异常值,这会降低其在新数据上的预测性能。
不稳定性:决策树可能对数据中的小变化非常敏感。即使是非常小的数据变动,也可能导致生成完全不同的树。
处理非线性问题的能力有限:决策树可能不擅长处理数据间的复杂关系或非线性问题。例如,如果类别边界是圆形的,单一的决策树可能很难处理这样的情况。
信息增益偏好:在选择分割的特征时,决策树倾向于选择拥有更多水平(levels)的特征,这并不总是最佳选择。
结果不一定最优:决策树算法(如ID3、C4.5、CART)通常使用启发式方法来构建树,这意味着结果可能并不是全局最优的。
类别不平衡问题:如果数据集中的类别分布极不平衡,决策树可能会偏向于多数类,从而影响模型的性能。
由于这些原因,决策树通常与其他技术(如剪枝、集成方法等)结合使用,以提高其性能和鲁棒性。例如,随机森林和梯度提升树就是使用决策树构建的集成学习算法,它们通常能提供比单个决策树更好的性能和泛化能力。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ OpenGL 3D GameTutorial 1:Making the window with win32 API学习笔记

视频地址https://www.youtube.com/watch?vjHcz22MDPeE&listPLv8DnRaQOs5-MR-zbP1QUdq5FL0FWqVzg 一、入口函数 首先看入口函数main代码&#xff1a; #include<OGL3D/Game/OGame.h>int main() {OGame game;game.Run();return 0; } 这里交代个关于C语法的问题&#x…

MidJourney笔记(10)-faq-fast-help-imagine-info-public-stealth

/faq 在官方 Midjourney Discord 服务器中使用可快速生成流行提示工艺频道常见问题解答的链接。 不过这个命令,我也是没有找到入口,之前还能在MidJourney的频道里使用,然后最近发现没有权限,有点奇怪。不知道系统又做了什么升级。 /fast 切换到快速模式。

七、HTML 文本格式化

一、HTML 文本格式化 加粗文本斜体文本电脑自动输出 这是 下标 和 上标 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>HTML文本格式化</title> </head><body><b>加粗文本</b><br>…

HarmonyOS应用开发学习笔记 包名、icon图标,应用名修改 UIAbility组件介绍、UIAbility启动模式、UIAbility组件基本用法

目前HarmonyOS应用主推的是Stage模型开发 一、Stage模型基本概念 项目描述UIAbility组件UIAbility组件是一种包含UI界面的应用组件&#xff0c;主要用于和用户交互。例如&#xff0c;图库类应用可以在UIAbility组件中展示图片瀑布流&#xff0c;在用户选择某个图片后&#xf…

Mysqld的关键优化参数

skip-name-resolve 现象 mysql连接很慢&#xff0c;登陆到服务器上查看服务器日志都是正常的&#xff0c;无可疑记录&#xff0c;登陆到mysql服务器上&#xff0c;查看下进程&#xff0c;发现有很多这样的连接&#xff1a; 218 | unauthenticated user | 192.168.10.6:44500 |…

Stable Diffusion架构的3D分子生成模型 GeoLDM - 测评与代码解析

之前&#xff0c;向大家介绍过3D分子生成模型 GeoLDM。 GeoLDM按照Stable Diffusion架构&#xff0c;将3D分子生成的扩散过程运行在隐空间内&#xff0c;优化了基于扩散模型的分子生成。可能是打开Drug-AIGC的关键之作。让精确控制分子生成有了希望。 详见&#xff1a;分子生成…

听GPT 讲Rust源代码--compiler(16)

File: rust/compiler/rustc_span/src/lib.rs 在Rust源代码中&#xff0c;rust/compiler/rustc_span/src/lib.rs文件定义了与Rust编译器源代码位置相关的数据结构和功能。 下面是对一些重要结构和枚举类型的详细介绍&#xff1a; SessionGlobals: 代表编译器会话&#xff08;Ses…

leetcode2975. 移除栅栏得到的正方形田地的最大面积

题目 有一个大型的 (m - 1) x (n - 1) 矩形田地&#xff0c;其两个对角分别是 (1, 1) 和 (m, n) &#xff0c;田地内部有一些水平栅栏和垂直栅栏&#xff0c;分别由数组 hFences 和 vFences 给出。 水平栅栏为坐标 (hFences[i], 1) 到 (hFences[i], n)&#xff0c;垂直栅栏为…

【大数据进阶第三阶段之Hive学习笔记】Hive查询、函数、性能优化

【大数据进阶第三阶段之Hive学习笔记】Hive安装-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive常用命令和属性配置-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive基础入门-CSDN博客 【大数据进阶第三阶段之Hive学习笔记】Hive查询、函数、性能优化-CSDN博客 ——…

2024.1.2 Spark 简介,架构,环境部署,词频统计

目录 一. Spark简介 二 . Spark 框架模块 三. 环境准备 3.1 Spark Local模式搭建 3.2 通过Anaconda安装python3环境 3.3 PySpark库安装 四 . Spark集群模式架构介绍 五. pycharm远程开发环境 六. Spark词频统计 一. Spark简介 1. Spark 和MapReduce MR:大量的磁盘反复…

LiveGBS流媒体平台GB/T28181常见问题-国标编号是什么设备编号和通道国标编号标记唯一的摄像头|视频|镜头通道

LiveGBS国标GB28181中国标编号是什么设备编号和通道国标编号标记唯一的摄像头|视频|镜头通道 1、什么是国标编号&#xff1f;2、国标设备ID和通道ID3、ID 统一编码规则4、搭建GB28181视频直播平台 1、什么是国标编号&#xff1f; 国标GB28181对接过程中&#xff0c;可能有的小…

Vue入门一(前端发展史|Vue介绍|Vue插值语法|Vue指令|style与class使用|条件渲染)

文章目录 一、前端的发展史二、Vue介绍 和 基本使用1) Vue介绍2) Vue特点3) M-V-VM思想1.MVVM介绍2.MVVM的特性3.MVVM逻辑 4) 组件化开发、单页面开发组件化开发单页面开发 5) 引入方式6) 补充解释型的语言是需要解释器的 nodejs&#xff1a;一门后端语言7) 快速使用 三、Vue之…

JavaScript异常处理详解

前言 本文将带你了解 JavaScript 中常见的错误类型&#xff0c;处理同步和异步 JavaScript代码中错误和异常的方式&#xff0c;以及错误处理最佳实践&#xff01; 1. 错误概述 JavaScript 中的错误是一个对象&#xff0c;在发生错误时会抛出该对象以停止程序。在 JavaScript…

代码随想录刷题题Day26

刷题的第二十六天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C Day26 任务 ● 动态规划理论基础 ● 斐波那契数 ● 爬楼梯 ● 使用最小花费爬楼梯 1 动态规划理论基础 对于动态规划问题&#x…

小白入门基础 - spring Boot 入门

1.简介 spring Boot是为了简化java的开发流程而构建的&#xff0c;即使是使用springMVC框架&#xff0c;也依然需要大量配置和依赖导入&#xff0c; 这无疑是繁琐的&#xff0c;spring Boot采用了”习惯由于配置“的原则&#xff0c;进行一键化部署&#xff0c;这样极大…

【建议收藏】一文全面解读Linux最常用的解压缩命令(tar、zip、unzip、gzip、guznip、bzip2、bunzip2)

一文全面解读Linux最常用的解压缩命令&#xff08;tar、zip、unzip、gzip、guznip、bzip2、bunzip2&#xff09;&#xff0c;建议收藏 文章目录 一文全面解读Linux最常用的解压缩命令&#xff08;tar、zip、unzip、gzip、guznip、bzip2、bunzip2&#xff09;&#xff0c;建议收…

2017年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

昨天&#xff0c;六分成长给大家了做了一套2024年AMC8比赛的全真模拟试题&#xff0c;40分钟&#xff0c;25道题&#xff0c;并且提供了答案&#xff0c;所有试题来自过去20年的真题&#xff0c;不知道你做对了多少&#xff1f;一定要让孩子抽40分钟&#xff0c;认真的做一做&a…

mnn-llm: 大语言模型端侧CPU推理优化

在大语言模型(LLM)端侧部署上&#xff0c;基于 MNN 实现的 mnn-llm 项目已经展现出业界领先的性能&#xff0c;特别是在 ARM 架构的 CPU 上。目前利用 mnn-llm 的推理能力&#xff0c;qwen-1.8b在mnn-llm的驱动下能够在移动端达到端侧实时会话的能力&#xff0c;能够在较低内存…

数字人克隆:人类科技进步的里程碑

数字人克隆&#xff0c;作为一项引起广泛争议和关注的科技创新&#xff0c;正在逐渐走向我们的生活。它是将人的意识和思想复制到数字化的实体中&#xff0c;从而使之与真正的人类无异。数字人克隆的出现不仅引发了人们对道德伦理问题的讨论&#xff0c;也给人类社会带来了巨大…

频率域图像增强之理想低通滤波器的python实现——数字图像处理

原理 理想低通滤波器&#xff08;Ideal Low-Pass Filter, ILPF&#xff09;是数字图像处理中一个重要的概念&#xff0c;尤其在频率域滤波中扮演着关键角色。 定义&#xff1a; 理想低通滤波器是一种在频率域内工作的滤波器&#xff0c;旨在通过允许低频信号通过同时阻止高频信…