机器学习——决策树学习

机器学习——决策树学习

  • 一、什么是决策树
  • 二、决策树的学习过程
    • 特征选择:
    • 决策树生成:
    • 剪枝:
  • 三、决策树的一个具体的实例
    • 导入数据
      • python strip() 函数和 split() 函数的详解及实例
    • 数据处理
      • 提取到训练集中的标签
      • 给数据的每一列添加上标签,并且转化为字典来存储每一列
      • 需要将数据转化为使用数值来代表的数据(字符串)——序列化
    • 调用库函数
    • 绘制决策树
    • 进行预测

决策树:在机器学习中,决策树是一个预测模型,它代表的是对象属性和对象值之间的一种映射关系
决策树的构建步骤:
1特征的选择
2决策树的生成
3决策树的修剪

参考文档:决策树算法内容讲解

一、什么是决策树

所谓决策树,就是一个类似于流程图的树形结构,树内部的每一个节点代表的是对一个特征的测试,树的分支代表该特征的每一个测试结果,而树的每一个叶子节点代表一个类别。树的最高层是就是根节点。下图即为一个决策树的示意描述,内部节点用矩形表示,叶子节点用椭圆表示。

在这里插入图片描述

二、决策树的学习过程

一棵决策树的生成过程主要分为以下3个部分:

特征选择:

特征选择是指从训练数据中众多的特征中选择一个特征作为当前节点的分裂标准,如何选择特征有着很多不同量化评估标准标准,从而衍生出不同的决策树算法。

  1. 特征的选择
    方法一:信息增益
    方法二:信息熵
    方法三:基尼指数

决策树生成:

根据选择的特征评估标准,从上至下递归地生成子节点,直到数据集不可分则停止决策树停止生长。 树结构来说,递归结构是最容易理解的方式。
2. 决策树的生成(树的构建是个递归的过程)

剪枝:

决策树容易过拟合,一般来需要剪枝,缩小树结构规模、缓解过拟合。剪枝技术有预剪枝和后剪枝两种。
3. 决策树的修剪
方法一:预剪枝,及时停止树增长
方法二:后剪枝

三、决策树的一个具体的实例

所用到的资料:(完整的代码和处理文件)
链接:https://pan.baidu.com/s/1fIAUdCDTpR7TiqLHZtx1yg
提取码:0929

导入数据

python strip() 函数和 split() 函数的详解及实例

一直以来都分不清楚strip和split的功能,实际上strip是删除的意思而split则是分割的意思。因此也表示了这两个功能是完全不一样的,strip可以删除字符串的某些字符,而split则是根据规定的字符将字符串进行分割。
split()函数
split():拆分字符串。通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)

#导入数据with open('lenses.txt', 'r') as fr:                                        #加载文件lenses = [inst.strip().split('\t') for inst in fr.readlines()]        #处理文件print("输出读取到的数据:")print(lenses)
   inst=[]data=[]with open('lenses.txt', 'r') as fr:for inst in fr.readlines():#一行一行的读取print(inst.strip().split('\t'))data.append(inst.strip().split('\t'))print('输出读取到的全部数据:')print(data)

在这里插入图片描述

数据处理

在使用回归模型和机器学习模型时,所有考察数据都是数值更容易得到更好的结果。因为都是基于数学函数方法的,所以当数据集中出现类别数据时,此时数据是不理想的,不能用数学方法处理它们。例如处理性别属性时,将男和女两个性别数据用0和1进行代替。

提取到训练集中的标签

data_target=[]for each in data:data_target.append(each[-1])#因为在原有数据集中在最后一列print("输出提取到训练集中的标签:")print(data_target)

给数据的每一列添加上标签,并且转化为字典来存储每一列

 dataLabels = ['age', 'prescript', 'astigmatic', 'tearRate']  # 特征标签data_list=[]#临时存储全部数据data_dict={} #保存data数据的字典,用于生成pandasfor each_label in dataLabels:for each_data in data:data_list.append(each_data[dataLabels.index(each_label)])print("输出每一列的数据:")print(data_list)data_dict[each_label]=data_listdata_list=[]print("打印字典信息:")print(data_dict )

需要将数据转化为使用数值来代表的数据(字符串)——序列化

在这里插入图片描述

在使用回归模型和机器学习模型时,所有考察数据都是数值更容易得到更好的结果。因为都是基于数学函数方法的,所以当数据集中出现类别数据时,此时数据是不理想的,不能用数学方法处理它们。例如处理性别属性时,将男和女两个性别数据用0和1进行代替。

使用:LabelEncoder()将object类型转化为数值

data_pd=pd.DataFrame(data_dict)print("转化为pd.DataFrame类型方便序列化")print(data_pd)le=LabelEncoder()for col in data_pd.columns:data_pd[col]=le.fit_transform(data_pd[col])print("序列化处理:")print(data_pd)

在这里插入图片描述在这里插入图片描述

#数据处理阶段lenses_target = []                                                        #提取每组数据的类别,保存在列表里for each in lenses:lenses_target.append(each[-1])                                      #从最后一列提取标签print("提取每组数据的类别标签,保存在列表里:")print(lenses_target)lensesLabels = ['age', 'prescript', 'astigmatic', 'tearRate']            #特征标签lenses_list = []                                                        #保存lenses数据的临时列表lenses_dict = {}                                                        #保存lenses数据的字典,用于生成pandasfor each_label in lensesLabels:                                            #提取信息,生成字典for each in lenses:lenses_list.append(each[lensesLabels.index(each_label)])lenses_dict[each_label] = lenses_list#print(lenses_dict)lenses_list = []print("打印字典信息:")print(lenses_dict)                                                        #打印字典信息lenses_pd = pd.DataFrame(lenses_dict)                                    #生成pandas.DataFrameprint("打印pandas.DataFrame:")print(lenses_pd)                                                        #打印pandas.DataFrameprint("数据序列化:")le = LabelEncoder()                                                        #创建LabelEncoder()对象,用于序列化for col in lenses_pd.columns:                                            #序列化lenses_pd[col] = le.fit_transform(lenses_pd[col])print("打印编码信息:")print(lenses_pd)

调用库函数

  #调用库函数clf = tree.DecisionTreeClassifier(max_depth = 4)     #最多一共四层                   #创建DecisionTreeClassifier()类clf = clf.fit(lenses_pd.values.tolist(), lenses_target)                    #使用数据,构建决策树

绘制决策树

  # 绘制决策树dot_data = StringIO()tree.export_graphviz(clf, out_file=dot_data,feature_names=lenses_pd.keys(),class_names=clf.classes_,filled=True, rounded=True,special_characters=True)graph = pydotplus.graph_from_dot_data(dot_data.getvalue())graph.write_jpg('decision_tree预测决策树.jpg')

进行预测

 #进行预测print("预测:[[presbyopic,myope,yes,normal],[presbyopic,hyper,yes,normal]]")print(clf.predict([[1, 1, 1, 0], [1, 0, 1, 0]]))

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

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

相关文章

微软:Excel公式是世界上使用最广泛的编程语言

喜欢就关注我们吧!文|一君微软近日推出了一项 Excel 公式构建的新功能 LAMBDA,正则测试阶段。LAMBDA 允许使用 Excel 自身的公式语言自定义功能,而过去,Excel 中需要通过 JS 等语言编写自定义函数。同时,LAMBDA 还可以…

机器学习——文件的读取

机器学习——文件的读取(一).txt文件的读取(二)excel文件读取操作(一).txt文件的读取 txt的链接 链接:https://pan.baidu.com/s/1fIAUdCDTpR7TiqLHZtx1yg 提取码:0929 python strip() 函数和 split() 函数的详解及实例 一直以来都分不清楚strip和split…

linux select读取节点数据失败_MySQL中覆盖索引查询和select*查询执行结果案例分析...

索引优化建议在MySQL中要尽可能使用覆盖索引进行检索,只访问索引的查询(索引列和查询列一致),减少select * 可提高查询效率覆盖索引(Covering Index)理解方式一:就是select的数据列只用从索引中就能够取得,不必读取数据行,MySQL可…

使用 Azure WAF 羞辱黑客的智商

点击上方蓝字关注“汪宇杰博客”导语还记得之前给大家介绍过的《使用 Azure Web 应用防火墙拦截黑客攻击》吗?今天我又带来了一个有趣的 Azure WAF 小技巧,可以让你爽一把。好奇的黑客今天 Azure Application Insights 上发现了一段集中时间的404错误&am…

机器学习之乳腺癌问题(SVM)

机器学习之乳腺癌问题SVM题目所需的代码及数据利用SVM建模SVM调参题目所需的代码及数据 链接:https://pan.baidu.com/s/1bS7Ku_PUfcimiVkmLz9Fzw 提取码:0929 利用SVM建模 import matplotlib.pyplot as plt import pandas as pd import numpy as npfro…

如何将日志记录到 Windows事件日志 中

每当出现一些未捕获异常时,操作系统都会将异常信息写入到 Windows 事件日志 中,可以通过 Windows 事件查看器 查看,如下图:这篇文章将会讨论如何使用编程的方式将日志记录到 Windows 事件日志 中。安装 EventLog 要想在 .NET Core…

【Java】springboot

文章目录 Spingboot1、起步依赖2、构建springboot工程jar包3、springboot配置文件4、多环境配置5、maven和boot多环境兼容问题6、配置文件分类7、springboot整合mybatis Spingboot springboot用来简化spring的初始搭建以及开发过程。 比方说,创建一个springmvc程序…

数据科学与python语言——Matplotlib数据可视化基础

Matplotlib数据可视化基础一.读取数据与数据处理阶段1.提取指定行中的数据2.得到>指定数值的数据3.得到指定值得数据4.整体的数据处理:二.画图函数1.plt.subplots()2.plt.subplots_adjust()3.设置x轴y轴的刻度和标签4.使用中文标题在作图时三.画折线图(plot)四.画…

2021年,Azure云遇到. NET5,注定开启高光时刻,微软的心,真大!

云开发诞生的市场背景云开发是一个已经存在了很多年的概念,但在过去未能真正成为主流。然而,由于云和软件即服务的宏观趋势的结合,以及技术的进步,如容器技术 Docker 和 Kubernetes,云开发现在有机会最终成为基于云的应…

.net5+nacos+ocelot 配置中心和服务发现实现

相关文章:手动造轮子——为Ocelot集成Nacos注册中心出处:https://www.cnblogs.com/buruainiaaaa/p/14121176.html作者:唐 最近一段时间 因公司业务需要,需要使用.net5做一套微服务的接口,使用nacos 做注册中心和配置中…

数据科学与python语言——Pandas统计分析基础(时间转换+聚合)

Pandas统计分析基础(时间转换聚合)实验要求一实验二要求全部代码实验要求一 #M表的时间戳类型转为datetime data_Mete[TIMESTAMP]pd.to_datetime(data_Mete[TIMESTAMP],format%Y%m%d%H%M%S)data_VI[Date]pd.to_datetime(data_VI[Date],format%Y/%m/%d) p…

容器的那点事

当我们的后端服务器不够用的时候,我们可以通过容器技术,可以快速的把这些服务器全部虚拟出来, 当然这个虚拟跟虚拟机是不一样的,比虚拟机的方式快多了,早期阿里的淘宝平台如果整个坏掉了,重新搭建部署起来需…

lqb——修改数组

思路 **常规思路用哈希表的思想,设置bool数组标识是否被占用过,但是发生矛盾时将会造成查找需要遍历整个数组,比如,1,2,3……100000已连续占用,此时再插入1,将会一直遍历这100000个数,极端情况下,插入100000个1,将是n平方的复杂度。 如何快速查找到插入位置,这就引…

bp神经网络训练_数据分析模型6——神经网络基础(人工智能的底层模型)

未经许可请勿转载更多数据分析内容参看这里今天我们来学习人工智能的底层模型——神经网络(NEURAL NETWORKS),现在比较热门的一个模型是深度学习,深度学习的基础也是神经网络,要学好深度学习,神经网络不了解…

四种最令人讨厌的编程语言:Java、Javascript、C++和Perl

喜欢就关注我们吧!TIOBE 12 月榜单已于日前公布,在最新的排行榜中,C 语言仍高居榜首,其次分别是 Java、Python 和 C。在编程语言这一领域中,许多编程语言都会随着时间的推移而经历人气的激增,以及历史迭代之…

微软用的工具,统一财务三大表及高级分析通用模板

虽然罗叔并非财务专业,但大概了解一些财务常识。例如财务报表的三大报表以及一些常见分析等。本月《BI真经》视频课程即将就绪,后续罗叔将和大家开展更多的业务研究。我们知道,PowerBI 在绘制某些报告时候很难,初学者根本无法实现…

文件 单片机_如何查看你写的单片机程序有多大?

单片机我们都用过,我们知道单片机的FLASH有4K的,有8K的,单片机程序我们也写过,但是我们写好的程序有多大,你知道吗?程序写好并编译后生成hex文件,这个hex文件就是要下载到单片机里的文件&#x…

css less 不要作用到子对象_使用Less实现网站主题切换

v-easy-components change theme很多初学前端的开发同学一定有一种想法,就是如何更改网站的主题。前年(2018),我也陷入了思考,如何切换网站主题呢?当时不知道less,只想到一种办法,就…

展望2021,Java、Go、.NET,谁主沉浮?

伴随着年底.NET社区活动,近日跟几位微软MVP大佬聊天请益,收获颇丰。程序员都有个话题避不开,就是各编程语言的优劣,大佬们的见识既有意思也有深度,这里为大家整理一下,其中Java、Golang和.NET是讨论焦点。J…

labuladong 的算法小抄_关于算法笔试的几个套路,一点就透

以下文章来源于labuladong ,作者labuladong我知道各位是被标题吸引进来的,那就不废话,先说几个算法笔试的硬核套路,再说说语言选择和做题复习的策略。避实就虚大家也知道,大部分笔试题目都需要你自己来处理输入数据&am…