【数据挖掘】通过心脏病数据案例熟悉数据挖掘的完整过程

news/2025/3/13 21:26:12/

心脏病数据挖掘过程

一、加载数据源

# 如果没有安装数据源所依赖的库,则先安装数据源所在的python库: pip install ucimlrepo
# 引入pandas和ucimlrepo
import pandas as pd
from ucimlrepo import fetch_ucirepo# fetch dataset Heart Disease dataset的Id为45
heart_disease = fetch_ucirepo(id=45) 

二、筛选数据

# data (as pandas dataframes) 
X = heart_disease.data.features  # 特征
y = heart_disease.data.targets   # 标签# 可先查看下metadata 
# print(heart_disease.metadata) # 再看下变量信息 variable information 
# print(heart_disease.variables)# 查看X是什么样子的数据
# X
# 查看y是什么样子的数据

三、数据预处理

3.1 将特征数据和标签数据整合
# 为使得数据集符合逻辑回归算法训练时需要的训练数据集的形式,即特征+标签,也就是有标签的数据集,需要将X和y进行合并
X['target'] = y
# 取出前几行查看下X
# X.head(5)
3.2 判断数据集中是否有缺失值
# 使用 isnull() 函数找出所有缺失值,并统计每列的缺失数量
missing_values = X.isnull().sum()
# print(missing_values)
3.3 将缺失值进行处理
# 对于缺失值可选择的处理方法如下:
# 1. 均值填充: 适用于正态分布的数据。
# 2. 中位数填充: 适用于非正态分布或存在异常值的数据。
# 3. 删除样本: 当缺失值较多时,可能导致数据量大幅减少,需谨慎使用。
# 计算每列的均值,并用这些均值填充缺失值 准确度 54%
mean_values = X.mean()
df_fill_mean = X.fillna(mean_values)# 计算每列的中位数,并用这些中位数填充缺失值 准确度54%
# median_values = X.median()
# df_fill_median = X.fillna(median_values)# 删除所有包含缺失值的行   准确度为 54%
# df_fill_median = X.dropna()
3.4 检查缺失值处理后的数据情况
# 检查填充后的数据
print(df_fill_mean.isnull().sum())
age         0
sex         0
cp          0
trestbps    0
chol        0
fbs         0
restecg     0
thalach     0
exang       0
oldpeak     0
slope       0
ca          0
thal        0
target      0
dtype: int64
3.5 数据分析

分析每个特征与目标变量的关系

import matplotlib.pyplot as plt# 为方便,重新用变量来表达数据集
df = df_fill_mean# 绘制目标变量分布图
df['target'].value_counts().plot(kind='bar')
plt.title('Heart Disease Distribution')
plt.show()# 选择age年龄特征来进行分析,查看年龄分布情况(按是否有心脏病分组)
# df.groupby('target') :这部分的意思是根据“target”列对数据框进行分组。例如,在Heart Disease数据集中,“target”表示是否患有心脏病(0或1)。所以这一步会将数据分成两个组:一个是有心脏病的患者,另一个是没有心脏病的患者。 
# ['age'] :接下来,我们指定只使用“age”这一列的数据。也就是说,我们要分析每个分组中年龄的分布情况。 
# .hist() :调用hist方法,这是pandas的一个函数,用于绘制直方图。直方图可以展示数据的分布情况,比如年龄的分布。 
# bins=15 :这个参数指定将数据分成15个桶(bin)。每个桶代表一个年龄段,这样可以让图表更清晰地显示不同年龄段的分布情况。 
# figsize=(10,6) :设置图的大小,宽为10英寸,高为6英寸。这一步是为了让图表在展示时看起来更舒服,不会太小或太大。 
df.groupby('target')['age'].hist(bins=15, figsize=(10,6))# 绘制直方图
# 运行这行代码后,会生成一个包含两个直方图的图表:
# 第一个是 'target' 为 0 的组(没有心脏病患者)的年龄分布。
# 第二个是 'target' 为 1 的组(有心脏病患者)的年龄分布。
# 这两个直方图将帮助你直观地比较两种不同类别中的年龄分布情况,例如:
# 是否有心脏病患者中存在明显的年龄段差异?
# 年龄较大的人是否更容易患心脏病?
plt.title('Age Distribution by Heart Disease Status')
plt.xlabel('Age')
plt.ylabel('Count')
plt.show()

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

3.6 分析结论

特征会影响目标的取值,目标变量target取值为[0,4],其中0表示没有心脏病,1-4表示有心脏病,只是程度不一样。由此,看出挖掘这部分数据可选用分类算法来完成,而且是选择二分类算法,比如逻辑回归算法、SVM算法等。这里我们选择逻辑回归,它是一种用于分类任务的统计方法,适用于二元分类问题。它通过拟合一个逻辑函数(sigmoid 函数)来预测目标变量的概率

四、模型构建(数据挖掘-算法选择)

4.1 划分训练数据集和测试数据
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score# 分割数据集为训练集和测试集
X = df.drop('target', axis=1)
y = df['target']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
4.2 数据标准化处理
# 标准化(因为逻辑回归对特征尺度敏感)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
4.3 模型训练
# 训练逻辑回归模型
log_reg = LogisticRegression(max_iter=1000, random_state=42)
log_reg.fit(X_train, y_train)

五、模型预测

# 预测
y_pred_log = log_reg.predict(X_test)
y_pred_log
array([2, 1, 2, 0, 0, 3, 2, 2, 0, 0, 0, 0, 1, 2, 2, 0, 0, 3, 3, 0, 1, 0,3, 0, 3, 0, 0, 1, 3, 0, 0, 1, 0, 0, 0, 1, 3, 0, 3, 0, 2, 0, 1, 0,0, 2, 0, 0, 3, 1, 0, 0, 0, 0, 3, 0, 0, 3, 3, 2, 0], dtype=int64)

六、模型评估

from sklearn.metrics import roc_auc_score, confusion_matrix
import seaborn as sns# 真实值
y_true = y_test# 预测值
y_pred = y_pred_log# 计算准确率
accuracy = accuracy_score(y_true, y_pred)# 计算精确率、召回率和F1分数
precision = precision_score(y_true, y_pred,average='weighted')
recall = recall_score(y_true, y_pred,average='macro')
f1 = f1_score(y_true, y_pred,average='macro')# 计算ROC AUC值(适用于二分类)
if len(set(y_true)) == 2:auc = roc_auc_score(y_true, y_pred_proba)
else:auc = None# 可视化混淆矩阵
conf_matrix = confusion_matrix(y_true, y_pred)
plt.figure(figsize=(10, 7))
sns.heatmap(conf_matrix, annot=True, fmt='d')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()print(f"Accuracy: {accuracy}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")
print(f"F1 Score: {f1}")if auc is not None:print(f"AUC: {auc}")

执行结果如下:

D:\Program Files\Python312\Lib\site-packages\sklearn\metrics\_classification.py:1565: UndefinedMetricWarning: Precision is ill-defined and being set to 0.0 in labels with no predicted samples. Use `zero_division` parameter to control this behavior._warn_prf(average, modifier, f"{metric.capitalize()} is", len(result))

可视化混淆矩阵:
在这里插入图片描述
准确度、精确率、召回率和F1分数:
Accuracy: 0.5409836065573771
Precision: 0.5119535519125683
Recall: 0.3308976464148878
F1 Score: 0.3170415108810277


http://www.ppmy.cn/news/1578889.html

相关文章

ospf的内容解析

当然,以下是您提供的OSPF(开放最短路径优先)接口配置信息的翻译: --- **OSPF 进程 1,路由器 ID 为 12.1.1.2** **接口信息** 区域:0.0.0.0 (未启用 MPLS TE) **接口&#xff1a…

[网络爬虫] 动态网页抓取 — Selenium 入门操作

🌟想系统化学习爬虫技术?看看这个:[数据抓取] Python 网络爬虫 - 学习手册-CSDN博客 0x01:WebDriver 类基础属性 & 方法 为模仿用户真实操作浏览器的基本过程,Selenium 的 WebDriver 模块提供了一个 WebDriver 类…

《灵珠觉醒:从零到算法金仙的C++修炼》卷三·天劫试炼(33)玲珑宝塔藏珍宝 - 打家劫舍(空间压缩)

《灵珠觉醒:从零到算法金仙的C++修炼》卷三天劫试炼(33)玲珑宝塔藏珍宝 - 打家劫舍(空间压缩) 哪吒在数据修仙界中继续他的修炼之旅。这一次,他来到了一片神秘的玲珑谷,谷中有一座巨大的玲珑宝塔,塔身闪烁着神秘的光芒。谷口有一块巨大的石碑,上面刻着一行文字:“欲…

Python自动点击器开发教程 - 支持键盘连按和鼠标连点

Python自动点击器开发教程 - 支持键盘连按和鼠标连点 这里写目录标题 Python自动点击器开发教程 - 支持键盘连按和鼠标连点项目介绍开发环境安装依赖核心代码解析1. 键盘模拟实现2. 鼠标点击实现 开发要点使用说明注意事项优化建议打包发布项目源码开发心得参考资料成品工具 项…

【MySQL】全面理解Mysql架构

MySQL架构 如图,将MySQL 拆分为 上下两个部分,上层通常叫做 Server层 主要是Mysql 自己实现,下层叫做 存储引擎层,是插件开发模式,Mysql官方最初自己提供了MyISAM,是一种非事务存储引擎,而后有公…

使用 crontab 定时同步服务器文件到本地

https://www.dong-blog.fun/post/1987 1. 安装 sshpass sshpass 是一个可以自动输入密码的工具。如果未安装,运行以下命令安装: • 对于 Debian/Ubuntu 系统: apt update && apt install sshpass• 对于 CentOS/RHEL 系统&#xf…

Lab17_ Blind SQL injection with out-of-band data exfiltration

文章目录 前言:进入实验室构造 payload 前言: 实验室标题为: 带外数据泄露的 SQL 盲注 简介: 本实验包含一个SQL盲目注入漏洞。应用程序使用跟踪Cookie进行分析,并执行包含提交的Cookie值的SQL查询。 SQL查询是异…

新一代开源数字供应链安全审查与治理平台:悬镜源鉴SCA

管理数字供应链中的开源风险 Managing Open Source Risks in Digital Supply Chain 悬镜源鉴SCA开源威胁管控平台作为新一代开源数字供应链安全审查与治理平台,深度融合悬镜原创专利级的代码疫苗技术,是国内集组件成分分析、代码成分溯源、制品成分二进…