从数据脱敏到SHAP解释:用Streamlit+XGBoost构建可复现的川崎病诊断系统

基于机器学习的川崎病辅助诊断工具,结合了数据预处理、模型训练、特征解释和交互式可视化。以下是深度解读:


1. 技术架构

  • 框架:使用 Streamlit 构建 Web 应用,适合快速开发交互式数据科学应用。
  • 核心算法
    • XGBoost:用于分类的集成学习模型,参数(如 learning_rate=0.01max_depth=5)模仿论文中的设置。
    • SHAP(SHapley Additive exPlanations):用于解释模型预测的可解释性工具。
  • 数据预处理:生成模拟数据(实际应替换为医院真实数据),并划分训练/测试集。

2. 模块化设计

2.1 数据加载与模型训练
@st.cache_resource
def load_model_and_data():# 生成模拟数据(实际应替换为真实数据)data = pd.DataFrame({ ... })# 特征选择selected_features = [ ... ]X = data[selected_features]y = data['KD_diagnosis']# 划分训练/测试集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练 XGBoost 模型model = xgb.XGBClassifier(...)model.fit(X_train, y_train)# 创建 SHAP 解释器explainer = shap.TreeExplainer(model)return model, explainer, X_train, selected_features

  • 关键点
    • @st.cache_resource 缓存模型和数据,提高性能。
    • 使用论文参数(如 subsample=0.8n_estimators=300)确保结果可复现。
    • TreeExplainer 是 SHAP 对树模型的专用解释器。

2.2 辅助函数
def anonymize_data(input_data):"""数据脱敏:使用 SHA-256 哈希保护隐私"""hashed_data = {}for key, value in input_data.items():hasher = hashlib.sha256(f"{key}_{value}".encode())hashed_data[key] = hasher.hexdigest()[:8]return hashed_data

  • 隐私保护:对用户输入的敏感数据(如年龄、血清钠)进行哈希处理,生成唯一匿名ID。
def generate_shap_plot(input_array):"""生成 SHAP 特征重要性图"""shap_values = explainer.shap_values(input_array)plt.figure()shap.summary_plot(shap_values, input_array, feature_names=features, show=False)plt.tight_layout()return plt

  • 可视化:使用 shap.summary_plot 展示每个特征对模型预测的贡献,帮助医生理解诊断依据。

3. 用户界面设计

3.1 布局与交互
  • 分列布局:左侧输入数据,右侧展示诊断结果和研究信息。
  • 输入组件:使用 st.sliderst.number_input 等组件收集10项关键指标(如年龄、CRP、白蛋白等)。
  • 按钮触发:点击 "执行川崎病诊断" 按钮触发预测逻辑。
3.2 诊断结果展示
if st.button("执行川崎病诊断", use_container_width=True):input_array = pd.DataFrame([input_data], columns=features)proba = model.predict_proba(input_array)[0][1]risk = "高" if proba > 85 else "中" if proba > 60 else "低"# 动态建议if proba > 85:st.success("强烈建议进行冠状动脉超声检查并启动IVIG治疗")# SHAP 图与表格fig = generate_shap_plot(input_array)st.pyplot(fig)contrib_df = pd.DataFrame({ ... })st.dataframe(contrib_df)

  • 风险分类:根据预测概率(proba)分为高/中/低风险,提供不同级别的建议。
  • 可解释性:通过 SHAP 图和表格展示每个特征对诊断的贡献(如 "CRP 升高促进诊断")。

完整代码

import streamlit as st
import pandas as pd
import numpy as np
import xgboost as xgb
import shap
import joblib
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import base64
import hashlib# ========================
# 数据预处理与模型加载模块
# ========================
@st.cache_resource
def load_model_and_data():# 模拟论文中的临床数据集(实际应替换为医院真实数据)data = pd.DataFrame({'age_months': np.random.randint(1, 120, 1000),  # 月龄'fibrinogen': np.random.uniform(1.0, 10.0, 1000),  # 纤维蛋白原(FIB)'crp': np.random.uniform(0.1, 200.0, 1000),  # C反应蛋白(CRP)'esr': np.random.randint(5, 120, 1000),  # 血沉(ESR)'wbc': np.random.uniform(3.0, 30.0, 1000),  # 白细胞计数(WBC)'plt': np.random.randint(100, 800, 1000),  # 血小板计数(PLT)'alb': np.random.uniform(25.0, 50.0, 1000),  # 白蛋白(ALB)'alt': np.random.randint(10, 300, 1000),  # 谷丙转氨酶(ALT)'na': np.random.uniform(130.0, 150.0, 1000),  # 血清钠(Na)'duration_fever': np.random.randint(1, 14, 1000),  # 发热持续时间'KD_diagnosis': np.random.choice([0, 1], 1000, p=[0.7, 0.3])  # 诊断标签})# 选择论文确定的10个关键特征selected_features = ['age_months', 'fibrinogen', 'crp', 'esr', 'wbc','plt', 'alb', 'alt', 'na', 'duration_fever']X = data[selected_features]y = data['KD_diagnosis']# 划分训练测试集(论文方法)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练XGBoost模型(论文参数)model = xgb.XGBClassifier(learning_rate=0.01,max_depth=5,n_estimators=300,subsample=0.8,eval_metric='logloss',use_label_encoder=False)model.fit(X_train, y_train)# 创建SHAP解释器(论文方法)explainer = shap.TreeExplainer(model)return model, explainer, X_train, selected_features# 初始化模型和解释器
model, explainer, X_train, features = load_model_and_data()# ========================
# 辅助函数模块
# ========================
def anonymize_data(input_data):"""数据脱敏处理(符合医疗隐私要求)"""hashed_data = {}for key, value in input_data.items():hasher = hashlib.sha256(f"{key}_{value}".encode())hashed_data[key] = hasher.hexdigest()[:8]return hashed_datadef generate_shap_plot(input_array):"""生成SHAP解释图(论文图3方法)"""shap_values = explainer.shap_values(input_array)plt.figure()shap.summary_plot(shap_values, input_array, feature_names=features, show=False)plt.tight_layout()return plt# ========================
# Streamlit 应用界面
# ========================
st.set_page_config(page_title="川崎病辅助诊断",page_icon="dao",layout="wide"
)# 标题和介绍(符合论文描述)
st.title("川崎病(KD)机器学习辅助诊断工具")
st.markdown("""
**基于浙江大学医学院附属儿童医院研究**  
*Scientific Reports (IF 3.8, JCR Q1区) DOI:10.1038/s41598-025-92277-1*
""")# 创建两列布局
col1, col2 = st.columns([1, 1])# ========================
# 左侧:患者数据输入
# ========================
with col1:st.subheader("患者临床参数输入")st.markdown("请输入10项关键诊断指标(基于研究论文):")# 创建输入表单input_data = {}input_data['age_months'] = st.slider("月龄", 1, 120, 24, help="患者当前月龄")input_data['duration_fever'] = st.slider("发热持续时间(天)", 1, 14, 5, help="持续发热天数")input_data['fibrinogen'] = st.number_input("纤维蛋白原(FIB g/L)", 1.0, 10.0, 3.5, step=0.1)input_data['crp'] = st.number_input("C反应蛋白(CRP mg/L)", 0.1, 200.0, 10.0, step=0.1)input_data['esr'] = st.number_input("血沉(ESR mm/h)", 5, 120, 30)input_data['wbc'] = st.number_input("白细胞计数(WBC ×10⁹/L)", 3.0, 30.0, 12.0, step=0.1)input_data['plt'] = st.number_input("血小板计数(PLT ×10⁹/L)", 100, 800, 300)input_data['alb'] = st.number_input("白蛋白(ALB g/L)", 25.0, 50.0, 38.0, step=0.1)input_data['alt'] = st.number_input("谷丙转氨酶(ALT U/L)", 10, 300, 40)input_data['na'] = st.number_input("血清钠(Na mmol/L)", 130.0, 150.0, 140.0, step=0.1)# 诊断按钮if st.button("执行川崎病诊断", use_container_width=True):# 转换为模型输入格式input_array = pd.DataFrame([input_data], columns=features)# 预测诊断概率proba = model.predict_proba(input_array)[0][1]kd_prob = round(proba * 100, 1)# 右侧显示诊断结果with col2:st.subheader("诊断结果")# 显示风险指标(论文方法)risk_level = "高风险" if kd_prob > 70 else "中风险" if kd_prob > 30 else "低风险"color = "#ff4b4b" if risk_level == "高风险" else "#f0a929" if risk_level == "中风险" else "#0f9d58"st.metric("川崎病(KD)概率", f"{kd_prob}%",delta=risk_level, delta_color="off")# 修复:确保传入的值是Python float类型progress_value = float(kd_prob / 100)st.progress(progress_value, text=f"{risk_level}可能性")# 诊断建议(基于论文临床意义)if kd_prob > 85:st.success("强烈建议进行冠状动脉超声检查并启动IVIG治疗")elif kd_prob > 60:st.warning("建议复查实验室指标并观察临床症状进展")else:st.info("建议结合临床表现排除其他发热性疾病")# SHAP解释可视化st.subheader("诊断依据分析")st.markdown("**特征重要性解释(SHAP方法)**")# 生成SHAP图fig = generate_shap_plot(input_array)st.pyplot(fig)# 特征贡献表格shap_values = explainer.shap_values(input_array)[0]contrib_df = pd.DataFrame({'特征': features,'贡献值': shap_values,'方向': ['促进诊断' if x > 0 else '降低可能' for x in shap_values]}).sort_values('贡献值', ascending=False)st.dataframe(contrib_df, hide_index=True, use_container_width=True)# 数据脱敏保存(符合医疗规范)anonymized = anonymize_data(input_data)st.caption(f"匿名病例ID: {anonymized['age_months']}-{anonymized['crp']}")# 设置session状态,表示已诊断st.session_state.diagnosed = True# ========================
# 右侧:研究信息展示
# ========================
with col2:if not st.session_state.get('diagnosed', False):st.subheader("研究背景")st.markdown("""**研究亮点**  - 基于XGBoost的机器学习模型(AUC=0.9757)- 10项关键临床指标组合诊断- SHAP可解释性算法支持临床决策- 国家儿童健康与疾病临床医学研究中心验证""")st.image("https://mmbiz.qpic.cn/mmbiz_jpg/C9DH9oqiay9Q490wNo0m7xIqBY2RLu5icB8yeTRLC229mUdW9t6vw0cib2wtcibicy0mnjuoAQL7FH0VEvaXsu7drMw/640?wx_fmt=jpeg&randomid=6ulh0iwi&tp=wxpic&wxfrom=5&wx_lazy=1",caption="SU")st.markdown("""**使用方法**  1. 在左侧输入患者临床参数2. 点击"执行川崎病诊断"按钮3. 查看右侧诊断结果和解释分析""")# ========================
# 道;
# ========================
st.divider()
st.markdown("""
**注意事项**  
- 本工具为辅助诊断系统,临床决策需结合医生判断
- 所有患者数据在本地处理后立即匿名化
- 模型训练代码见研究论文补充材料
""")

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

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

相关文章

【C++详解】模板进阶 非类型模板参数,函数模板特化,类模板全特化、偏特化,模板分离编译

文章目录一、非类型模板参数应用场景二、模板的特化函数模板特化类模板特化全特化偏特化三、模板分离编译解决方法四、模板总结一、非类型模板参数 先前介绍的函数模板和类模板都是针对类型的类模板参数,非类型模板参数有哪些使用场景呢?我们先来看下面这…

10BASE-T1S核心机制——PLCA参数详解

导语: PLCA是10BASE-T1S的核心机制,了解PLCA才能更好地使用10BASE-T1。 本文将通过介绍具体配置,以及实战例子,带你掌握PLCA。 以下测试内容使用KUNHONG-U10BT1S-EVB设备测试, 设备符合IEEE 802.3cg标准&#xff0…

uniapp vue apk那边输入法遮挡页面内容

解决办法:pages.json配置如下{"globalStyle": {"app-plus": {"softinputMode": "adjustResize"}} }效果: 键盘弹出时自动调整窗口大小,所有内容上推(兼容性最佳)文件内容如下…

2507C++,系统服务0与1

原文 窗口上的系统调用通过,每个由系统调用(x64)或sysenter(x86)CPU指令调用的NTDLL.dll,如NTDLL的NtCreateFile的以下输出所示: 这里 0:000> u ntdll!NtCreateFile: 00007ffcc07fcb50 4c8bd1 mov r10,rcx 00007ffcc07fcb53 b855000000 mov eax,55h…

人工智能冗余:大语言模型为何有时表现不佳(以及我们能做些什么)

像 GPT - 4 这样的大语言模型(LLMs)彻底改变了我们与技术交互的方式。它们可以撰写文章、生成代码、回答问题,甚至帮助我们构思创意。但任何花时间使用过这些模型的人都知道,它们的输出有时会让人感觉……不太对劲。表述冗长、格式…

Cursor替代品亚马逊出品Kiro下载

Cursor替代品亚马逊出品Kiro下载 支持Claude Sonnet4.0与3.7 点击下载 备用链接:https://pan.xunlei.com/s/VOW-nBmVgR3ewIIAm7jDsf99A1?pwd6bqu#

MySQL 事务管理

一、前言 CURD 不加控制,会有什么问题? CURD 满足什么属性,能解决上述问题? 买票的过程得是原子的。买票应该不能受互相的影响。买完票应该要永久有效。买前和买后都要是确定的状态。 什么是事务? 事务就是一组 DML 语…

yarn在macOS上的安装与镜像源配置:全方位指南

在前端开发领域,高效的包管理工具是提升开发效率的关键。yarn 作为一款由 Facebook 推出的包管理器,凭借其快速、可靠、安全的特性,逐渐成为众多开发者的首选。对于 macOS 用户而言,正确安装 yarn 并合理配置镜像源,能…

Qt 插件架构开发与应用

Qt的插件架构是其模块化和可扩展性的核心机制之一,它允许开发者通过动态加载插件(Plugins)扩展应用功能,而无需重新编译主程序。这种架构广泛应用于IDE(如Qt Creator)、媒体播放器(解码器扩展&a…

打破传统局限:FinOps云成本优化助力企业云成本管理升级

在云计算日益普及的当下,企业纷纷将业务迁移到云端,以期获得更高效、灵活的IT资源管理方式。然而,云成本管理问题也随之而来,高额的云支出、资源利用不充分、成本控制难等,成为企业云管理之路上的绊脚石。此时,奇墨科技FinOps云成本优化正以其独特的优势,助力企业打破传统局限,…

HDFS写性能优化技巧详解:从理论到实践

HDFS写性能优化概述在大数据处理的生态系统中,Hadoop分布式文件系统(HDFS)作为核心存储层,其写性能直接影响着整个数据处理管道的效率。随着数据规模的指数级增长,企业对HDFS写入吞吐量和延迟的要求日益严苛&#xff0…

基于AutoJawSegment项目的CBCT图像分割实践指南

基于AutoJawSegment项目的CBCT图像分割实践指南 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,觉得好请收藏。点击跳转到网站。 1. 项目背景与概述 1.1 CBCT在口腔医学中的应用 锥形束计算机断层扫描(Cone Beam Computed Tomograph…

docker部署的ragflow服务迁移 数据卷迁移

[docker ragflow数据迁移]目录背景一、我的配置文件✅ 数据存储路径一览(基于你的配置文件)关于这些 volumes 的说明📁 如何查看这些卷在本地的具体位置?可能用到的docker 命令如下。📦 总结建议🛠️ 如果想…

Chrome插件学习笔记(三)

Chrome插件学习笔记(三) 参考文章: https://blog.csdn.net/guoqiankunmiss/article/details/135847091https://blog.csdn.net/guoqiankunmiss/article/details/135974364 1、项目搭建 在前两篇文章中使用的原生js去操作dom,很费劲…

Android系统中的4KB内存页简介

deepseek回答: Android系统中的4KB内存页是虚拟内存管理的最小单位,其主要用途如下: 一、核心功能 虚拟地址映射 应用程序访问内存时,系统将虚拟地址按4KB页框映射到物理内存或磁盘空间,实现进程间的内存隔离和安全访…

【Chrome】下载chromedriver的地址

下载chromedriver的地址低版本的最新版本的低版本的 http://chromedriver.storage.googleapis.com/index.html 最新版本的 https://googlechromelabs.github.io/chrome-for-testing/#stable

ISP算法——从颜色恒常性到白平衡

前面文章,介绍了人眼感知的物体颜色取决于光源的光谱组成与物体表面的光谱反射特性之间的相互作用。人类视觉的颜色感知是生物机制与认知智能协同作用的结果,人眼视网膜上的视锥细胞检测光的颜色,视杆细胞分析光的亮度,再共同转化…

工业缺陷检测的计算机视觉方法总结

工业缺陷检测的计算机视觉方法总结 传统方法 特征提取方式: 颜色:基于HSV/RGB空间分析,如颜色直方图、颜色矩等纹理:采用LBP、Haar、Gabor滤波器等算子提取纹理模式形状:基于Hu矩、Zernike矩等数学描述符刻画几何特性尺…

js实现宫格布局图片放大交互动画

可直接运行代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>五图交互布局</title><style>* {box-sizing: border-box;margin: 0;padding: 0;}.gallery {display: grid;grid-template-c…

easyexcel流式导出

EasyExcel 支持流式导出&#xff0c;这是它的一个重要特性。流式导出可以有效解决大数据量导出时的内存溢出问题。流式导出的优势内存友好 &#xff1a;不会一次性将所有数据加载到内存中适合大数据量 &#xff1a;可以处理百万级甚至更多的数据性能稳定 &#xff1a;内存占用相…