数据可视化案例-基于决策树的心脏病病情预测

2024-03-21 00:59

本文主要是介绍数据可视化案例-基于决策树的心脏病病情预测,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于决策树的心脏病病情预测

  • 一、数据描述
    • 1、导入模块和数据集
    • 2、数据探索
  • 二、决策树分类可视化分析
    • 1、划分训练集和测试集
    • 2、模型训练
    • 3、模型性能评估

一、数据描述

heart.csv数据集中包含14个特征变量,303个样本。利用该数据集,可以使用sklearn模块中的决策树分类器构建分类模型。具体的变量信息如下所示:
在这里插入图片描述

1、导入模块和数据集

# 导入模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as snsimport pydot
from sklearn import tree,model_selection,metrics 
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.metrics import roc_auc_score,roc_curve
from sklearn.metrics import confusion_matrix
from sklearn.externals.six import StringIO
from IPython.display import Image  

导入数据集并展示前五个样本。

data=pd.read_csv("./input/heart.csv")
data.head()

在这里插入图片描述

2、数据探索

首先,观察患有心脏病和未患心脏病的人数差异:

data["target"].value_counts()
Out:1    1650    138Name: target, dtype: int64
countNoDisease = len(data[data.target == 0])
countHaveDisease = len(data[data.target == 1])
print("Percentage of Patients Haven't Heart Disease: {:.2f}%".format((countNoDisease / (len(data.target))*100)))
print("Percentage of Patients Have Heart Disease: {:.2f}%".format((countHaveDisease / (len(data.target))*100)))
Out:Percentage of Patients Haven't Heart Disease: 45.54%Percentage of Patients Have Heart Disease: 54.46%

患有心脏病和未患心脏病的人数分别为165和138,在调查样本中超过50%的人患有心脏病。决策树建模的目标应当是识别患有心脏病的人,提高对该类疾病的预防和治疗能力,从而提高人们整体的健康水平。

其次,观察样本数据中的性别人数差异:

countFemale = len(data[data.sex == 0])
countMale = len(data[data.sex == 1])
print("Percentage of Female : {:.2f}%".format((countFemale / (len(data.sex))*100)))
print("Percentage of Male : {:.2f}%".format((countMale / (len(data.sex))*100)))
Out:Percentage of Female : 31.68%Percentage of Male : 68.32%

绘制目标变量条形图和性别条形图。

plt.rcParams["font.sans-serif"] = ["SimHei"] 
plt.figure(figsize = (15,5))
plt.subplot(121)
sns.countplot(x="target", data=data, palette="bwr")
plt.title("目标变量条形图")plt.subplot(122)
sns.countplot(x="sex", data=data, palette="mako_r")
plt.xlabel("Sex (0 = female, 1= male)")
plt.title("性别条形图")
plt.show()

在这里插入图片描述
制作交叉统计表:指定行变量为年龄,指定列变量为目标变量,并绘制分组统计频数条形图。

pd.crosstab(data.age,data.target).plot(kind="bar",figsize=(15,5))
plt.title("Heart Disease Frequency for Ages")
plt.xlabel("Age",fontsize = 15)
plt.ylabel("Frequency",fontsize = 15)
plt.savefig("heartDiseaseAndAges.png")
plt.show()

在这里插入图片描述
上图反映了在样本数据中,是否患病的人数在不同年龄的对比情况。

以上的数据探索反映的是有关调查样本的基本信息,包括调查样本在年龄、性别和目标变量上的频数分布,以及患病人群和非患病人群在年龄上的分布差异。

统计患有心脏病和未患心脏病的人的各类指标均值:

data.groupby("target").mean()

在这里插入图片描述

通过上述计算,可以看出患病者与非患病者在变量指标cpcaoldpeakthalachthalslope上差异比较明显,为了具体利用上述指标对心脏病病情进行预测,接下来采用决策树分类器的方法建立简单的分类模型。

二、决策树分类可视化分析

1、划分训练集和测试集

在正式建模前,首先将数据集分为训练集和测试集两部分。其中训练集用来构建决策树模型,测试集用来评估模型性能,测试集占全部数据的20%。

y = data["target"].values
x = data.drop(["target"],axis=1,inplace=False)
X = data.drop(["target"],axis=1,inplace=False).values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
print("train dataset:{0};test dataset:{1}".format(X_train.shape,X_test.shape))
Out:train dataset:(242, 13);test dataset:(61, 13)

2、模型训练

使用sklearn模块的DecisionTreeClassifier算法构建决策树模型:参数min_samples_split(某节点的最少样本数)指定5,max_leaf_nodes(节点最大数量)指定8,模型参数的科学选取应该根据机器学习的相关知识进行比较分析得到。

clf = DecisionTreeClassifier(max_depth=10,min_samples_split=5,max_leaf_nodes=8)
clf.fit(X_train, y_train)
Out:DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=10,max_features=None, max_leaf_nodes=8, min_impurity_decrease=0.0,min_impurity_split=None, min_samples_leaf=1,min_samples_split=5, min_weight_fraction_leaf=0.0,presort=False, random_state=None, splitter='best')

计算模型在训练集和测试集上的得分:

train_score = clf.score(X_train,y_train)
test_score = clf.score(X_test,y_test)
print("train score:{0};test score{1}".format(train_score,test_score))
Out:train score:0.8677685950413223;test score0.7704918032786885

当模型在训练集上的得分与在测试集上的得分相差过大时,说明模型出现了过拟合;当训练得分过低时,说明模型拟合效果不佳,即欠拟合,过拟合和欠拟合的问题出现时应及时调整模型参数。

绘制决策树:

dot_data = StringIO()  
tree.export_graphviz(clf, out_file = dot_data,feature_names = x.columns,class_names=["0","1"],filled = True, rounded = True,special_characters = True) 
(graph,) = pydot.graph_from_dot_data(dot_data.getvalue()) 
Image(graph.create_png())

在这里插入图片描述
上图中,可视化元素之一颜色分为两个色系,一个是蓝色系代表患有心脏病的人群;另一个是橙色系代表未患心脏病的人群,颜色越深代表结果的不纯度越低,其中也用gini指标来具体衡量分类结果不纯度的高低。

3、模型性能评估

计算模型预测的准确率:

y_predict = clf.predict(X_test)
print("混淆矩阵:")
print(metrics.confusion_matrix(y_test,y_predict))
print("正确率:")
print(metrics.accuracy_score(y_test,y_predict))
Out:混淆矩阵:[[21  7][ 7 26]]正确率:0.7704918032786885

绘制模型预测性能热力图:

mat = confusion_matrix(y_test, y_predict)
plt.figure(figsize = (10,5))
sns.heatmap(mat.T, square=True, annot=True, fmt="d", cmap="PuRd")
plt.xlabel("predicted value",fontsize = 15)
plt.ylabel("true value",fontsize = 15)
plt.show()

在这里插入图片描述
在61个样本数据中,模型预测的正确率为77.05% ,28个未患有心脏病的人群中,模型正确预测了21个;33个患有心脏病的人群中,模型正确预测了26个。

print(classification_report(y_test, y_predict, target_names=["Non Disease", "Disease"]))
Out:             precision    recall  f1-score   supportNon Disease       0.75      0.75      0.75        28Disease       0.79      0.79      0.79        33avg / total       0.77      0.77      0.77        61
clf.score(X_test, y_test)
Out: 0.7704918032786885

最后,使用ROC曲线和AUC面积对模型进行可视化评价:

#数据准备
y_prob = clf.predict_proba(X_test)[:,0]
fpr,tpr,threshold = metrics.roc_curve(y_test, y_prob, pos_label=0)
roc_auc = metrics.auc(fpr,tpr)*100
#绘制ROC曲线与AUC面积:
plt.rcParams["font.sans-serif"] = ["SimHei"] 
plt.rcParams["font.family"] = ["sans-serif"]
fig,ax = plt.subplots(figsize = (8,5))
plt.plot(fpr, tpr, color = "red",lw = 2) 
plt.plot([0, 1], [0, 1], color = "orange", lw = 2, linestyle = '--')
plt.text(0.6,0.5,"AUC = %0.1f %%" % roc_auc, fontsize = 15)
ax.fill_between(fpr,0, tpr, facecolor = "23661", alpha = 0.3)
plt.xlim([-0.1, 1.1])
plt.ylim([-0.1, 1.1])
plt.xticks([0,0.2,0.4,0.6,0.8,1])
plt.xlabel("假正率FPR",fontsize = 15)
plt.ylabel("真正率TPR",fontsize = 15)
plt.title("ROC & AUC",fontsize = 20)
plt.show()

在这里插入图片描述
ROC曲线以FPR作为横轴,TPR作为纵轴,ROC曲线下的面积AUC的值在一定程度上代表了模型的性能。如上图所示,该决策树模型的AUC为80.1%。

综上所述,本案例使用sklearn模块中的决策树算法对是否患有心脏病的人群构建分类模型并绘制决策树图形,使用混淆矩阵、正确率、AUC面积对该模型进行评价。

这篇关于数据可视化案例-基于决策树的心脏病病情预测的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/qq_47988440/article/details/131330954
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/831301

相关文章

Python处理超大规模数据的4大方法详解

《Python处理超大规模数据的4大方法详解》在数据的奇妙世界里,数据量就像滚雪球一样,越变越大,从最初的GB级别的小数据堆,逐渐演变成TB级别的数据大山,所以本文我们就来看看Python处理... 目录1. Mars:数据处理界的 “变形金刚”2. Dask:分布式计算的 “指挥家”3. CuPy:GPU

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

Java如何根据word模板导出数据

《Java如何根据word模板导出数据》这篇文章主要为大家详细介绍了Java如何实现根据word模板导出数据,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... pom.XML文件导入依赖 <dependency> <groupId>cn.afterturn</groupId>

Python实现获取带合并单元格的表格数据

《Python实现获取带合并单元格的表格数据》由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,所以本文我们就来聊聊如何使用Python实现获取带合并单元格的表格数据吧... 由于在日常运维中经常出现一些合并单元格的表格,如果要获取数据比较麻烦,现将将封装成类,并通过调用list_exc

Mysql数据库中数据的操作CRUD详解

《Mysql数据库中数据的操作CRUD详解》:本文主要介绍Mysql数据库中数据的操作(CRUD),详细描述对Mysql数据库中数据的操作(CRUD),包括插入、修改、删除数据,还有查询数据,包括... 目录一、插入数据(insert)1.插入数据的语法2.注意事项二、修改数据(update)1.语法2.有

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

SpringBoot实现接口数据加解密的三种实战方案

《SpringBoot实现接口数据加解密的三种实战方案》在金融支付、用户隐私信息传输等场景中,接口数据若以明文传输,极易被中间人攻击窃取,SpringBoot提供了多种优雅的加解密实现方案,本文将从原... 目录一、为什么需要接口数据加解密?二、核心加解密算法选择1. 对称加密(AES)2. 非对称加密(R

详解如何在SpringBoot控制器中处理用户数据

《详解如何在SpringBoot控制器中处理用户数据》在SpringBoot应用开发中,控制器(Controller)扮演着至关重要的角色,它负责接收用户请求、处理数据并返回响应,本文将深入浅出地讲解... 目录一、获取请求参数1.1 获取查询参数1.2 获取路径参数二、处理表单提交2.1 处理表单数据三、

Spring Validation中9个数据校验工具使用指南

《SpringValidation中9个数据校验工具使用指南》SpringValidation作为Spring生态系统的重要组成部分,提供了一套强大而灵活的数据校验机制,本文给大家介绍了Spring... 目录1. Bean Validation基础注解常用注解示例在控制器中应用2. 自定义约束验证器定义自

C#实现高性能Excel百万数据导出优化实战指南

《C#实现高性能Excel百万数据导出优化实战指南》在日常工作中,Excel数据导出是一个常见的需求,然而,当数据量较大时,性能和内存问题往往会成为限制导出效率的瓶颈,下面我们看看C#如何结合EPPl... 目录一、技术方案核心对比二、各方案选型建议三、性能对比数据四、核心代码实现1. MiniExcel