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

大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。
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 pydotplusDownloading pydotplus-2.0.2.tar.gz (278 kB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 278.7/278.7 kB 58.8 kB/s eta 0:00:00Preparing 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: pydotplusBuilding wheel for pydotplus (setup.py) ... doneCreated wheel for pydotplus: filename=pydotplus-2.0.2-py3-none-any.whl size=24554 sha256=dc6225242106622dbd9d9e581bff72da1217c2b2a5048a2d712a0778536353ddStored 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文件,文件名为finenamegraph.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.rhkb.cn/news/192424.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AK F.*ing leetcode 流浪计划之半平面求交

欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 本期话题:半平面求交 背景知识 学习资料 视频讲解 https://www.bilibili.com/video/BV1jL411C7Ct/?spm_id_from333.1007.top_right_bar_window_history…

Kstry: 业务架构的首选之选

在当今数字化时代,构建稳健且高效的业务架构对于企业的成功至关重要。Kstry作为一种创新性的技术架构,已经在各个领域展现出卓越的表现。本文将探讨为何Kstry被视为业务架构的首选,并介绍其独特的特点和优势。 引言 业务架构是指基于企业战略…

提升代码复用性:探讨Mixin类在面向对象语言中的独特作用和优势

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、m…

es性能强悍的推演过程

前言 es底层复用的Lucene的能力,Lucene在以前的文章中有所讲解,感兴趣可查看 https://blog.csdn.net/u013978512/article/details/125474873?ops_request_misc%257B%2522request%255Fid%2522%253A%2522169771769916777224433628%2522%252C%2522scm%2522…

2个器件,做1个恒流源

在项目中经常要用到恒流源,查找资料可以使用电压源芯片LM317构造一个电流源芯片。本文将电压源加上一个电阻改为电流源,这种设计思路可以扩展到其他类型的电源芯片上,如开关电源及其他类型的线性电源,关键点在于基准电压VREF的使用…

若依Linux与Docker集群部署

若依Linux集群部署 1. 若依2.MYSQL Linux环境安装2.1 MYSQL数据库部署和安装2.2 解压MYSQL安装包2.3 创建MYSQL⽤户和⽤户组2.4 修改MYSQL⽬录的归属⽤户2.5 准备MYSQL的配置⽂件2.6 正式开始安装MYSQL2.7 复制启动脚本到资源⽬录2.8 设置MYSQL系统服务并开启⾃启2.9 启动MYSQL…

MDM如何配置数据审批功能

MDM基础数据平台是进行清洗和治理企业的主数据,使企业的主数据具有唯一性、准确性、一致性、及时性,通过主数据数据清洗功能将错误数据和重复数据进行清洗,从而保证企业数据能够做到以上那几点,然后再分发至下游系统,使…

苹果手机照片如何导入电脑?无损快速的传输办法分享!

前些天小编的朋友联系到我,说是自己苹果手机里面的照片太多,有好几千张,不知道该怎么快而无损地传到电脑。我想遇到这种情况的不止是小编的朋友,生活中遇到手机照片导入电脑的同学不在少数。不管是苹果手机还是安卓手机&#xff0…

μC/OS-II---互斥信号量管理2(os_mutex.c)

目录 背景:优先级反转问题互斥信号量管理互斥信号量发出(释放)互斥信号量获取/无等待互斥信号量状态查询 背景:优先级反转问题 在高优先级任务等待低优先级任务释放资源时,第三个中等优先级任务抢占了低优先级任务。阻…

【postgresql】查看数据中表的信息

切换到postgresql数据库,各种不适应吧。 有个需求需要查询数据表的各种信息。 下面我们一起学习吧。 ●PostgreSQL: Documentation PostgreSQL: Documentation ●pg_namespace 存储名字空间。名字空间是 SQL 模式下层的结构:每个名字空间有独立的关系…

FPGA时序约束与分析-简单入门

FPGA时序约束与分析-简单入门 文章目录 FPGA时序约束与分析-简单入门1. 本课程概述2. 时序约束简介2.1 什么是时序约束2.2 合理的时序约束2.3 *基于Vivado的时序约束方法 3. 时序分析的基本概念3.1 时钟与时钟偏差3.2 建立时间和保持时间3.3 时序分析中路径、沿和关系的定义 4.…

V10chrony服务配置

Chrony简介 Chrony是一个开源自由的网络时间协议 NTP 的客户端和服务器软软件。它能让计算机保持系统时钟与时钟服务器(NTP)同步,因此让你的计算机保持精确的时间,Chrony也可以作为服务端软件为其他计算机提供时间同步服务。 Ch…

字符流的讲解 以及 Reader和Writer的用法

文章目录 ❤专栏导读❤字符流❤Reader类的操作 ❤Writer类操作❤Writer类的构造方法 ❤专栏导读 🚀《多线程》 🚀《数据结构剖析》 🚀《JavaSE语法》 在Java标准库中,提供的读写文件的流对象有很多很多的类,但是可以将…

计算机网络之物理层

物理层 1. 物理层的基本概念 2.物理层下面的传输媒体 传输媒体可分为两类,一类是导引型传输媒体,另一类是非导引型传输媒体。 3.传输方式 3.1 串行传输和并行传输 串行传输:串行传输是指数据是一个比特依次发送的,因此在发送端…

家居行业中跨区域EDI应用的优化策略

提到家居行业的国际知名企业,你会想到哪些?宜家IKEA还是家得宝The Home Depot?这些稳居家居行业第一梯队的企业都有哪些共同之处? 无论是北美市场还是欧洲市场,这些企业都有一个共同点:他们采用EDI&#x…

【Redis系列】Redis上设置key,value的时候出现NOAUTH Authentication required提示如何解决?

哈喽,大家好,我是小浪。相信大家在初学一门新的知识点的时候都会遇到各种各样的问题,在网上找了一大堆的解决方案,最后还是无功而返,那么今天博主就记录一下在进行Redis的一些操作中遇到的问题~ 当我们好不容易安装好R…

国际阿里云:提高CDN缓存命中率教程!!!

CDN缓存命中率低会导致源站压力大,静态资源访问效率低。您可以根据导致CDN缓存命中率低的具体原因,选择对应的优化策略来提高CDN的缓存命中率。 背景信息 CDN通过将静态资源缓存在CDN节点上实现资源访问加速。当客户端访问某资源时,如果CDN节…

给在读博士的建议

早上起床第一件事,瞄了眼知乎! 发现现在的手机真的很智能,也许是聊天的时候不经意间提了一句,早上就推荐了自己想看到的东西! 分享给大家! 有哪些给在读博士的建议? 如何通过一句话判断一个博士…

LeetCode(12)时间插入、删除和获取随机元素【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 380. O(1) 时间插入、删除和获取随机元素 1.题目 实现RandomizedSet 类: RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回…

Karmada更高效地实现故障转移

随着云原生技术的发展,其应用场景不断扩大。越来越多的企业开始将应用程序部署在 Kubernetes 集群中,随着 Kubernetes 集群规模的不断扩大,也带来了许多管理挑战,例如多集群间负载均衡、资源调度、故障转移等问题。为了解决这些问…