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

news2024/11/26 16:45:30

【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.运行结果

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

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

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

相关文章

Kotlin开发笔记:类层次结构和继承

Kotlin开发笔记:类层次结构和继承 简介 面向对象编程的语言中,关于对象层次的抽象是很重要的,这会涉及到类层次的结构,接口和继承等内容,本篇文章将会介绍与之相关的内容,包括: 接口的相关内容…

配置网络设置和修改主机名

bash 题目: 在 node1 上配置网络,要求如下: 主机名:node1.domain8.rhce.cc IP地址: 172.25.250.10/24 ##注意掩码 网关: 172.25.250.250 DNS: 172.25.250.250 ##名称服务器 做法: nmtui 回车…

Modbus RTU校验码CRC16全字节查表的VB6实现方法

全字节表比半字节表数据精简,比纯计算速度快,实现起来方便,但是在VB6下或是在普通单片机上要变通处理,因为双字节变量处理会溢出而数据失真。 先看一下CSDN上网友XCS101的C程序 CRC-16/MODBUS 算法的三种实现方法_crc16modbus校验…

风险区分度—IV、KS和分布

IV和KS是风控中常用的评估指标,用于衡量变量的预测能力和区分度。一般来说,IV和KS值越大,表示该变量的预测能力越强。本文从IV和KS以及两者之间的关系方面作一些思考。 一、IV值 一般来说,IV计算用于筛选变量,常用来评…

记一次现场找不到配置的神奇报错,(其实配置是完整的)

记一次现场找不到配置的神奇报错,(其实配置是完整的) 问题的原因为因为配置文件中符号的问题。 报错找不到url1 **Notepad**打开的文件 如图是两份看起来一模一样的配置,其中一个就会报错找不到某某配置。 实际有细小的差别 …

纷享销客稳居2022 H2 SFA SaaS 本土CRM厂商市场份额 TOP 1

近期,国际知名研究机构IDC公布了2022年下半年《中国客户关系管理(CRM)SaaS市场跟踪研究报告》,报告全面解析了中国CRM SaaS以及细分市场SFA SaaS的市场现状,并对全球各大厂商在中国SFA市场的份额占比进行了排名。连接型CRM开创者纷享销客在SF…

AAAI 最佳论文列表(1984→2023最新)附论文下载

明天AAAI全文截稿了,不知道大家的论文投的咋样啦?我不得不提一句,今年的AAAI投稿量又破新高了,快14,000!卷哭... 不过这个投稿量也在意料之中,AAAI属于中国计算机学会CCF的A类国际学术会议,在人…

Unity zSpace 开发

文章目录 1.下载 zSpace 开发环境1.1 zCore Unity Package1.2 zView Unity Package 2. 导入工程3. 发布设置4.功能实现4.1 用触控笔来实现对模型的拖拽: 5. 后续更新 1.下载 zSpace 开发环境 官网地址 1.1 zCore Unity Package zSpace 开发核心必须 1.2 zView …

Nacos使用SpringCloudAlibaba+Dubbo实现

Nacos简介 Nacos是阿里的一个开源产品,它是针对微服务架构中的服务发现、服务治理、配置管理的综合型解决方案。 官方介绍是这样的: Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、…

【QT】 Word模板编辑、转PDF格式

很高兴在雪易的CSDN遇见你 ,给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享基于QT进行Word模板编辑以及Word转PDF的技术,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 目录 …

微信开发之一键退出群聊的技术实现

简要描述: 退出群聊 请求URL: http://域名地址/quitChatRoom 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明wI…

微信小程序实现左滑删除

一、效果 二、代码 实现思路使用的是官方提供的 <movable-area> <movable-view> Page({/*** 页面的初始数据*/data: {pushedData:[{messageTitle:饼干,messageContent:饼干爱吃}],//已推送数据},/*** 生命周期函数--监听页面加载*/onLoad() {},/*** 生命周期函数-…

设计列表和超链接

在网页中&#xff0c;大部分信息都是列表结构&#xff0c;如菜单栏、图文列表、分类导航、新闻列表、栏目列表等。HTML5定义了一套列表标签&#xff0c;通过列表结构实现对网页信息的合理排版。另外&#xff0c;网页中还包含大量超链接&#xff0c;通过它实现网页、位置的跳转&…

【计算机视觉|生成对抗】带条件的对抗网络进行图像到图像的转换

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks 链接&#xff1a;Image-to-Image Translation with Conditional Adversarial Networks | IEEE Conference Publicati…

四、Dubbo扩展点加载机制

四、Dubbo扩展点加载机制 4.1 加载机制概述 Dubbo良好的扩展性与框架中针对不同场景使用合适设计模式、加载机制密不可分 Dubbo几乎所有功能组件都是基于扩展机制&#xff08;SPI&#xff09;实现的 Dubbo SPI 没有直接使用 Java SPI&#xff0c;在它思想上进行改进&#xff…

六轴机械臂码垛货物堆叠仿真

六轴机械臂码垛货物堆叠仿真 1、建立模型与仿真 clear,clc,close all addpath(genpath(.)) %建立模型参数如下&#xff1a; L(1) Link( d, 0.122, a , 0 , alpha, pi/2,offset,0); L(2) Link( d, 0.019 , a ,0.408 , alpha, 0,offset,pi/2); L(3) Link( d, …

C++的stack和queue+优先队列

文章目录 什么是容器适配器底层逻辑为什么选择deque作为stack和queue的底层默认容器优先队列优先队列的模拟实现stack和queue的模拟实现 什么是容器适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结)&#xff0c;…

【内联函数】

这里写目录标题 内联函数一、指定内联函数的方法很简单&#xff0c;只需要在函数定义处增加 inline 关键字一般是将非常短小的函数声明为内联函数内联函数与宏定义例题 内联函数 内联函数也称内嵌函数&#xff0c;它主要是解决程序的运行效率。 函数调用需要建立栈内存环境&am…

小白带你学习linux的MongoDB(三十四)

目录 一、概述 1、相关概念 2、特性 二、应用场景 三、安装 四、目录结构 五、默认数据库 1、admin&#xff1a; 2、local: 3、config: 六、数据库操作 1、库操作 2、文档操作 七、MongoDB数据库备份 1、备份命令 2、回数据库删除…

数据库内日期类型数据大于小于条件查找注意事项

只传date格式的日期取查datetime的字段的话默认是 00:00:00 日期类型字符串需要使用 ’ ’ 单引号括住 使用大于小于条件查询某一天的日期数据 前后判断条件不能是同一天 一个例子 数据库内数据&#xff1a; 查询2023-08-14之后的数据&#xff1a; select * from tetst…