数据挖掘 | 实验三 决策树分类算法

文章目录

  • 一、目的与要求
  • 二、实验设备与环境、数据
  • 三、实验内容
  • 四、实验小结

一、目的与要求

1)熟悉决策树的原理;
2)熟练使用sklearn库中相关决策树分类算法、预测方法;
3)熟悉pydotplus、 GraphViz等库中决策树模型可视化方法。

二、实验设备与环境、数据

PC机 + Python3.7环境(pycharm、anaconda或其它都可以)
python库: sklearn、pydotplus、 GraphViz等,
提供鸢尾花数据集iris150条记录(150*5)包括一个类标号属性。

三、实验内容

1)算法原理
决策树算法依据对一系列属性取值的判定得出最终决策。在每个非叶子节点上进行一个特征属性的测试,每个分支表示这个特征属性在某个值域上的输出,而每个叶子节点对应于最终决策结果。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点对应的类别作为决策结果。算法的目的是产生一棵泛化性能强,即处理未见数据能力强的决策树。
2)具体要求
1)利用相应库中算法对鸢尾花数据构建决策树;
了解sklearn相关库中决策树分类方法的接口,清洗、预处理处理鸢尾花数据,说明该方法对数据集的要求。
2)可视化决策树;
了解pydotplus、GraphViz等相关库中决策树可视化方法的接口,结合上述构建方法中参数的设置,分析每次构建的树的层数及叶子数目。
3)分别查看训练集、测试集上模型的评估指标(准确率);
对鸢尾花数据进行分割,或使用交叉验证等方法对每次形成的决策树进行评估。
4)(选做)自己编写ID3/C4.5决策树分类算法,构建决策树,并评估模型。
首先对数据进行预处理,主要包括缺失值的处理以及连续属性的离散化方法;然后进行各个模型的实现,包括:数据集中属性的信息增益(或信息增益率、gini指数)的计算;选择最佳划分属性;以及构建决策树的递归方法等。
实验代码:

# -- coding: utf-8 --
import osfrom sklearn import tree
import pydotplus
from sklearn.datasets import load_iris  # 从sklearn包里datasets里导入数据集iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.tree import DecisionTreeClassifier  # 训练器
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.model_selection import cross_val_score
from pylab import *
from sklearn.tree import export_text
import randomos.environ["PATH"] += os.pathsep + r'D:\Environment\Graphviz2.38\bin'
# sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')  # 改变标准输出的默认编码
# print(os.environ.get('PATH'))
# Graphviz是一个开源的可视化图形工具,可以很方便的用来绘制结构化的图形网络,支持多种格式输出(需要独立的在系统内安装)
# 导入数据集
iris = load_iris()
# print(iris)
# print(iris.data) #原数据
# print(iris.target) #目标数据# 构建模型
# 用于构建决策树,创建分类器
# scikit-learn 提供的 DecisionTreeClassifier 类可以做二分类任务
# 模型的训练,拟合数据
clf = tree.DecisionTreeClassifier().fit(iris.data, iris.target)# X: 训练数据,稀疏或稠密矩阵;Y别标签,整型数组# 导出树的结构
r = export_text(clf, feature_names=iris['feature_names'])  # 以文本形式输出,决策树模型
print(r)
'''
tree.export_graphviz参数说明
为了能够准确的输出决策树规则,方法tree.export_graphviz当中一下参数必须设置成以下形式。其余参数使用默认的即可。
feature_names:特征名称,顺序必须和训练样本的数据一致
class_names:类别名称,输入的时候,必须要排序。如将原来的[‘1’, ‘0’]设置为[‘0’, ‘1’],注意:数据类型必须为str型的。
filled:填充,必须为True
node_ids:节点id,必须为True
rounded:画的图形边缘是否美化,必须为True
special_characters:必须为True
'''
# 以Graphviz格式导出
dot_data = tree.export_graphviz(clf,out_file=None,feature_names=iris.feature_names,filled=True,impurity=True,rounded=True)graph = pydotplus.graph_from_dot_data(dot_data)  # 以DOT数据进行graph绘制
graph.get_nodes()[7].set_fillcolor("#FFF2DD")  # 设置显示颜色
graph.write_png('iris.png')  # 保存成图片
#
# 训练集、测试集数据分割seed = random.randint(1, 2647483647)
# 随机将样本集合划分为训练集 和测试集,并返回划分好的训练集和测试集数据。
# train_test_split是交叉验证中常用的函数train_data:所要划分的样本特征集,train_target:所要划分的样本结果
# test_size:样本占比,如果是整数的话就是样本的数量
# random_state:是随机数的种子
train, test, train_label, test_label = train_test_split(iris.data, iris.target, test_size=0.3, random_state=seed)
# print(train,train_label)
# print(test,test_label)
# 选用机器学习算法
models = []  # 模型列表 模型算法对象加入列表
models.append(('DecisionTree', DecisionTreeClassifier()))  # 决策树
models.append(('GaussianNB', GaussianNB()))  # 朴素贝叶斯
models.append(('RandomForest', RandomForestClassifier()))  # 随机森林
models.append(('SVM', SVC()))  # 支持向量机SVM# 基于测试集test的预测及验证
for name, model in models:model.fit(train, train_label)  # 进行训练 用训练集和训练标签pre = model.predict(test)  # 用测试集进行预测results = model.score(test, test_label)  # 结果验证print("算法:{}\n准确率:{}{} ".format(name, results * 100, "%"))print(classification_report(test_label, pre, target_names=iris.target_names))
# 其中列表左边的一列为分类的标签名,右边support列为每个标签的出现次数.avg / total行为各列的均值(support列为总和).
# precision recall f1-score三列分别为各个类别的 精确度/召回率 F1值. F1值是精确度和召回率的调和平均值:
'''
classification_report函数用于显示主要分类指标的文本报告.在报告中显示每个类的精确度,召回率,F1值等信息。
主要参数:
y_true:1维数组,或标签指示器数组/稀疏矩阵,目标值。
y_pred:1维数组,或标签指示器数组/稀疏矩阵,分类器返回的估计值。
labels:array,shape = [n_labels],报表中包含的标签索引的可选列表。
target_names:字符串列表,与标签匹配的可选显示名称(相同顺序)。
sample_weight:类似于shape = [n_samples]的数组,可选项,样本权重。
digits:int,输出浮点值的位数.
'''# 交叉验证
print("-----------------交叉验证----------------")
X_train, X_test, Y_train, Y_test = train_test_split(iris.data, iris.target)
names = []
scores = []
for name, model in models:cfit = model.fit(X_train, Y_train)  # 训练cfit.score(X_test, Y_test)  # 分数cv_scores = cross_val_score(model, X_train, Y_train, cv=10)  # 分数scores.append(cv_scores)  # 加入names.append(name)  # 名称加入print("{}:{:.6f}  {:.6f}".format(name, cv_scores.mean(), cv_scores.std()))# 算法比较
fig = plt.figure()  # 创建画布
fig.suptitle('Prediction Accuracy of Four Algorithms')  # 设置标题:四种算法准确率比较
ax = fig.add_subplot(1, 1, 1)  # 新增子图或区域
# 比如221,指的就是将这块画布分为2×2,然后1对应的就是1号区
# 111  1 * 1 然后1对应的就是1号区
plt.ylabel('algorithm')  # 算法
plt.xlabel('Accuracy')  # 准确率
# patch_artist控制箱体图的填充,默认值为False, 此时箱体图的颜色指定的是表框的颜色,当取值为True时,color参数的值为箱体图的填充色,用法如下
plt.boxplot(scores, vert=False, patch_artist=True, meanline=False, showmeans=True)
# x :绘图数据。
# vert :是否需要将箱线图垂直放,默认垂直放。
# patch _ artist :是否填充箱体的颜色。
# meanline :是否用线的形式表示均值,默认用点表示。
# showmeans :是否显示均值,默认不显示。
ax.set_yticklabels(names)
plt.show()

实验截图:
决策树结构展示:
在这里插入图片描述
在这里插入图片描述

决策树分类器:
在这里插入图片描述

高斯分类器:
在这里插入图片描述

随机森林分类器:
在这里插入图片描述

支持向量机分类器:
在这里插入图片描述

交叉验证:
在这里插入图片描述

预测图:
在这里插入图片描述

四、实验小结

总结:

  1. 通过本次实验加深了我对决策树原理的理解,本次实验使用了4种分类算法进行分类,习了决策树模型的构建过程,分类算法,预测方法,以及决策树的可视化、最后进行交叉验证。
  2. 本次实验中用到了sklearn库,以及pydotplus库、GraphViz的使用,GraphViz的使用需要下载exe文件安装到电脑中并配置相应的环境变量才可以正常使用。
  3. 此次实验是通过使用不同算法对鸢尾花数据集进行分类以及预测,对比不同算法的准确率可知,在多次试验后SVM算法的效果较好,鸢尾花数据集还需要多多研究和掌握。
  4. 这些算法的区别和特点需要清楚,还有背后的原理需要掌握,并且加以实验才能更好的掌握这些知识。

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

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

相关文章

盘点2024年还在活跃发版的开源私有网盘项目附源码链接

时不时的会有客户上门咨询,丰盘ECM是不是开源项目,源码在哪里可以下载;如果需要和内部其他系统做集成,购买商业版的话,能否提供源代码做二次开发呢,等等诸多问题。 这里做个统一回复,丰盘ECM产…

Docker安装极简版(三分钟搞定)

什么是Docker? Docker是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 化。容器是…

MLPerf storage基准测试

MLPerf 基准测试 什么是 MLPerf?MLPerf™ 基准测试由来自学术界、研究实验室和行业的 AI 领导者联盟 MLCommons 开发,旨在对硬件、软件和服务的训练和推理性能进行无偏评估。它们都在规定的条件下进行。为了保持在行业趋势的前沿,MLPerf 不断…

0基础认识C语言(理论知识)

为了给0基础一个舒服的学习路径,就有了这个专栏希望带大家一起进步。 话不多说,开始正题。 一、C语言的一段小历史 C语言的设计要追溯到20世纪60年代末和70年代初,在那个时代美国有这么一号人叫做丹尼斯.里奇,他和同事肯.汤普逊…

计算机网络学习实践:DHCP跨网段动态分配IP

计算机网络学习实践:DHCP跨网段动态分配IP 1.实验准备 实验环境:思科的模拟器 实验设备: 1个服务器,2个二层交换机(不是三层的),4个PC机,1个路由器 三个网段 192.168.1.0 255.…

一些智能音箱类的软硬件方案

主要参考资料 Rabbit R1: https://www.rabbit.tech/rabbit-r1 mediatek-helio-p35: https://www.mediatek.com/products/smartphones-2/mediatek-helio-p35 NSdisplay: https://www.nsdisplay.com/ai-holobox-mini/ai-holobox-mini.html RK3566: https://www.rock-chips.com/a/…

Java学习Lambda表达式

Lambda表达式 有且只有一个未实现的方法叫做Lambda表达式,可以实现函数式编程 // 这个注解是用来检查你写的函数是否是函数式接口 FunctionalInterfaceinterface Myinterface {int sum(int a, int b);default String priteTitle(String name, int age, String sex)…

ASP+ACCESS酒店预定管理系统

【摘要】宏都大酒店管理信息系统中不能通过互联网方式进行客房预订,通过本次设计主要实现通过互联网方式进行客房预订。让客户足不出户坐在家里就能预订出自己想要的客房。主要功能有:酒店简介、客房简介、客房报价、客房预订信息提交,预订信…

Flutter基础 -- Dart 语言 -- 进阶使用

目录 1. 泛型 generics 1.1 泛型使用 1.2 泛型函数 1.3 构造函数泛型 1.4 泛型限制 2. 异步 async 2.1 异步回调 then 2.2 异步等待 await 2.3 异步返回值 3. 生成器 generate (了解) 3.1 同步生成器 sync* 使用 sync* 的场景 总结 3.2 异…

关于nodejs单线程

Node是使用C++语言写的一款JavaScrip解析器。 高并发 一般来说,高并发的解决方案就是多线程模型,服务器为每隔客户端请求分配一个线程,使用同步I/o,比如Apache就是这种策略,由于I/O一般都是耗时操作,因为这种策略很难实现高性能,但非常简单,可以实现复杂的交互逻辑。…

Python 的 os 和 shutil 模块

大家好,在日常的编程工作中,处理文件和目录是一个非常常见的任务。无论是创建、复制、移动还是删除文件,这些操作都需要我们与文件系统进行交互。在 Python 中,有两个强大的模块可以帮助我们轻松地进行文件和目录操作,…

Unity协程详解

什么是协程 协程,即Coroutine(协同程序),就是开启一段和主程序异步执行的逻辑处理,什么是异步执行,异步执行是指程序的执行并不是按照从上往下执行。如果我们学过c语言,我们应该知道&#xff0…

ctfshow-web入门-信息搜集(web11-web20)

目录 1、web11 2、web12 3、web13 4、web14 5、web15 6、web16 7、web17 8、web18 9、web19 10、web20 1、web11 域名其实也可以隐藏信息,比如flag.ctfshow.com 就隐藏了一条信息 查询域名的 DNS 记录,类型为 TXT(域名的说明&#…

三天不调休!端午节营销活动规划

今年端午节即将来临,大家将享受到一个三天不调休的小假期。这对各大企业来说,无疑是进行营销的黄金时机。企业可以精心策划和筹备各种具有端午特色的营销活动,吸引广大消费者参与,塑造浓厚的节日氛围,有效提升企业的销…

【Linux】使用 s3fs 挂载 MinIO 桶

s3fs(S3 File System)是一个基于FUSE(Filesystem in Userspace)的用户空间文件系统,可以将Amazon S3存储桶挂载到本地文件系统。通过s3fs,我们可以像操作本地文件一样,对S3存储桶中的数据进行读…

【随笔】Git 实战篇 -- 开心 commit 之后,发现有一处bug还需要改,只能 reset 撤销然后再次提交 -- git reset --(四十三)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

【数据结构】复杂度的重要性—–决定程序运行的效率

【数据结构】复杂度的重要性—–决定程序运行的效率 前言 在我们写算法的时候,常常会需要考虑一个问题:这个算法好不好?而这个“好”实际上就取决于是算法的复杂度。 算法复杂度(Algorithmic Complexity)是指算法在编…

私有仓库搭建

目前市面上比较常见的私有仓库搭建方法为: 通过 Sinopia 或 verdaccio 搭建(Sinopia 已经停止维护,verdaccio 是 Fork 自 Sinopia,基本上大同小异),其优点是搭建简单,不需要其他服务。通过 cnp…

代码随想录--哈希表--两数之和

题目 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。 示例: 给定 nums [2, 7, 11, 15], t…

【JAVA SE】抽象类和接口

✨✨欢迎大家来到Celia的博客✨✨ 🎉🎉创作不易,请点赞关注,多多支持哦🎉🎉 所属专栏:JAVA 个人主页:Celias blog~ 目录 引言 一、抽象类 1.1 抽象类的定义 1.2 抽象方法 1.3 抽象…