【Sklearn】基于决策树算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于决策树算法的数据分类预测(Excel可直接替换数据)

  • 1.模型原理
    • 1.1 模型原理
    • 1.2 数学模型
  • 2.模型参数
  • 3.文件结构
  • 4.Excel数据
  • 5.下载地址
  • 6.完整代码
  • 7.运行结果

1.模型原理

决策树是一种基于树状结构的分类和回归模型,它通过一系列的决策规则来将数据划分为不同的类别或预测值。决策树的模型原理和数学模型如下:

1.1 模型原理

决策树的基本思想是从根节点开始,通过一系列的节点和分支,根据不同特征的取值将数据集划分成不同的子集,直到达到叶节点,然后将每个叶节点分配到一个类别或预测值。决策树的构建过程就是确定如何选择特征以及如何划分数据集的过程。

决策树的主要步骤:

  1. 选择特征: 从所有特征中选择一个最佳特征作为当前节点的划分特征,这个选择通常基于某个度量(如信息增益、基尼系数)来评估不同特征的重要性。

  2. 划分数据集: 根据选择的特征,将数据集划分成多个子集,每个子集对应一个分支。

  3. 递归构建: 对每个子集递归地重复步骤1和步骤2,直到满足停止条件,如达到最大深度、样本数不足等。

  4. 叶节点赋值: 在构建过程中,根据训练数据的真实标签或均值等方式,为叶节点分配类别或预测值。

1.2 数学模型

在数学上,决策树可以表示为一个树状结构,其中每个节点表示一个特征的划分,每个分支代表一个特征取值的分支。具体来说,每个节点可以由以下元素定义:

  1. 划分特征: 表示选择哪个特征进行划分。

  2. 划分阈值: 表示在划分特征上的取值阈值,用于将数据分配到不同的子集。

  3. 叶节点值: 表示在达到叶节点时所预测的类别或预测值。

在决策树的训练过程中,我们寻找最优的划分特征和划分阈值,以最大程度地减少不纯度(或最大程度地增加信息增益、降低基尼指数等)。

数学模型可以用以下形式表示:

f ( x ) = { C 1 , if  x  belongs to region  R 1 C 2 , if  x  belongs to region  R 2 ⋮ ⋮ C k , if  x  belongs to region  R k f(x) = \begin{cases} C_1, & \text{if } x \text{ belongs to region } R_1 \\ C_2, & \text{if } x \text{ belongs to region } R_2 \\ \vdots & \vdots \\ C_k, & \text{if } x \text{ belongs to region } R_k \end{cases} f(x)= C1,C2,Ck,if x belongs to region R1if x belongs to region R2if x belongs to region Rk

其中, C i C_i Ci表示叶节点的类别或预测值, R i R_i Ri表示根据特征划分得到的子集。

总之,决策树通过递归地选择最佳特征和阈值,将数据集划分为多个子集,最终形成一个树状结构的模型,用于分类或回归预测。

2.模型参数

DecisionTreeClassifierscikit-learn库中用于构建决策树分类器的类。它具有多个参数,用于调整决策树的构建和性能。以下是一些常用的参数及其说明:

  1. criterion: 衡量分割质量的标准。可以是"gini"(基尼系数)或"entropy"(信息熵)。默认为"gini"。

  2. splitter: 用于选择节点分割的策略。可以是"best"(选择最优的分割)或"random"(随机选择分割)。默认为"best"。

  3. max_depth: 决策树的最大深度。如果为None,则节点会扩展,直到所有叶节点都是纯的,或者包含少于min_samples_split个样本。默认为None。

  4. min_samples_split: 节点分裂所需的最小样本数。如果一个节点的样本数少于这个值,就不会再分裂。默认为2。

  5. min_samples_leaf: 叶节点所需的最小样本数。如果一个叶节点的样本数少于这个值,可以合并到一个叶节点。默认为1。

  6. min_weight_fraction_leaf: 叶节点所需的最小权重分数总和。与min_samples_leaf类似,但是使用样本权重而不是样本数量。默认为0。

  7. max_features: 寻找最佳分割时要考虑的特征数量。可以是整数、浮点数、字符串或None。默认为None。

  8. random_state: 随机数生成器的种子,用于随机性控制。默认为None。

  9. max_leaf_nodes: 最大叶节点数。如果设置,算法会通过去掉最不重要的叶节点来合并其他节点。默认为None。

  10. min_impurity_decrease: 分割需要达到的最小不纯度减少量。如果分割不会降低不纯度超过这个阈值,则节点将被视为叶节点。默认为0。

  11. class_weight: 类别权重,用于处理不平衡数据集。

这些是DecisionTreeClassifier中一些常用的参数。根据你的数据和问题,你可以根据需要调整这些参数的值,以获得更好的模型性能。在实际应用中,根据数据的特点进行调参非常重要。

3.文件结构

在这里插入图片描述

iris.xlsx						% 可替换数据集
Main.py							% 主函数

4.Excel数据

在这里插入图片描述

5.下载地址

- 资源下载地址

6.完整代码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns

def decision_tree_classification(data_path, test_size=0.2, random_state=42):
    # 加载数据
    data = pd.read_excel(data_path)

    # 分割特征和标签
    X = data.iloc[:, :-1]  # 所有列除了最后一列
    y = data.iloc[:, -1]   # 最后一列

    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)

    # 创建决策树分类器
    # 1. ** criterion: ** 衡量分割质量的标准。可以是"gini"(基尼系数)或"entropy"(信息熵)。默认为"gini"。
    # 2. ** splitter: ** 用于选择节点分割的策略。可以是"best"(选择最优的分割)或"random"(随机选择分割)。默认为"best"。
    # 3. ** max_depth: ** 决策树的最大深度。如果为None,则节点会扩展,直到所有叶节点都是纯的,或者包含少于min_samples_split个样本。默认为None。
    # 4. ** min_samples_split: ** 节点分裂所需的最小样本数。如果一个节点的样本数少于这个值,就不会再分裂。默认为2。
    # 5. ** min_samples_leaf: ** 叶节点所需的最小样本数。如果一个叶节点的样本数少于这个值,可以合并到一个叶节点。默认为1。
    # 6. ** min_weight_fraction_leaf: ** 叶节点所需的最小权重分数总和。与min_samples_leaf类似,但是使用样本权重而不是样本数量。默认为0。
    # 7. ** max_features: ** 寻找最佳分割时要考虑的特征数量。可以是整数、浮点数、字符串或None。默认为None。
    # 8. ** random_state: ** 随机数生成器的种子,用于随机性控制。默认为None。
    # 9. ** max_leaf_nodes: ** 最大叶节点数。如果设置,算法会通过去掉最不重要的叶节点来合并其他节点。默认为None。
    # 10. ** min_impurity_decrease: ** 分割需要达到的最小不纯度减少量。如果分割不会降低不纯度超过这个阈值,则节点将被视为叶节点。默认为0。
    # 11. ** class_weight: ** 类别权重,用于处理不平衡数据集。
    # 使用gini作为分割标准,设置最大深度为3,最小样本数为5
    model = DecisionTreeClassifier(criterion='gini', max_depth=3, min_samples_split=5)

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

    # 在测试集上进行预测
    y_pred = model.predict(X_test)

    # 计算准确率
    accuracy = accuracy_score(y_test, y_pred)
    return confusion_matrix(y_test, y_pred), y_test.values, y_pred, accuracy

if __name__ == "__main__":
    # 使用函数进行分类任务
    data_path = "iris.xlsx"
    confusion_mat, true_labels, predicted_labels, accuracy = decision_tree_classification(data_path)

    print("真实值:", true_labels)
    print("预测值:", predicted_labels)
    print("准确率:{:.2%}".format(accuracy))

    # 绘制混淆矩阵
    plt.figure(figsize=(8, 6))
    sns.heatmap(confusion_mat, annot=True, fmt="d", cmap="Blues")
    plt.title("Confusion Matrix")
    plt.xlabel("Predicted Labels")
    plt.ylabel("True Labels")
    plt.show()

    # 用圆圈表示真实值,用叉叉表示预测值
    # 绘制真实值与预测值的对比结果
    plt.figure(figsize=(10, 6))
    plt.plot(true_labels, 'o', label="True Labels")
    plt.plot(predicted_labels, 'x', label="Predicted Labels")

    plt.title("True Labels vs Predicted Labels")
    plt.xlabel("Sample Index")
    plt.ylabel("Label")
    plt.legend()
    plt.show()


7.运行结果

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ QT(一)

目录 初识QtQt 是什么Qt 能做什么Qt/C与QML 如何选择Qt 版本Windows 下安装QtLinux 下安装Qt安装Qt配置Qt Creator 输入中文配置Ubuntu 中文环境配置中文输入法 Qt Creator 简单使用Qt Creator 界面组成Qt Creator 设置 第一个Qt 程序新建一个项目项目文件介绍项目文件*.pro样式…

【网络】传输层——UDP | TCP(协议格式确认应答超时重传连接管理)

🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言:你只管努力,剩下的交给时间! 现在是传输层,在应用层中的报文(报头 有效载荷)就不能被叫做报文了,而是叫做数…

【Sklearn】基于最中心分类器算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于最中心分类器算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 最近中心分类器(Nearest Centroid Classifier)也被称为近似最近邻…

若依框架浅浅介绍

由若依官网所给介绍可知 1、文件结构介绍 在ruoyi-admin的pom.xml文件中引入了ruoyi-framework、ruoyi-quartz和ruoyi-generatior模块,在ruoyi-framework的pom.xml文件中引入了ruoyi-system模块。 2、技术栈介绍 前端:Vue、Element UI后端&#xff1a…

xxljob搭建(内网穿透)

调度中心搭建 先从码云或者github上将项目拷贝到本地,选择最新的release分支拷贝下来的xxl-job-admin模块就是调度中心,我们需要做的有两点,第一点将doc/db/tables_xxl_job.sql执行,第二点修改xxl-job-admin的application.proper…

SAP Fiori 将GUI中的自开发报表添加到Fiori 工作台

1. 首先我们在workbench 中开发一个GUI report 这里我们开发的是一个简单的物料清单报表 2. 分配一个事务代码。 注意这里的SAP GUI for HTML 要打上勾 3. 创建语义对象( Create Semantic Object) 事物代码: path: SAP NetWeaver ->…

2. 获取自己CSDN文章列表并按质量分由小到大排序(文章质量分、博客质量分、博文质量分)(阿里云API认证)

文章目录 写在前面步骤打开CSDN质量分页面粘贴查询文章url按F12打开调试工具,点击Network,点击清空按钮点击查询是调了这个接口https://bizapi.csdn.net/trends/api/v1/get-article-score用postman测试调用这个接口(不行,认证不通…

React源码解析18(6)------ 实现useState

摘要 在上一篇文章中,我们已经实现了函数组件。同时可以正常通过render进行渲染。 而通过之前的文章,beginWork和completeWork也已经有了基本的架子。现在我们可以去实现useState了。 实现之前,我们要先修改一下我们的index.js文件&#x…

nodejs+vue+elementui美食网站的设计与实现演示录像2023_0fh04

本次的毕业设计主要就是设计并开发一个美食网站软件。运用当前Google提供的nodejs 框架来实现对美食信息查询功能。当然使用的数据库是mysql。系统主要包括个人信息修改,对餐厅管理、用户管理、餐厅信息管理、菜系分类管理、美食信息管理、美食文化管理、系统管理、…

java内存模型JMM

Java内存模型的主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。 主内存:所有的变量都存储在主内存,且线程共享。 工作内存:每条线程私有,保存了…

Linux目录结构(快速了解)

linux目录结构 核心 1.Linux一切皆文件 2.只有一个顶级目录,而windows分C盘、D盘等 目录结构 目录含义(与windows进行比对) Linux含义windows/bin所有用户可用的基本命令存放的位置windows无固定的命令存放目录/bootlinux系统启动的时候需要…

C进阶(1/7)——数据在内存中的存储

目录 前言: 一.数据类型介绍 类型基本归类: 整型家族: 浮点数家族: 构造类型: ​指针类型: 空类型: 二.整型在内存中的存储 1.原码,反码,补码 2.大小端介绍 3.练…

分布式 - 消息队列Kafka:Kafka 消费者消息消费与参数配置

文章目录 1. Kafka 消费者消费消息01. 创建消费者02. 订阅主题03. 轮询拉取数据 2. Kafka 消费者参数配置01. fetch.min.bytes02. fetch.max.wait.ms03. fetch.max.bytes04. max.poll.records05. max.partition.fetch.bytes06. session.timeout.ms 和 heartbeat.interval.ms07.…

2023国赛数学建模思路 - 复盘:光照强度计算的优化模型

文章目录 0 赛题思路1 问题要求2 假设约定3 符号约定4 建立模型5 模型求解6 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 问题要求 现在已知一个教室长为15米,宽为12米&…

(css)点击前隐藏icon图表 点击后显示

(css)点击前隐藏icon图表 点击后显示 效果 html <liv-for"(item,index) in sessionList":key"index"class"liClass":class"{ active: change2 index }"tabindex"2">...<el-tooltip class"item" effec…

opencv实战项目 手势识别-实现尺寸缩放效果

手势识别系列文章目录 手势识别是一种人机交互技术&#xff0c;通过识别人的手势动作&#xff0c;从而实现对计算机、智能手机、智能电视等设备的操作和控制。 1. opencv实现手部追踪&#xff08;定位手部关键点&#xff09; 2.opencv实战项目 实现手势跟踪并返回位置信息&…

算法与数据结构(二十四)最优子结构原理和 dp 数组遍历方向

注&#xff1a;此文只在个人总结 labuladong 动态规划框架&#xff0c;仅限于学习交流&#xff0c;版权归原作者所有&#xff1b; 本文是两年前发的 动态规划答疑篇open in new window 的修订版&#xff0c;根据我的不断学习总结以及读者的评论反馈&#xff0c;我给扩展了更多…

结构体的定义与赋值

1、结构体定义 首先定义一个学生结构体&#xff0c;如下所示&#xff1a; struct Student {int num;char name[32];char sex;int age; }; 接着在主函数中对学生进行声明&#xff0c;如下所示&#xff1a; #include<iostream> using namespace std;struct Student {in…

《零基础实践深度学习》(第2版)学习笔记,(五)深度学习与计算机视觉

文章目录 1. 计算机视觉概述2. 图像分类3. 目标检测 1. 计算机视觉概述 图像分类 目标检测 2. 图像分类 3. 目标检测

Java课题笔记~ EL

1.EL (1).JSP脚本的缺点 使用JSP脚本可以实现页面输出显示&#xff0c;那为什么还需要使用EL简化输出呢&#xff1f; 这是因为单纯使用JSP脚本与HTML标签混合&#xff0c;实现输出显示的方式存在一些弊端&#xff0c;归纳如下&#xff1a; 代码结构混乱&#xff0c;可读性差…