机器学习入门案例(3)之使用决策树预测是否适合打网球

news2025/1/24 14:43:30

大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。
1、世人称我为:被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员…
2、这几年,我整理了很多IT技术相关的教程给大家,爱生活、爱分享。
3、如果您觉得文章有用,请收藏,转发,评论,并关注我,谢谢!
博客导航跳转(请收藏):邵奈一的技术博客导航
| 公众号 | 微信 | CSDN | 掘金 | 51CTO | 简书 | 微博 |


教程目录

  • 0x00 教程内容
        • 1. 引入相关依赖的包
        • 2. 定义函数并生成决策树
        • 3. 定义函数并保存生成的树图
        • 4. 定义函数用于生成向量化数据
        • 5. 调用函数进行预测
        • 6. 预测新样本
  • 0xFF 总结

0x00 教程内容

背景说明:
使用的数据集为tennis.txt,其中包含了14个样本,每个样本都包含了与天气相关的特征以及是否适合打球的相关信息。具体数据如下:

序号天气气温湿度类别
1N
2N
3多云Y
4适中Y
5正常Y
6正常N
7多云正常Y
8适中N
9正常Y
10适中正常Y
11适中正常Y
12多云适中Y
13多云正常Y
14适中N
1. 引入相关依赖的包
# 导入pandas库,用于数据处理和分析
import pandas as pd
# 导入numpy库,用于数值计算
import numpy as np
# 导入sklearn库中的tree模块,用于构建决策树模型
from sklearn import tree
# 导入pydotplus库,用于绘制决策树图形
import pydotplus

如果提示:

ModuleNotFoundError: No module named 'pydotplus'

使用以下命令安装pydotplus:
方式一:直接在jupyter notebook中安装

!pip install pydotplus

如下图所示:
在这里插入图片描述
执行完重新引入一下库即可。

方式二:直接在pip命令行中安装

pip install pydotplus

效果如图:

(base) C:\Users\shaonaiyi>pip install pydotplus
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ProtocolError('Connection aborted.', ConnectionResetError(10054, '远程主机强迫关闭了一个现有的连接。', None, 10054, None))': /simple/pydotplus/
Collecting pydotplus
  Downloading pydotplus-2.0.2.tar.gz (278 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 278.7/278.7 kB 58.8 kB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Requirement already satisfied: pyparsing>=2.0.1 in c:\users\shaonaiyi\anaconda3\lib\site-packages (from pydotplus) (3.0.9)
Building wheels for collected packages: pydotplus
  Building wheel for pydotplus (setup.py) ... done
  Created wheel for pydotplus: filename=pydotplus-2.0.2-py3-none-any.whl size=24554 sha256=dc6225242106622dbd9d9e581bff72da1217c2b2a5048a2d712a0778536353dd
  Stored in directory: c:\users\shaonaiyi\appdata\local\pip\cache\wheels\89\e5\de\6966007cf223872eedfbebbe0e074534e72e9128c8fd4b55eb
Successfully built pydotplus
Installing collected packages: pydotplus
2. 定义函数并生成决策树
# 生成决策树
def createTree(trainingData):
    # 从训练数据中提取特征矩阵和标签
    data = trainingData.iloc[:, :-1] # 获取特征矩阵(除了最后一列)
    labels = trainingData.iloc[:, -1] # 获取标签(即最后一列)
    # 创建一个分类决策树模型,使用信息熵作为划分标准
    trainedTree = tree.DecisionTreeClassifier(criterion="entropy") # 分类决策树
    # 使用特征矩阵和标签训练决策树模型
    trainedTree.fit(data, labels) # 训练
    # 返回训练好的决策树模型
    return trainedTree
  • createTree 是一个函数,它接受一个参数 trainingData。这个参数预期是一个数据集,其中每一行是一个样本,每一列是一个特征,最后一列是目标标签。
  • data = trainingData.iloc[:, :-1] 这行代码从 trainingData 中取出所有的行(即所有的样本)和除最后一列之外的所有列。这是为了获取决策树训练所需的特征数据
  • labels = trainingData.iloc[:, -1] 这行代码取出 trainingData 的最后一列,这是为了获取决策树训练所需的目标标签
  • trainedTree = tree.DecisionTreeClassifier(criterion="entropy") 这行代码创建一个 DecisionTreeClassifier 对象,这个对象将会用于创建决策树。这里,criterion="entropy" 指定了决策树的建立基于信息增益率(也称为交叉熵),这是在决策树的每个划分中,选择最优划分特征的标准。
  • trainedTree.fit(data, labels) 这行代码调用 fit 方法,使用前面获取的特征标签来训练决策树模型。
  • 最后,函数返回训练好的决策树模型 trainedTree
3. 定义函数并保存生成的树图
def showtree2pdf(trainedTree,finename):
    # 将训练好的决策树导出为Graphviz格式的数据
    dot_data = tree.export_graphviz(trainedTree, out_file=None)
    # 从Graphviz格式的数据中创建一个图形对象
    graph = pydotplus.graph_from_dot_data(dot_data)
    # 将图形对象保存为PDF文件,文件名为finename
    graph.write_pdf(finename)
  • 这个Python函数 showtree2pdf 的目的是将一个通过Graphviz格式导出的树形结构保存为PDF文件。
  • 函数接受两个参数:trainedTree,表示需要导出的树形结构;finename,表示导出PDF文件的名字。
  • 在函数体中,首先使用 tree.export_graphviz 方法将 trainedTree 导出为Graphviz格式的字符串 dot_data。然后,使用 pydotplus.graph_from_dot_data 方法将 dot_data 转换为一个PyDotPlus图形对象 graph
  • 最后,使用 graph.write_pdf 方法将图形保存为PDF文件,文件名为 finename
  • 这个函数需要三个库:treepydotplusnetworkx。其中 treenetworkx 是用于创建和处理树形结构的库,而 pydotplus 是用于处理Graphviz格式的库。
4. 定义函数用于生成向量化数据

定义一个 data2vector 函数,其作用是将非数值型的特征转换分类编码,以便在机器学习模型中使用。这个函数在数据预处理阶段非常有用,可以帮助我们处理非数值型数据,并为后续的分析和建模提供更便利的数据形式。

def data2vector(data):
    # 获取数据中除最后一列之外的所有列名
    names = data.columns[:-1]
    # 遍历每一列
    for i in names:
        # 将当前列转换为分类数据类型
        col = pd.Categorical(data[i])
        # 将当前列的分类编码替换为原始值
        data[i] = col.codes
    # 返回处理后的数据
    return data
  • col = pd.Categorical(data[i])表示将当前所遍历的列转换为分类数据类型。pd.Categorical 函数将每个唯一的类别分配一个整数编码,比如编码可以为0、1、2等等。
  • 接着使用代码data[i] = col.codes将当前所遍历的列的分类编码覆盖掉原本的初始值,完成替换操作。
  • 函数中,通过pd.Categorical(list).codes可以得到原始数据对应的序号列表,从而将类别信息转化成数值信息

为了便于理解,补充说明例子如下:

import pandas as pd
data = pd.DataFrame({
    'A': ['apple', 'banana', 'apple', 'orange'],
    'B': ['red', 'green', 'red', 'yellow'],
    'C': [10, 20, 30, 40],
    'Label': ['positive', 'negative', 'positive', 'positive']
})
print("原始数据:")
print(data)
transformed_data = data2vector(data)
print("转换后的数据:")
print(transformed_data)

输出结果为:

原始数据:
        A       B   C     Label
0   apple     red  10  positive
1  banana   green  20  negative
2   apple     red  30  positive
3  orange  yellow  40  positive
转换后的数据:
   A  B  C     Label
0  0  1  0  positive
1  1  0  1  negative
2  0  1  2  positive
3  2  2  3  positive

其中 ‘apple’ 对应编码 0,‘banana’ 对应编码 1,‘orange’ 对应编码 2,执行完后,可以发现已经将A、B、C列都已经进行了编码,将非数值型的特征转换为了分类编码。pd.Categorical 函数和 col.codes 是 pandas 库中常用的函数。

这种非数值型数据到分类编码的转换有几个优点:

  • 保留类别关系:分类编码将不同类别之间的顺序关系保留下来。例如,在某些情况下,类别 ‘apple’ 编码为 0,类别 ‘banana’ 编码为 1,这样的编码反映了它们在原始数据中的相对顺序。
  • 适应机器学习算法:大多数机器学习算法和统计模型只能处理数值型数据。通过将非数值型数据转换为分类编码,我们可以在这些算法中使用这些特征,而无需进一步处理。
  • 节省内存:分类数据类型在内存中占用的空间通常比字符串或对象类型要少。这在处理大型数据集时尤为重要,可以降低内存占用和提高计算效率。

需要注意的是,分类编码并不适用于所有情况。在某些情况下,我们可能需要使用其他编码方式,例如独热编码(One-Hot Encoding)或特征哈希(Feature Hashing),以满足特定的数据需求。

5. 调用函数进行预测
data = pd.read_table("tennis.txt",header=None,sep='\t') #读取训练数据
trainingvec=data2vector(data) #向量化数据
decisionTree=createTree(trainingvec) #创建决策树
showtree2pdf(decisionTree,"tennis.pdf")  #图示决策树

说明:如果没有tennis.txt文件,可以观注公中号私发tennis.txt自动获取。

执行后,可能会报错:

InvocationException: GraphViz's executables not found

首先,先安装graphviz库,命令如下:

!pip install graphviz

然后,直接在网址:https://graphviz.org/download/中下载软件,我下载的版本是2.50.0版本:
在这里插入图片描述
下载后,需要安装,我直接安装在Anaconda安装目录的Library\bin目录下即可,比如我的地址为:D:\SmallTools\Anaconda3\Library\bin,因为我的Anaconda已经配置了环境变量了,所以无需再单独配置环境变量(安装时,也有是否配置环境变量选项,也可以选中它),选择则不需要单独配置环境变量路径,否则需要将Graphviz\bin路径配置到环境变量里。当然也可以在代码中配置,即在notebook中加入以下代码:

import os
os.environ["PATH"] += os.pathsep + "D:/SmallTools/Anaconda3/Library/bin/graphviz/bin/"

参考教程如下:https://blog.csdn.net/weixin_36407399/article/details/87890230

如果没有问题,重新执行代码,此时会在本地生成决策树图,名称为“tennis.pdf”:
在这里插入图片描述

可以看到里面的内容就是决策树的可视化呈现。字段分别为:天气、气温、湿度、风、类别,其中X[2]就表示第3个特征变量:湿度,X[0]则表示第1个特征变量:天气,X[3]则表示第4个特征变量:风力;entropy则表示该节点的熵值;samples则表示该节点中的样本数,比如说第一个节点,也即根节点中的14就是训练集中的样本数量;value则表示不同种类所占的个数,比如说根节点中value左边的5表示“否”的数量,9则表示“是”的数量。

6. 预测新样本

输入:

testVec = [0,0,1,1] # 天气晴、气温冷、湿度高、风力强
print(decisionTree.predict(np.array(testVec).reshape(1,-1))) #预测

输出:
['否']

由此可以知道,天气晴、气温冷、湿度高、风力强,预测不会出来打网球。

0xFF 总结

  1. 这是决策树预测的典型例子,变种还有很多,但大体相似,本例子的亮点是绘制了决策树图,更加直观。
  2. 请继续关注我,我将更新更多使用教程。

邵奈一 原创不易,如转载请标明出处,教育是一生的事业。


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

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

相关文章

U-Mail海外邮件中继帮您解决企业邮件退信难题

过去一年,国内外形势严峻复杂,但中国外贸顶住压力、爬坡过坎,进出口规模冲破40万亿元大关,高达42万亿元人民币,中国连续6年位居货物贸易第一大国。随着我国疫情防控措进入新阶段,“拼经济”正在成为各地的一…

【Windows 开发环境配置——NVIDIA 篇】CUDA、cuDNN、TensorRT 三件套安装

CUDA 从CUDA Toolkit Archive下载相应版本的离线安装包,这里以11.7为例。 打开安装包,在安装选项选择自定义模式,点击下一步。 在自定义安装选项中,仅选择CUDA组件(其中Nsight相关组件用于代码调试与性能分析&#xff…

NSSCTF第12页(1)

[FSCTF 2023]细狗2.0 应该是和[HUBUCTF 2022 新生赛]ezsql搞混掉了 点击按钮出现了 发现输入什么回显什么 伪协议也不行 看源代码发现了这个玩意 输入了1;发现了其他回显 ls 发现了两个文件 发现被限制了 不知道是cat还是空格 绕过 直接找吧还是 得到flag [SCTF 2021]loginm…

详解 KEIL C51 软件的使用·建立工程

单片机要运行,就必须将程序代码下载到程序存储器内部,但是在写进单片机之前要先将你写 的程序转换成*.hex 或*.bin 的文件.不同系列的单片机都有不同的软件对其进行编绎,而 keil Cx51 是德国开发的一个专为 51 系列单片机提供的软件开发平台,基本上现在的所有 51 系列内核的单片…

嵌入式养成计划-53----ARM--串口通信

一百三十四、串口通信 134.1 串口的概念 串口(UART):Universal asynchronous receiver transmitter (USART/UART),通用异步接收发送器通过串口可以实现两个不同机器之间的信息交互串口通信属于总线通信的一种 134.2 总线的概念…

GZ038 物联网应用开发赛题第7套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第7套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评…

处理本地DNS劫持,导致域名解析失败

回顾情形 在公司内网,有同事反馈appstoreconnect.apple.com网站需要通过代理才能正常访问。 向我这边询问,否修改过路由策略; 检测域名 通过域名ping检测网址,https://ping.chinaz.com/astrill.com,来ping域名apps…

1688往微信小程序自营商城铺货商品采集API接口

一、背景介绍 随着移动互联网的快速发展,微信小程序作为一种新型的电商形态,正逐渐成为广大商家拓展销售渠道、提升品牌影响力的重要平台。然而,对于许多传统企业而言,如何将商品信息快速、准确地铺货到微信小程序自营商城是一个…

第五章ARM处理器的嵌入式硬件系统设计——课后习题

1ARM处理器的工作状态 ARM处理器有两种工作状态。具体而言,ARM处理器执行32位ARM指令集时,工作在ARM状态,当ARM处理器执行16位thumb指令集时候,工作在thumb状态。 1ARM指令特点 1一个大的,统一的寄存器文件。 2基于…

后端接口性能优化分析-数据库优化

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring源码、JUC源码🔥如果感觉博主的文章还不错的话,请👍三连支持&…

​如何解决SSD NAND Path冲突导致的性能问题?

1.引言 最近看到一篇关于SSD的NAND并发瓶颈相关的论文,思路非常好,这里分享给大家。本篇论文的解读,也是小编上周末在高铁上完成的。存储随笔的论文解读,不是直接翻译,是小编先研读一遍后,再结合自己的理解…

SoftwareTest6 - 用 Selenium 怎么点点点

用 Selenium 来点点点 一 . 什么是自动化 ?1.1 自动化测试的分类接口自动化测试UI 自动化测试 (界面测试) 1.2 实现自动化测试的工具 : selenium环境部署驱动 二 . selenium 的使用2.1 一个简单的示例 : 让谷歌浏览器在百度首页搜索蔡徐坤准备工作编写代码 2.2 打开谷歌浏览器…

世界互联网大会|美创科技新一代 灾备一体化平台(DRCC v3.0)重磅亮相

11月9日,在2023年世界互联网大会“互联网之光”博览会上,美创科技携2023年重磅新品——新一代 灾备一体化平台(DRCC v3.0)亮相! ◼︎ 云计算、国产化浪潮下,各类信息基础设施的运行安全面临全新挑战&#…

性能测试 —— Jmeter分布式测试的注意事项和常见问题

Jmeter是一款开源的性能测试工具,使用Jmeter进行分布式测试时,也需要注意一些细节和问题,否则可能会影响测试结果的准确性和可靠性。 Jmeter分布式测试时需要特别注意的几个方面 1. 参数化文件的位置和内容 如果使用csv文件进行参数化&…

【Java 进阶篇】JQuery 案例:优雅的隔行换色

在前端的设计中,页面的美观性是至关重要的。而其中一个简单而实用的设计技巧就是隔行换色。通过巧妙地使用 JQuery,我们可以轻松地实现这一效果,为网页增添一份优雅。本篇博客将详细解析 JQuery 隔行换色的实现原理和应用场景,让我…

数据结构入门————栈和队列(C语言/零基础/小白/新手+模拟实现+例题讲解)

目录 1.栈的概念 ​编辑 2.栈的作用 1.函数递归 2.表达式求值 3.栈的模拟实现 Stack.h Stack.c 4.队列的概念 5.队列的模拟实现 Queue.h Queue.c 6.例题 1.一个栈的初始状态为空。现将元素1、2、3、4、5、A、B、C、D、E依次入栈,然后再依次出栈,…

如何把小米路由器刷入OpenWRT系统并通过内网穿透工具实现公网远程访问

小米路由器4A千兆版刷入OpenWRT并远程访问 文章目录 小米路由器4A千兆版刷入OpenWRT并远程访问前言1. 安装Python和需要的库2. 使用 OpenWRTInvasion 破解路由器3. 备份当前分区并刷入新的Breed4. 安装cpolar内网穿透4.1 注册账号4.2 下载cpolar客户端4.3 登录cpolar web ui管理…

LeetCode | 225. 用队列实现栈

LeetCode | 225. 用队列实现栈 OJ链接 此题可以用两个队列去实现一个栈,每次始终保持一个队列为空, 入栈操作相当于给非空队列进行入队操作 入数据,把不为空的队列入 出数据,把不为空的队列数据导入为空,直到最后一…

如何将微软 Office 宏转换为 ONLYOFFICE 宏

想要将微软 Office VBA 宏转换为可在 ONLYOFFICE 中无缝使用的宏?嗯,虽然这种需求并没有直接的解决方案,不过我们也会在本文中介绍 VBA 宏的转换步骤——正好我们手上也有一个来自用户的实际案例可供参考。 VBA 宏 以下是原始的 VBA 宏代码&…

vscode+python开发之虚拟环境和解释器切换

需求情景: 现在我们要开发多个项目比如:项目A,项目B、项目C,他们每个项目需要依赖不同的库。每个项目依赖的解释器也不一样怎么办? 项目A:需要在python3.7环境运行 依赖aadd3.2库 项目B、需要在python3.11…