机器学习实验二-----决策树构建

决策树是机器学习中一种基本的分类和回归算法,是依托于策略抉择而建立起来的树。本文学习的是决策树的分类

1. 构建决策树流程

  1. 选择算法:常用的算法包括ID3、C4.5、CART等。

  2. 划分节点:根据数据特征和算法选择,递归地划分节点,直到满足停止条件。

  3. 决策树剪枝:对决策树进行剪枝操作,减少决策树的复杂度,提高泛化能力。

  4. 决策树评估:使用测试数据集评估决策树模型的性能,通常使用准确率、召回率、F1值等。

2.常用的三个算法

2.1 ID3

D3采用信息增益来划分属性。

2.12 信息熵

用来衡量数据集的混乱程度,信息熵越大,表明数据集的混乱程度越大,不确定性越大。

公式:H(X=xi)=-\sum_{1}^{n}pi log pi

其中pi表示的是分类为xi这个样本在中的占比。

2.12信息增益

 划分数据集之前之后信息发生的变化      

公式:Gain(D,a)=Ent(D)-\sum_{v=1}^{V}\frac{\left | D^{v} \right |}{\left | D \right |}Ent(D^{v})

信息增益越大,则意味着采用该属性a划分节点获得的纯度提升更大。在每次划分中采用信息增益最大的划分。

信息增益实际上就是数据集整体的信息熵减去使用特征 a进行划分后各子集的加权平均信息熵,即子集的信息熵的期望值。当信息增益越大时,意味着子集的信息熵的减少量越大,即数据集的不确定性减少的程度更大,信息熵变小。

2.2   C4.5

C4.5算法在ID3算法上做了提升,使用信息增益比来构造决策树,且有剪枝功能防止过拟合。

信息增益比:特征a对训练集D的信息增益比定义为特征a的信息增益与训练集D对于a的信息熵之比, 同样是信息增益比越大越好。

公式:Gain_radio(D,a)=\frac{Gain(D,a)}{H(D,a)}

先剪枝:提前停止树的构建而对树”剪枝“,提前停止的策略有定义一个树的深度,到达指定深度自动停止构造;

后剪枝:先构造完整的子树,对于决策树中信息增益比较低的子树用叶子节点代替。

2.3 CART基尼指数

基尼指数是衡量数据集纯度或不确定性的一种指标,常用于决策树算法中的特征选择和节点划分。

公式:\text{Gini}(D) = 1 - \sum_{k=1}^{K} (p_k)^2

基尼指数越小越好。

3.划分节点

划分节点就是根据我们选择的算法来进行划分的,我们这边拿C4.5算法来举例一下。拿鸢尾花来举例一下,我们有花萼长度,花萼宽度,花瓣长度,花瓣宽度四个特征值。我们分别计算一下每一个的熵,根据公式计算出信息增益比,选择按照信息增益比大小排序的特征来当划分的依据。这边假设我们排序就是花萼长度,花萼宽度,花瓣长度,花瓣宽度,那我们先按照花萼长度把根节点划分为左右子树,子树再根据花萼宽度把子树再继续划分,一直用递归来划分每一个节点。最后就得到整棵树。

4. 决策树的剪枝

决策树生成算法递归的产生决策树,直到不能继续下去为止,这样产生的树往往对训练数据的分类很准确,但对未知测试数据的分类缺没有那么精确,即会出现过拟合现象。

过拟合产生的原因在于在学习时过多的考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树,解决方法是考虑决策树的复杂度,对已经生成的树进行简化。

剪枝:从已经生成的树上裁掉一些子树或叶节点,并将其根节点或父节点作为新的叶子节点,从而简化分类树模型。

剪枝分为预剪枝与后剪枝。

预剪枝是指在决策树的生成过程中,对每个节点在划分前先进行评估,若当前的划分不能带来泛化性能的提升,则停止划分,并将当前节点标记为叶节点。

后剪枝是指先从训练集生成一颗完整的决策树,然后自底向上对非叶节点进行考察,若将该节点对应的子树替换为叶节点,能带来泛化性能的提升,则将该子树替换为叶节点。

5.决策树构建

这个函数直接依据我们所给的数据用C4.5创建了决策树

clf.fit(X_train, y_train)

6.决策树可视化

使用了export_graphviz函数从训练好的决策树模型中生成一个Graphviz格式的文本文件,然后使用graphviz.Source将这个文本文件转换为一个Graphviz对象,最后使用render方法将这个对象渲染为图形文件。

dot_data = export_graphviz(clf, out_file=None,feature_names=["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"],class_names=["setosa", "versicolor", "virginica"],filled=True, rounded=True,special_characters=True)
graph = graphviz.Source(dot_data)
graph.render("iris_decision_tree") graph.view()

 运行这个代码得到创建的决策树会包含我们数据集内的所有东西,我的鸢尾花数据集中每个特征的信息增益比在不同的条件下就得到下面这棵树的划分标准。

完整代码展现:

import pandas as pd
from sklearn.tree import DecisionTreeClassifierdef load_data(train_file, test_file):train_data = pd.read_csv(train_file, sep='\s+')test_data = pd.read_csv(test_file, sep='\s+')X_train = train_data[["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"]].valuesy_train = train_data["Species"].valuesX_test = test_data[["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"]].valuesy_test = test_data["Species"].valuesreturn X_train, y_train, X_test, y_testclf = DecisionTreeClassifier()train_file = "C:\\Users\\李烨\\Desktop\\新建文件夹\\6\\iris.txt"
test_file = "C:\\Users\\李烨\\Desktop\\新建文件夹\\6\\iristest.txt"
X_train, y_train, X_test, y_test = load_data(train_file, test_file)clf.fit(X_train, y_train)def predict_flower(sepal_length, sepal_width, petal_length, petal_width):input_features = [[sepal_length, sepal_width, petal_length, petal_width]]prediction = clf.predict(input_features)if prediction[0] == 'setosa':print("预测类别:setosa")elif prediction[0] == 'versicolor':print("预测类别:versicolor")elif prediction[0] == 'virginica':print("预测类别:virginica")else:print("未知类别")return prediction[0]def get_input():sepal_length = float(input("请输入花萼长度:"))sepal_width = float(input("请输入花萼宽度:"))petal_length = float(input("请输入花瓣长度:"))petal_width = float(input("请输入花瓣宽度:"))return sepal_length, sepal_width, petal_length, petal_widthprint("实验二决策树分类")
while True:try:user_input = input("输入 'exit' 退出:")if user_input.lower() == 'exit':print("程序结束")breaksepal_length, sepal_width, petal_length, petal_width = get_input()result = predict_flower(sepal_length, sepal_width, petal_length, petal_width)except ValueError:print("输入有误,请重新输入。")

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

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

相关文章

亚信安全数据安全运营平台DSOP新版本发布 注入AI研判升维

在当今快速发展的数字经济时代,企业对于数据的依赖日益加深,数据安全已成为企业的生命线。亚信安全推出数据安全运营平台DSOP全新版本,正是为满足企业对数据安全的高度需求而设计。这款平台以其卓越的能力和技术优势,为企业的数据…

漂亮的七彩引导页导航HTML源码

源码介绍 漂亮的七彩引导页导航HTML源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 效果截图 源码下载 漂亮的七彩…

notepad++安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Notepad是一款开源的、免费的文本编辑器,它最初由侯今吾基于Scintilla文本编辑组件独立研发。Notepad以GPL发布,并拥有完整的中文化接口,支持多国语言编写的功能(采用UTF8技术&…

初始Next.js

版本: 本系列next.js基于的是目前最新版本的 v14 版本,需要 Node.js 18.17 及以后版本 创建项目: 最快捷的创建 Next.js 项目的方式是使用 create-next-app脚手架,你只需要运行: npx create-next-applatest&&am…

【C++题解】1565. 成绩(score)

问题:1565. 成绩(score) 类型:基本运算、小数运算 题目描述: 牛牛最近学习了 C 入门课程,这门课程的总成绩计算方法是: 总成绩作业成绩 20% 小测成绩 30% 期末考试成绩 50%。 牛牛想知道&am…

04-15 周一 GitHub仓库CI服务器actions-runner和workflow yaml配置文档解析

04-15 周一 GitHub仓库CI服务器配置过程文档 时间版本修改人描述2024年4月15日10:35:52V0.1宋全恒新建文档2024年4月17日10:33:20v1.0宋全恒完成github actions CI的配置和工作流配置文件解读文档的撰写 简介 一些基础概念 前提知识 仓库介绍 地址镜像介绍https://github.…

GIT上超火的阿里内部1000页Java核心笔记,啃完竟然拿到阿里P7offer!

除了ReetrantLock,你还接触过JUC中的哪些并发工具? 请谈谈ReadWriteLock 和StampedLock。 如何让Java的线程彼此同步?你了解过哪些同步器?请分别介绍下。 CyclicBarrier和CountDownLatch看起来很相似,请对比下呢&am…

Django中的数据库优化与ORM性能调优【第169篇—ORM性能调优】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Django中的数据库优化与ORM性能调优 在开发基于Django的Web应用程序时,数据库是…

让一个元素在网页上跟随网页窗口大小变化始终保持上下左右居中

废话少说&#xff0c;直接上代码&#xff0c;懂的都懂&#xff1a; <!DOCTYPE html> <html style"font-size: 100px;"> <head><meta http-equiv"Content-Type" content"text/html;charsetUTF-8"><style type"te…

CTFHUB-技能树-Web前置技能-文件上传(前端验证—文件头检查)

CTFHUB-技能树-Web前置技能-文件上传&#xff08;前端验证—文件头检查&#xff09; 文章目录 CTFHUB-技能树-Web前置技能-文件上传&#xff08;前端验证—文件头检查&#xff09;前端验证—文件头检查题目解析 各种文件头标志 前端验证—文件头检查 题目考的是&#xff1a;pn…

Spring之CGLIB和JDK动态代理底层实现

目录 CGLIB 使用示例-支持创建代理对象&#xff0c;执行代理逻辑 使用示例-多个方法&#xff0c;走不同的代理逻辑 JDK动态代理 使用示例-支持创建代理对象&#xff0c;执行代理逻辑 Spring会自动在JDK动态代理和CGLIB之间转换: 1、如果目标对象实现了接口&#xff0c;默…

【计组】计算机系统概述

文章目录 前言正文计算机的发展历程什么是计算机系统硬件的发展历程软件的发展 计算机硬件的基本组成冯诺依曼体系结构(存储程序型电脑)现代计算机的结构 各硬件的工作原理主存储器的基本组成运算器的基本组成控制器的基本组成计算机的工作过程 计算机系统的层次结构计算机的性…

AWS Key disabler:AWS IAM用户访问密钥安全保护工具

关于AWS Key disabler AWS Key disabler是一款功能强大的AWS IAM用户访问密钥安全保护工具&#xff0c;该工具可以通过设置一个时间定量来禁用AWS IAM用户访问密钥&#xff0c;以此来降低旧访问密钥所带来的安全风险。 工具运行流程 AWS Key disabler本质上是一个Lambda函数&…

Go 语言中的 GIF 图像处理完全指南:`image/gif`的技术与实践

Go 语言中的 GIF 图像处理完全指南&#xff1a;image/gif的技术与实践 概述安装与基础设置导入 image/gif 包初步配置示例&#xff1a;设置一个简单的 GIF 编码环境 读取与解码 GIF 图像读取 GIF 文件解析 GIF 数据 创建与编码 GIF 图像创建 GIF 图像编码 GIF 图像 处理 GIF 动…

书生·浦语大模型实战训练营第二期第四节--Xtuner微调LLM--notebook

XTuner微调LLM课程笔记 一、Finetune简介 1.为什么模型要做微调&#xff1f; 现在其实大部分的大模型应该叫做“基座模型”&#xff0c;也就是基于普遍性的任务去进行与训练的&#xff0c;所以如果想让它落地在特定的下游领域中&#xff0c;它的表现必然是不如在领域内训练的模…

【devops】 阿里云挂载云盘 | 扩展系统硬盘 | 不重启服务器增加硬盘容量

扩容分区和文件系统&#xff08;Linux&#xff09; 文档地址 https://help.aliyun.com/zh/ecs/user-guide/extend-the-partitions-and-file-systems-of-disks-on-a-linux-instance?spm5176.smartservice_service_robot_chat_new.help.dexternal.4ac4f625Ol66kL#50541782adxmp…

Go 之 sync.Mutex 加锁失效现象

我先声明一下&#xff0c;并不是真的加锁失效&#xff0c;而是我之前的理解有误&#xff0c;导致看起来像是加锁失效一样。于是乎记录一下&#xff0c;加深一下印象。 我之前有个理解误区&#xff08;不知道大家有没有&#xff0c;有的话赶紧纠正一下——其实也是因为我这块的…

【在线OJ系统】自定义注解实现分布式ID无感自增

实现思路 首先自定义参数注解&#xff0c;然后根据AOP思想&#xff0c;找到该注解作用的切点&#xff0c;也就是mapper层对于mapper层的接口在执行前都会执行该aop操作&#xff1a;获取到对于的方法对象&#xff0c;根据方法对象获取参数列表&#xff0c;根据参数列表判断某个…

html接入高德地图

1.申请key key申请地址&#xff1a;https://console.amap.com/dev/key/app 官方文档 https://lbs.amap.com/api/javascript-api-v2/summary 2.html接入示例 需要将YOUR_KEY替换成自己的key <!doctype html> <html> <head><meta charset"utf-…

IDEA 安装、基本使用、创建项目

文章目录 下载基本使用修改颜色主题Keymap插件 创建项目创建模块新建 Java 类运行新建 Package打包 Jar运行 jar 包 查看文档 下载 官方下载地址&#xff1a;https://www.jetbrains.com/zh-cn/idea/download/?sectionmac 这里我下载 macOS 社区版&#xff0c;IDEA 2024.1 (C…