python打卡训练营打卡记录day31

知识点回顾
  1. 规范的文件命名
  2. 规范的文件夹管理
  3. 机器学习项目的拆分
  4. 编码格式和类型注解

作业:尝试针对之前的心脏病项目ipynb,将他按照今天的示例项目整理成规范的形式,思考下哪些部分可以未来复用。

心脏病项目目录

目录结构:heart/
├── config/   #集中存放项目的配置文件
├── data/   #存放项目相关数据├── processed/   #数据预处理后的数据└── row/   #原始数据
├── experiments/   #用于探索和测试
├── models/   #存放训练好的模型文件
├── reports/   #存储项目运行产生的各类报告和输出文件
└── src/   #存放项目的核心源代码├── data/   #数据相关代码├── models/   #模型相关代码└── utils/   #通用辅助函数代码

心脏病项目拆分

导入依赖库

# 忽视警告
import warnings
warnings.simplefilter('ignore')# 数据处理
import numpy as np
import pandas as pd# 数据可视化
import matplotlib.pyplot as plt
import seaborn as sns # 随机森林
from sklearn.ensemble import RandomForestClassifier # 决策树
from sklearn.tree import DecisionTreeClassifier# 树的可视化
from sklearn.tree import export_graphviz # 模型评估方法
from sklearn.metrics import roc_curve, auc 
from sklearn.metrics import classification_report # 混淆矩阵
from sklearn.metrics import confusion_matrix # 数据切分
from sklearn.model_selection import train_test_split #可解释性分析
import shap np.random.seed(123) 
pd.options.mode.chained_assignment = None  %matplotlib inline

数据可视化

dt = pd.read_csv("heart.csv")
# 设置可视化风格
sns.set(palette = 'pastel', rc = {"figure.figsize": (10,5), # 图形大小、"axes.titlesize" : 14,    # 标题文字尺寸"axes.labelsize" : 12,    # 坐标轴标签文字尺寸"xtick.labelsize" : 10,   # X轴刻度文字尺寸"ytick.labelsize" : 10 }) # Y轴刻度文字尺寸
a = sns.countplot(x = 'target', data = dt)               # 绘制计数图,其中x为target,数据为dt
a.set_title('Distribution of Presence of Heart Disease') # 设置图形标题
a.set_xticklabels(['Absent', 'Present'])                 # 将两个条形的标签分别设置为“Absent”(没有心脏病)和“Present”(有心脏病)
plt.xlabel("Presence of Heart Disease")                  # 设置X轴标签
# 显示图形
plt.show()#患者年龄分布
plt.show()
g = sns.countplot(x = 'age', data = dt) # 绘制计数图,其中x为age,数据为dt
g.set_title('Distribution of Age')      # 设置图形标题
plt.xlabel('Age')                       # 设置X轴标签#患者性别分布
dt.sex.value_counts()
b = sns.countplot(x = 'target', data = dt, hue = 'sex')          # 创建一个计数图,其中x为target,数据为dt,用sex作为色相(切分类别)
plt.legend(['Female', 'Male'])                                    # 以female/male作为标签,在图形中嵌入图例
b.set_title('Distribution of Presence of Heart Disease by Sex')   # 设置图形标题
b.set_xticklabels(['Absent', 'Present'])                          # 设置条形图的标签
# 显示图形
plt.show()# 可视化病患血清胆固醇浓度分布
sns.distplot(dt['chol'].dropna(), kde=True, color='darkblue', bins=40)# 可视化病人(入院时)的静息血压分布
sns.distplot(dt['trestbps'].dropna(), kde=True, color='darkgreen', bins=10)# 可视化病人空腹血糖浓度分布
g = sns.countplot(x = 'fbs', data = dt)                 # 绘制计数图,其中x为fbs,数据为dt
g.set_title('Distribution of Fasting blood sugar')      # 设置图形标题
plt.xlabel('Fasting blood sugar')                       # 设置X轴标签#绘制热力图
f,ax = plt.subplots(figsize=(12,12)) # 定义图形尺寸
# 根据计算的相关值绘制热力图
sns.heatmap(dt.corr('pearson'), annot = True, linewidths = .5, fmt =  '.1f', ax = ax)
# 显示特征相关性热力图
plt.show()

数据预处理

#由于原数据集内的特征名称不利于解读。因此,我们先对其进行重命名,使其更容易理解。
dt.columns = ['age', 'sex', 'chest_pain_type', 'resting_blood_pressure', 'cholesterol', 'fasting_blood_sugar', 'rest_ecg', 'max_heart_rate_achieved','exercise_induced_angina', 'st_depression', 'st_slope', 'num_major_vessels', 'thalassemia', 'target']#转换数据类型
dt.dtypes# 使用"astype"指定数据类型
dt['sex'] = dt['sex'].astype('object')
dt['chest_pain_type'] = dt['chest_pain_type'].astype('object')
dt['fasting_blood_sugar'] = dt['fasting_blood_sugar'].astype('object')
dt['rest_ecg'] = dt['rest_ecg'].astype('object')
dt['exercise_induced_angina'] = dt['exercise_induced_angina'].astype('object')
dt['st_slope'] = dt['st_slope'].astype('object')
dt['thalassemia'] = dt['thalassemia'].astype('object')#转换后重新确认输出
dt.dtypes# 对object数据类型进行编码
# 将"female"编码为0,将"male"编码为1
# 下面的编码方式类似
dt['sex'][dt['sex'] == 0] = 'female'
dt['sex'][dt['sex'] == 1] = 'male'dt['chest_pain_type'][dt['chest_pain_type'] == 1] = 'typical angina'
dt['chest_pain_type'][dt['chest_pain_type'] == 2] = 'atypical angina'
dt['chest_pain_type'][dt['chest_pain_type'] == 3] = 'non-anginal pain'
dt['chest_pain_type'][dt['chest_pain_type'] == 4] = 'asymptomatic'dt['fasting_blood_sugar'][dt['fasting_blood_sugar'] == 0] = 'lower than 120mg/ml'
dt['fasting_blood_sugar'][dt['fasting_blood_sugar'] == 1] = 'greater than 120mg/ml'dt['rest_ecg'][dt['rest_ecg'] == 0] = 'normal'
dt['rest_ecg'][dt['rest_ecg'] == 1] = 'ST-T wave abnormality'
dt['rest_ecg'][dt['rest_ecg'] == 2] = 'left ventricular hypertrophy'dt['exercise_induced_angina'][dt['exercise_induced_angina'] == 0] = 'no'
dt['exercise_induced_angina'][dt['exercise_induced_angina'] == 1] = 'yes'dt['st_slope'][dt['st_slope'] == 1] = 'upsloping'
dt['st_slope'][dt['st_slope'] == 2] = 'flat'
dt['st_slope'][dt['st_slope'] == 3] = 'downsloping'dt['thalassemia'][dt['thalassemia'] == 1] = 'normal'
dt['thalassemia'][dt['thalassemia'] == 2] = 'fixed defect'
dt['thalassemia'][dt['thalassemia'] == 3] = 'reversable defect'# 调用"get_dummies"进行独特编码
dt = pd.get_dummies(dt, drop_first=True) #划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(dt.drop(columns='target'),dt['target'],test_size=0.2,random_state=10)

模型创建和预测

#创建模型
model = RandomForestClassifier(max_depth=5, n_estimators=10)    # 设置最大深度与基学习器等参数
model.fit(X_train, y_train)                                     # 使用随机森林拟合训练集#模型预测
y_predict = model.predict(X_test)
# 生成一个nxm的矩阵,第i行表示第i个样本属于各个标签的概率
y_pred_quant = model.predict_proba(X_test)[:, 1]
y_pred_bin = model.predict(X_test)

模型评估

#生成混淆矩阵
confusion_matrix = confusion_matrix(y_test, y_pred_bin)
confusion_matrix#计算灵敏度和特异度
total=sum(sum(confusion_matrix))sensitivity = confusion_matrix[0,0]/(confusion_matrix[0,0]+confusion_matrix[1,0])
print('灵敏度 : ', sensitivity )specificity = confusion_matrix[1,1]/(confusion_matrix[1,1]+confusion_matrix[0,1])
print('特异度 : ', specificity)# 绘制ROC曲线
# 得到曲线的横轴和纵轴
fpr, tpr, thresholds = roc_curve(y_test, y_pred_quant)fig, ax = plt.subplots()
# 绘制roc曲线
ax.plot(fpr, tpr)
# 绘制y=x直线
ax.plot([0, 1], [0, 1], transform=ax.transAxes, ls="--", c=".3")
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.0])
plt.rcParams['font.size'] = 12
plt.title('ROC curve for diabetes classifier')
plt.xlabel('False Positive Rate (1 - Specificity)')
plt.ylabel('True Positive Rate (Sensitivity)')
plt.grid(True)

可解释性分析

explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
#特征重要性图
shap.summary_plot(shap_values[1], X_test, plot_type="bar")
#蜂群图
shap.summary_plot(shap_values[1], X_test)

@浙大疏锦行

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

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

相关文章

mac .zshrc:1: command not found: 0 解决方案

nano ~/.zshrc 使用自带的nano命令打开文件,修改后 Ctrl X 然后输入y 然后回车即可保存成功 一般情况下,不是常用这个命令,除非是遇到有问题的文件,才用, 例如 遇到下面的问题 /Users/xxli/.zshrc:1: command no…

uniapp生成的app,关于跟其他设备通信的支持和限制

以下内容通过AI生成,这里做一下记录。 蓝牙 移动应用(App)通过蓝牙与其他设备通信,是通过分层协作实现的。 一、通信架构分层 应用层(App) 调用操作系统提供的蓝牙API(如Android的BluetoothA…

第50天-使用Python+Qt+DeepSeek开发AI运势测算

1. 环境准备 bash 复制 下载 pip install pyside6 requests python-dotenv 2. 获取DeepSeek API密钥 访问DeepSeek官网注册账号 进入控制台创建API密钥 在项目根目录创建.env文件: env 复制 下载 DEEPSEEK_API_KEY=your_api_key_here 3. 创建主应用框架 python 复制…

上位机与Hid设备通信

前置知识 什么是HID? HID(Human Interface Device)是‌直接与人交互的电子设备‌,通过标准化协议实现用户与计算机或其他设备的通信,典型代表包括键盘、鼠标、游戏手柄等。‌ 为什么HID要与qt进行通信? …

JVM 工具实战指南(jmap / jstack / Arthas / MAT)

🔍 从诊断到定位:掌握生产级 JVM 排查工具链 📖 前言:系统故障时,如何快速定位? 无论 JVM 理论多么扎实,当线上服务出现 CPU 飙高、响应超时、内存泄漏或频繁 Full GC 时,仅靠猜测…

mac上安装 Rust 开发环境

1.你可以按照提示在终端中执行以下命令(安全、官方支持): curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh然后按提示继续安装即可。 注意:安装过程中建议选择默认配置(按 1 即可)。 如果遇…

C++(5)switch语句 循环while

这是一个电影评分的程序 default 就是 如果上述的都没有执行 就统一的执行default的内容。 然后记得break ___________________________________ 循环 (while) while的使用方式 输出 0-9的while循环

[Linux] Linux线程信号的原理与应用

Linux线程信号的原理与应用 文章目录 Linux线程信号的原理与应用**关键词****第一章 理论综述****第二章 研究方法**1. **实验设计**1.1 构建多线程测试环境1.2 信号掩码策略对比实验 2. **数据来源**2.1 内核源码分析2.2 用户态API调用日志与性能监控 **第三章 Linux信号的用法…

25.5.20学习总结

做题思路 数列分段 Section IIhttps://www.luogu.com.cn/problem/P1182正如题目所说,我们需要得到一个最小的最大段的值,可能有人将注意力放在分段上,事实上,我们更多的应该关注结果。这是一道二分答案的题,你可以先确…

Python爬虫-爬取百度指数之人群兴趣分布数据,进行数据分析

前言 本文是该专栏的第56篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前的文章《Python爬虫-爬取百度指数之需求图谱近一年数据》中,笔者有详细介绍过爬取需求图谱的数据教程。 而本文,笔者将再以百度指数为例子,基于Python爬虫获取指定关键词的人群“兴…

【工具使用】STM32CubeMX-USB配置-实现U盘功能

一、概述 无论是新手还是大佬,基于STM32单片机的开发,使用STM32CubeMX都是可以极大提升开发效率的,并且其界面化的开发,也大大降低了新手对STM32单片机的开发门槛。     本文主要讲述STM32芯片USB功能的配置及其相关知识。 二…

从ISO17025合规到信创适配 解密质检lims系统实验室的 AI 质检全链路实践

在北京某国家级质检中心的 CMA 复评审现场,审核专家通过系统后台调取近半年的检测记录,从样品登记时的电子签名到报告签发的 CA 签章,178 项合规指标全部自动校验通过 —— 这是白码质检 LIMS 系统创造的合规奇迹。 一、智能合规引擎&#xf…

【操作系统】进程同步问题——生产者-消费者问题

问题描述 生产者进程负责生产产品,并将产品存入缓冲池,消费者进程则从缓冲池中取出产品进行消费。为实现生产者和消费者的并发执行,系统在两者之间设置了一个包含n个缓冲区的缓冲池。生产者将产品放入缓冲区,消费者则从缓冲区中取…

SpringBoot-6-在IDEA中配置SpringBoot的Web开发测试环境

文章目录 1 环境配置1.1 JDK1.2 Maven安装配置1.2.1 安装1.2.2 配置1.3 Tomcat1.4 IDEA项目配置1.4.1 配置maven1.4.2 配置File Encodings1.4.3 配置Java Compiler1.4.4 配置Tomcat插件2 Web开发环境2.1 项目的POM文件2.2 项目的主启动类2.3 打包为jar或war2.4 访问测试3 附录3…

Vue3 父子组件传值, 跨组件传值,传函数

目录 1.父组件向子组件传值 1.1 步骤 1.2 格式 2. 子组件向父组件传值 1.1 步骤 1.2 格式 3. 跨组件传值 运行 4. 跨组件传函数 ​5. 总结 1. 父传子 2. 子传父 3. 跨组件传值(函数) 1.父组件向子组件传值 1.1 步骤 在父组件中引入子组件 在子组件标签中自定义属…

嵌入式学习笔记 - STM32 U(S)ART 模块HAL 库函数总结

一 串口发送方式: ①轮训方式发送,也就是主动发送,这个容易理解,使用如下函数: HAL_UART_Transmit(UART_HandleTypeDef *huart, const uint8_t *pData, uint16_t Size, uint32_t Timeout); ②中断方式发送&#xff…

AI无法解决的Bug系列(一)跨时区日期过滤问题

跨时区开发中,React Native如何处理新西兰的日期过滤问题 有些Bug,不是你写错代码,而是现实太魔幻。 比如我最近给新西兰客户开发一个React Native应用,功能非常朴素:用户选一个日期范围,系统返回该范围内…

基于天猫 API 的高效商品详情页实时数据接入方法解析

一、引言 在电商大数据分析、竞品监控及智能选品等场景中,实时获取天猫商品详情页数据是关键需求。本文将详细解析通过天猫开放平台 API 高效接入商品详情数据的技术方案,涵盖接口申请、数据获取逻辑及代码实现,帮助开发者快速构建实时数据采…

系分论文《论遗产系统演化》

系统分析师论文范文系列 摘要 2022年6月,某金融机构启动核心业务系统的技术升级项目,旨在对其运行超过十年的遗留系统进行演化改造。该系统承担着账户管理、支付结算等关键业务功能,但其技术架构陈旧、扩展性不足,难以适应数字化转型与业务快速增长的需求。作为系统分析师,…

Spark Core基础与源码剖析全景手册

Spark Core基础与源码剖析全景手册 Spark作为大数据领域的明星计算引擎,其核心原理、源码实现与调优方法一直是面试和实战中的高频考点。本文将系统梳理Spark Core与Hadoop生态的关系、经典案例、聚合与分区优化、算子底层原理、集群架构和源码剖析,结合…