当前位置: 首页 > news >正文

使用Python的Scikit-Learn进行决策树建模和可视化:以隐形眼镜数据集为例

决策树是一种强大的机器学习算法,它在数据挖掘和模式识别中被广泛应用。决策树模型可以帮助我们理解数据中的模式和规则,并做出预测。在本文中,我们将介绍如何使用Python的Scikit-Learn库构建决策树模型,并使用Graphviz进行可视化。我们将以一个实际的示例数据集(lenses.txt)为基础,来演示整个过程。

**准备工作**

首先,确保你已经安装了Scikit-Learn和Graphviz库。你可以使用以下命令来安装它们:

pip install scikit-learn
pip install graphviz

此外,我们需要一个数据集来演示决策树的建模和可视化。我们将使用一个名为"lenses.txt"的示例数据集,该数据集描述了一组隐形眼镜的特征,并预测了应该使用哪种类型的隐形眼镜。

**数据集介绍**

首先,让我们来了解一下"lenses.txt"数据集。这个数据集包含以下特征列:

1. `age`:患者的年龄。
2. `prescription`:视力矫正处方的类型。
3. `astigmatic`:是否患者患有散光。
4. `tear_rate`:眼泪生产率。

还有一个目标列:

- `class`:决定了应该使用哪种类型的隐形眼镜(硬材质、软材质、不适用)。

**数据预处理**

在开始建模之前,我们需要对数据进行预处理。具体地,我们需要将类别特征转换为数值特征,以便可以用于决策树模型。下面是数据预处理的代码:

import pandas as pd# 读取lenses.txt文件并设置列名
data = pd.read_csv("lenses.txt", sep="\t", header=None)
data.columns = ["age", "prescription", "astigmatic", "tear_rate", "class"]# 将类别特征转换为数值
data = data.apply(lambda x: pd.Categorical(x).codes if x.dtype == "object" else x)# 转换特征列名为字符串
data.columns = data.columns.astype(str)# 分割数据为特征和目标
X = data.drop("class", axis=1)
y = data["class"]

现在,我们已经准备好数据,并将其转换为适合决策树建模的格式。

**构建决策树模型**

接下来,让我们使用Scikit-Learn创建决策树模型。我们将使用`DecisionTreeClassifier`类来构建分类器。

from sklearn.tree import DecisionTreeClassifier# 创建决策树模型
model = DecisionTreeClassifier()

**划分训练集和测试集**

在训练模型之前,我们需要将数据集划分成训练集和测试集。这有助于评估模型的性能。通常,我们将大部分数据用于训练,一小部分用于测试。

from sklearn.model_selection import train_test_split# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

**训练决策树模型**

现在,我们可以使用训练数据来训练决策树模型。

# 训练模型
model.fit(X_train, y_train)

模型已经训练完成,接下来我们将评估它的性能。

**模型评估**

在评估模型之前,让我们使用测试数据来进行预测,并计算模型的准确度。

from sklearn.metrics import accuracy_score# 预测
y_pred = model.predict(X_test)# 计算模型准确度
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确度: {accuracy}")

模型的准确度告诉我们模型在测试数据上的性能。在这种情况下,我们使用准确度来衡量模型的性能,但根据具体问题,还可以使用其他指标。

**决策树的可视化**

决策树模型是一种非常直观的机器学习模型,我们可以将其可视化以更好地理解其决策过程。为了可视化决策树,我们将使用Graphviz工具。首先,我们需要生成决策树的可视化图形。

from sklearn.tree import export_graphviz
import graphviz# 可视化决策树
dot_data = export_graphviz(model,out_file=None,feature_names=data.columns[:-1],class_names=data["class"].unique().astype(str),filled=True,rounded=True,special_characters=True,
)graph = graphviz.Source(dot_data)

上述代码生成了决策树的可视化图形,其中包含决策树的节点和分支。接下来,我们可以将图形保存为文件或在默认的图形查看器中打开它。

# 将可视化图形保存为文件
graph.render("lenses_decision_tree")# 在默认的图形查看器中打开可视化图形
graph.view()

这样,我们就成功生成了决策树模型的可视化图形。您可以使用默认的PDF查看器打开生成的图形文件,并

深入了解模型的决策过程。

**保存和分享决策树图**

如果您希望分享您生成的决策树图形,您可以将图形文件发送给他人。这使得您可以轻松与团队成员或同事共享模型的可视化结果,以帮助他们理解模型的工作原理。

**总结**

在本文中,我们介绍了如何使用Python的Scikit-Learn库来构建决策树模型,并使用Graphviz进行可视化。我们从数据准备开始,将类别特征转换为数值特征,然后构建、训练和评估决策树模型。最后,我们演示了如何将模型的决策过程可视化,并将结果保存和分享。

决策树是一种强大的机器学习工具,它可以用于分类和回归问题。通过可视化决策树,我们可以更好地理解模型的决策过程,这对于解释模型和与他人共享结果非常有帮助。

这篇文章详细介绍了如何使用Scikit-Learn构建和可视化决策树模型。希望这个指南对您理解决策树算法和其应用有所帮助。祝您在探索机器学习和数据科学的旅程中取得成功!

import pandas as pd
from sklearn.tree import DecisionTreeClassifier, export_graphviz
import graphviz
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score# 读取lenses.txt文件并设置列名
data = pd.read_csv("lenses.txt", sep="\t", header=None)
data.columns = ["age", "prescription", "astigmatic", "tear_rate", "class"]# 将类别特征转换为数值
data = data.apply(lambda x: pd.Categorical(x).codes if x.dtype == "object" else x)# 转换特征列名为字符串
data.columns = data.columns.astype(str)# 分割数据为特征和目标
X = data.drop("class", axis=1)
y = data["class"]# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 创建决策树模型
model = DecisionTreeClassifier()# 训练模型
model.fit(X_train, y_train)# 预测
y_pred = model.predict(X_test)# 计算模型准确度
accuracy = accuracy_score(y_test, y_pred)
print(f"模型准确度: {accuracy}")# 可视化决策树
dot_data = export_graphviz(model,out_file=None,feature_names=data.columns[:-1],class_names=data["class"].unique().astype(str),filled=True,rounded=True,special_characters=True,
)graph = graphviz.Source(dot_data)
graph.render("lenses_decision_tree")  # 将可视化图形保存为文件
graph.view()  # 在默认的图形查看器中打开可视化图形

相关文章:

使用Python的Scikit-Learn进行决策树建模和可视化:以隐形眼镜数据集为例

决策树是一种强大的机器学习算法,它在数据挖掘和模式识别中被广泛应用。决策树模型可以帮助我们理解数据中的模式和规则,并做出预测。在本文中,我们将介绍如何使用Python的Scikit-Learn库构建决策树模型,并使用Graphviz进行可视化…...

开源软件:释放创新的力量,改变数字世界的游戏规则

在充满活力的技术领域,创新是至高无上的,有一种方法已获得显著的吸引力——开源软件。开源软件凭借其透明、协作和无限可能性的精神,彻底改变了我们开发、共享和定制应用程序的方式。从操作系统到数据分析工具,其影响跨越了多个领…...

【QT】鼠标常用事件

新建项目 加标签控件 当鼠标进去,显示【鼠标进入】,离开时显示【鼠标离开】 将QLable提升成自己的控件,然后再去捕获 添加文件 改继承的类名 提升类 同一个父类,可以提升 效果 现在代码就和Qlabel对应起来了。 在.h中声明&…...

LuatOS-SOC接口文档(air780E)--mlx90640 - 红外测温(MLX90640)

常量# 常量 类型 解释 mlx90640.FPS1HZ number FPS1HZ mlx90640.FPS2HZ number FPS2HZ mlx90640.FPS4HZ number FPS4HZ mlx90640.FPS8HZ number FPS8HZ mlx90640.FPS16HZ number FPS16HZ mlx90640.FPS32HZ number FPS32HZ mlx90640.FPS64HZ number FPS6…...

java连接本地数据库可以简写为///

java连接数据库配置文件写为: server:port: 8091 spring:application:name: user-managerdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/user?serverTimezoneAsia/Shanghai&characterEncodingutf-8username: root…...

基于springboot漫画动漫网站

基于springbootvue漫画动漫网站 摘要 基于Spring Boot的漫画动漫网站是一个精彩的项目,它结合了现代Web开发技术和漫画爱好者的热情。这个网站的目标是为用户提供一个便捷的平台,让他们能够欣赏各种漫画和动漫作品,与其他爱好者分享他们的兴趣…...

autoFac 生命周期 试验

1.概述 autoFac的生命周期 序号名称说明1InstancePerDependency每次请求都创建一个新的对象2InstancePerLifetimeScope同一个Lifetime生成的对象是同一个实例3SingleInstance每次都用同一个对象 2.注 InstancePerLifetimeScope 同一个Lifetime生成的对象是同一个实例&#x…...

foreach、for in 和for of的区别?

forEach,for...in 和 for...of 是 JavaScript 中用于遍历数据的三种不同的结构。它们在遍历数组、对象和可迭代对象(如 Set 和 Map)时非常有用。尽管它们都可以用于循环遍历,但它们之间存在一些重要的区别: forEach&a…...

【Effective C++】条款45: 运用成员函数模板接受所有兼容的类型

假设有如下继承结构: class Top{}; class Middle: public Top{}; class Bottom: public Middle{};public继承意味着is-a关系,所有的基类都是派生类,但反之则不是,例如所有的学生都是人,但不是所有的人都是学生. 派生类到基类的指针可以直接隐式转换 Top* pt1 new Middle; T…...

WSL1 安装 debian xfce 用xrdp 导入远程桌面

凑合能用 晃晃行 晃晃不行 而且比较卡 还经常报崩溃 sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils apt install locales -y 安装过完应该会提示设置locales,如果安装完之后想要更改相关设置,可以使用如下命令重新设置loca…...

WPF RelativeSource属性-目标对象类型易错

上一篇转载了RelativeSource的三种用法,其中第二种用法较常见,这里记录一下项目中曾经发生错误的地方,以防自己哪天忘记了,又犯了同样错误—WPF RelativeSource属性-CSDN博客 先回顾一下: 控件关联其父级容器的属性—…...

Java while 和do while 循环

循环是程序中的重要流程结构之一。循环语句能够使程序代码重复执行,适用于需要重复一段代码直到满足特定条件为止的情况。 所有流行的编程语言中都有循环语句。Java 中采用的循环语句与C语言中的循环语句相似,主要有 while、do-while 和 for。 另外 Ja…...

应用软件安全编程--03净化传递给 Runtime.exec() 方法的非受信数据

每个 Java 应用都有一个 Runtime 类的实例, 一般需要使用 shell 时调用它,从而可以在 POSIX 中 使用/bin/sh 或者在Windows 平台中使用cmd.exe。 当参数中包含以空格、双引号或者其他以一/开头 的用来表示分支的字符时,就可能发生参数注入攻…...

uniapp阻止冒泡的方法,点击事件嵌套点击事件,怎么阻止同时触发

uniapp阻止冒泡的方法 当我们遇到点击事件嵌套点击事件的时候&#xff0c;点击里边的事件&#xff0c;外边的也会跟着触发该怎么办&#xff1f; 起初我尝试用了css里的修改z-index属性的方法&#xff0c;把里边的<view>标签放在上边&#xff0c;结果两个事件还是同时触发…...

【云原生基础】了解云原生,什么是云原生?

&#x1f4d1;前言 本文主要讲了云原生的基本概念和原则的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#x…...

Android.bp探究

有时不知道Android.bp要咋写&#xff0c;特意看了下源码&#xff1a; ./build/soong/androidmk/androidmk/android.go 简单的Android.bp的模板是下面这个样子&#xff1a; [module type] {name: "[name value]",[property1 name]&#xff1a;"[property1 val…...

【LeetCode】415 字符串相加

415. 字符串相加 给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 示例 1&#xff1a…...

【RP-RV1126】配置一套简单的板级配置

文章目录 官方配置新建一套新配置新建板级pro-liefyuan-rv1126.mk配置文件新建一个Buildroot的defconfigs文件 吐槽&#xff1a;RP-RV1126 的SDK奇怪的地方make ARCHarm xxx_defconfig 生成的.config文件位置不一样savedefconfig命令直接替换原配置文件坑爹的地方 Buildroot上增…...

解决uniapp的video标签和transition属性使用时出现错位的问题

template&#xff1a;三个视频都每个占满屏幕&#xff0c;点击按钮滚动最外层bgBox元素&#xff0c; style: 想要加上动画过渡效果&#xff1a; 这是显示第一个视频&#xff1a; 点按钮向上滑动滚动到第二个视频时&#xff1a; 视频错位了 &#xff0c;因为视频消失又出现的时候…...

电脑校园杂志电脑校园杂志社电脑校园编辑部2023年第9期目录

智慧校园 基于vue.js的“微校园”APP设计 吴秋伟 周慧 董锐 李仙云 余维 邓巧平 彭微1-3 探析AIGC对网络安全的革新&#xff1a;挑战与机遇共存 康良成 张朋4-6 文本信息自动摘要技术综述 滕宇飞7-9《电脑校园》投稿&#xff1a;cn7kantougao163.com 区块链应用于图书馆服务的策…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...