机器学习实战:Python基于DT决策树模型进行分类预测(六)

news2024/11/17 4:49:34

文章目录

    • 1 前言
      • 1.1 决策树的介绍
      • 1.2 决策树的应用
    • 2 Scikit-learn数据集演示
      • 2.1 导入函数
      • 2.2 导入数据
      • 2.3 建模
      • 2.4 评估模型
      • 2.5 可视化决策树
      • 2.6 优化模型
      • 2.7 可视化优化模型
    • 3 讨论

1 前言

1.1 决策树的介绍

决策树(Decision Tree,DT)是一种类似流程图的树形结构,其中内部节点表示特征或属性,分支表示决策规则,每个叶节点表示结果。在决策树中,最上方的节点称为根节点。它学习基于属性值进行分区。它以递归方式进行分区,称为递归分区。这种类似流程图的结构有助于决策制定。它的可视化类似于流程图,可以很容易地模拟人类的思维过程。这就是为什么决策树易于理解和解释的原因。

决策树的时间复杂度是给定数据中记录和属性数量的函数。决策树是一种无分布或非参数方法,不依赖于概率分布假设。决策树可以很好地处理高维数据。

其原理可简单分为三步:**选择最优划分属性:**根据信息增益、信息增益比、基尼指数等方法,选择当前数据集中最优的属性作为划分属性,将数据集分成多个子集。**递归生成子树:**对每个子集重复步骤1,递归生成子树,直到所有的叶子节点都属于同一类别。**剪枝:**为了防止过拟合,需要对决策树进行剪枝,即去除一些分支或子树,使决策树更加简洁。

优点:

  • 易于理解和解释:DT算法可以生成易于理解和解释的决策树模型,因此非专业人员也可以理解和使用该算法。

  • 可解释性和可视化:DT算法可以通过绘制决策树的形式来直观地呈现分类过程,增强了模型的可解释性和可视化性。

  • 适用性广泛:DT算法可以处理离散和连续型特征,且对数据的分布和噪声鲁棒性较高。

缺点:

  • 容易过拟合:DT算法在训练集上可能表现得很好,但在测试集上表现得很差,容易过拟合。

  • 对噪声和异常值比较敏感:DT算法对噪声和异常值比较敏感,容易导致生成的决策树过于复杂。

  • 不支持在线学习:DT算法需要一次性加载所有的数据,并在内存中进行操作,因此不支持在线学习。

1.2 决策树的应用

决策树对于常规分类跟前面介绍的五种分类器其实差别不大,不过鉴于其易理解易运用对于实际生活还是有着不少便利。

  1. 金融风险评估:决策树可以用于预测借款人的还款能力和信用等级,帮助金融机构决定是否批准贷款。

  2. 医疗诊断:决策树可以用于帮助医生诊断疾病或推荐治疗方案,根据患者的症状和医疗历史进行分类。

  3. 客户关系管理:决策树可以用于客户细分,根据客户的购买历史、偏好和行为预测客户的需求,帮助企业定制个性化的服务。

  4. 电子商务:决策树可以用于商品推荐,根据用户的历史购买记录和行为推荐符合用户偏好的商品。

  5. 生产优化:决策树可以用于优化生产过程,根据生产线上的各种因素,例如温度、湿度、时间等来决定何时停机、何时更换部件,从而减少故障和损失。

  6. 人力资源管理:决策树可以用于招聘、晋升和培训决策,根据员工的学历、工作经验、业绩等因素,预测员工的发展潜力和能力,从而做出更加科学的决策。

2 Scikit-learn数据集演示

2.1 导入函数

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import metrics 

2.2 导入数据

先下载这个糖尿病数据集:https://www.kaggle.com/datasets/uciml/pima-indians-diabetes-database

注册或者用google登陆一下download即可,若下载失败或者登不上去的可后台回复0420领取示例数据集

然后导入数据,这里用了小写表头,所以header=None,然后再将首行定义为列名,若参考网上其他教程,留意库和函数的更新更改,否则可能会报错

col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
pima = pd.read_csv("diabetes.csv", header=None, names=col_names)
pima = pima.iloc[1:]
pima.head()

2.3 建模

这里定义自变量和因变量,然后分组

feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable

# 训练集测试集7/3分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

建立决策树

clf = DecisionTreeClassifier()
clf = clf.fit(X_train,y_train)
y_pred = clf.predict(X_test)

2.4 评估模型

print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

结果能达到69.697%,还是可以的

2.5 可视化决策树

这两个包先下载了,且检查路径没问题

#!pip install graphviz
#!pip install pydotplus

可视化

from sklearn.tree import export_graphviz
from six import StringIO  
from IPython.display import Image  
import pydotplus
dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,  
                filled=True, rounded=True,
                special_characters=True,feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
graph.write_png('diabetes.png')
Image(graph.create_png())

这是原始的分类,每个内部节点都有一个拆分数据的决策规则,称为基尼系数,测量节点的杂质,因此获取更准确的结果需要进行优化。

2.6 优化模型

  • criterion: 可选参数(默认为“gini”)或选择属性选择度量。该参数允许我们使用不同的属性选择度量。支持的标准是“gini”,用于Gini指数,以及“entropy”,用于信息增益。

  • splitter: 字符串,可选参数(默认为“best”)或分割策略。该参数允许我们选择分割策略。支持的策略有“best”选择最佳分割和“random”选择最佳随机分割。

  • max_depth: 整数或None,可选参数(默认为None)或树的最大深度。树的最大深度。如果为None,则节点会扩展直到所有叶子节点包含的样本数少于min_samples_split。最大深度的值过高会导致过拟合,而过低的值会导致欠拟合。

这里选择max_depth=3,也可以换成其他预修剪

clf = DecisionTreeClassifier(criterion="entropy", max_depth=3)
clf = clf.fit(X_train,y_train)
y_pred = clf.predict(X_test)
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))

分类率变成了77.056%,效果可观

2.7 可视化优化模型

from six import StringIO from IPython.display import Image  
from sklearn.tree import export_graphviz
import pydotplus
dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,  
                filled=True, rounded=True,
                special_characters=True, feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())  
graph.write_png('diabetes.png')
Image(graph.create_png())

确实结果比优化前的更简洁了,分类后的复杂程度大大降低了。

3 讨论

Python中的决策树是机器学习(数据科学的重要子集)领域非常流行的监督学习算法技术,但是,决策树并不是可用于提取此信息的唯一聚类技术。

它是一种监督式机器学习技术,其中数据根据某个参数连续拆分。决策树分析可以帮助解决分类和回归问题,这里只演示了分类。决策树算法将数据集分解为更小的子集;同时,相关的决策树是逐步开发的。决策树由节点(测试某个属性的值)、边/分支(对应于测试结果并连接到下一个节点或叶)和叶节点(预测结果的终端节点)组成,使其成为一个完整的结构。

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

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

相关文章

R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习技术应用

Meta分析是针对某一科研问题,根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法,对来源不同的研究成果进行收集、合并及定量统计分析的方法,最早出现于“循证医学”,现已广泛应用于农林生态,资源环境等方面。…

【springboot】缓存之@Cacheable、@CachePut、@CacheEvict的用法

目录 一、注解参数说明1.1 属性说明1.1.1 value/cacheNames 属性1.1.2 key属性1.1.3 keyGenerator属性1.1.4 cacheManager属性1.1.5 cacheResolver属性1.1.6 condition属性1.1.7 unless 属性1.1.8 sync 属性 1.2 Cacheable注解1.3 CachePut注解1.4 CacheEvict注解1.4.1 allEntr…

低代码产品如何分类,大部分人都没有搞清楚

最近许多技术峰会都出现了低代码这个名词,可以说,低代码是中台之后,又一个热门话题和名词了。 一、什么是低代码平台? 低代码平台是无需编码或通过少量代码就可以快速生成应用程序的开发平台。也是一款图形化、拖拉拽方式快速实…

hadoop伪分布式安装

文章目录 1. 将安装包hadoop-3.1.3.tar.gz上次至linux中2. 进行解压操作3. 修改目录名称4. 配置环境变量5. 修改自定义配置文件5.1 hadoop-env.sh5.2 core-site.xml5.3 hdfs-site.xml5.4 workers 6. 格式化集群7. 免密登录8. 启动hdfs9. 关闭hdfs 1. 将安装包hadoop-3.1.3.tar.…

群晖NAS与阿里云盘同步的方法

同步方法:通过在 docker 中安装 aliyundrive-webdav 实现与阿里云盘同步。 下载和安装 aliyundrive-webdav 在 docker 的注册表中搜素 aliyun,选择点赞比较多的 messense/aliyundrive-webdav: 下载后安装。建议在配置和启动之前&#xff…

Docker 的安装和镜像容器的基本操作

文章目录 一、Docker 概述1、Docker的概念2、容器的优点3、容器与虚拟机的区别4、容器在内核中支持2种重要技术5、Docker核心概念 二、Docker的安装1、docker的安装步骤2、实例操作:安装docker 三、Docker 镜像操作1、搜索镜像2、获取镜像3、镜像加速下载4、查看镜像…

基础工业工程(易树平、郭伏)——第三草 工作研究

第三草 工作研究 第一节 工作研究概述 一、工作研究的对象 工作研究的对象是作业系统,这是一个由多个相互关联的因素所组成的有机整体,旨在实现预定的功能和目标。作业系统的目标表现为输出一定的“产品”或“服务”,主要由材料、设备、能…

超级简洁、彻底组件化的轻量级Android Kotlin Jetpack MVVM组件化框架

结构 特点: 彻底组件化,且更简洁,Module具有独立的Application、AndroidMinifast、资源文件等;Application和Library的切换更加快捷;超级简洁、且多功能的网络层封装,自带2级缓存,App端内嵌了日…

盛元广通高校实验室安全智能管理平台

实验室安全问题一直以来都是高校管理的重点,依据《高等学校实验室安全规范》相关要求,应教育相关部门以及应急管理部门的相关规定,关于安全工作的系列重要指示和部署,必须按照危险源管控分级管理体系对实验室进行分级分类管理&…

ebay、速卖通、ozon销量下滑怎么办?怎样可以提高转化率

单量不好,就开始焦虑,而真正需要了解为什么会出现销量下滑的原因,从不断更新自己的知识,提高自己的技能,如何提高自己的技能呢? 把所学到的知识学以致用,listing的评分,退货率&…

ESP32学习四-自定义分区表

1、简介 ESP32-WROOM-32集成了4MB SPI FLASH。对应的,也会对这4MB FLAHS进行分区处理。在编译esp32程序时,通过make menuconfig -> Partition Table可以设置三种分区。 工厂程序(无OTA分区) 工厂程序(双OTA分…

自旋锁/读者写者问题

自旋锁 自旋锁的概念和理解 锁在处理需要申请加锁的线程的时候,一般有两种处理方法:一种是挂起等待,另外一种是自旋。自旋即轮询。 挂起等待: 当一个线程成功申请锁,并进入临界区后,其它线程在申请的时候…

【经验分享】硬件工程师需要知道的DFM可制造性设计

最近,有硬件工程师朋友找我讨论DFM,也就是可制造性设计。Design for Manufacturability。 什么是可制造性设计,看一张图很容易明白: 过大的PCB,无法上产线批量生产,极大的PCB面积浪费,自然是失…

Spring Batch 指南

SpringBatch 介绍 目前,Spring Batch是批处理框架界为数不多的优秀框架(Java语言开发)。 Spring Batch 是一个轻量级的、完善的批处理框架,旨在帮助企业建立健壮、高效的批处理应用。 Spring Batch是Spring的一个子项目,使用Java语言并基于Spring框架为基础开发,…

.Net 6.0 部署Linux+Nginx +PM2教程

今天带大家将本地.Net6.0项目部署到Linux系统中,其中有用到Nginx反向代理和PM2进程管理工具,希望本偏文章能对你有所帮助,成为你成功路上的垫脚石! 背景: 在.Net 5.0横空出世之后,.Net已经支持夸平台了,身为一名合格的码农,你敢说你不会用Linux? 哈哈哈开个玩笑,因为工作最近接…

Idea启动运行报错:Error:java: 无效的源发行版: 13

最近在做Springboot项目时,常常出现上述错误,小编也不知道怎么回事,到网上找了这个方面的解决办法,但是却发现根本解决不了,最终通过小编多次尝试,终于发现,为什么会报这个错误。(应该是Java版本…

基于广泛数据增强的新型白质束ONE-SHOT分割

文章目录 One-Shot Segmentation of Novel White Matter Tracts via Extensive Data Augmentation摘要方法One-Shot分割的广泛数据增强 实验结果 One-Shot Segmentation of Novel White Matter Tracts via Extensive Data Augmentation 摘要 探索了新WM束的One-Shot分割问题由…

Kubernetes 如何保障容器可用性?一文介绍探针的使用

有时候,应用因为无限循环或死锁而停止响应,为确保应用在这种情况下可以重新启动,需要有一种机制检查应用程序的运行状况,而不是依赖应用程序内部的检测。 K8s 主要提供了三种探针来针对这种机制: 存活探针&#xff1a…

Swift之深入解析内存安全

一、内存安全 一般来说,Swift 会阻止代码中的不安全行为。例如,Swift 会保证变量在被使用前已经初始化,在释放某变量后其内存也会变得不可访问,以及检查数组索引是否存在越界错误。Swift 还通过要求修改内存中位置的代码具有对该…

通达信缠论顶底分型选股公式(一笔优化版)

在前文《缠论底分型选股公式,处理了包含关系》中介绍了缠论底分型,并编写了选股公式。底分型条件比较容易满足,因此产生的信号比较多。有热心网友提出,可以用顶底分型构成一笔过滤信号。 缠论一笔的构成条件:两个相邻…