基于集成学习的心血管疾病风险预测系统(Flask+Vue3+大模型)

一、项目简介

1.1 项目背景

《中国心血管健康与疾病报告》显示,我国心血管疾病患病人数已超过 3.3 亿,每年因心血管疾病死亡的人数占总死亡人数的 40% 以上,是居民健康的"头号杀手"。

然而传统的心血管风险评估存在明显的局限性:

  • 依赖医生个人经验,基层医疗资源不足
  • 评估流程繁琐,难以实现大规模人群筛查
  • 患者自述症状信息零散,问诊效率低
  • 海量医疗数据被"埋没"在数据库里,没有转化为有价值的临床洞察

本项目基于阿里云天池平台的两个公开数据集开展研究与实践。第一个数据集是心血管疾病预测数据集(来源:https://tianchi.aliyun.com/dataset/212054),包含70000条患者记录,每条记录含有年龄、性别、身高、体重、收缩压、舒张压、胆固醇、血糖、吸烟、饮酒、运动活跃等12个特征,以及是否患有心血管疾病的标签。第二个数据集是CBLUE评测基准中的MedDG医疗对话数据集(来源:https://tianchi.aliyun.com/dataset/95414),包含17864条医患对话记录,每条对话涵盖多轮问答,记录了患者的主诉、医生的诊断、开具的药物等信息。通过结合结构化病历数据和自然语言医疗对话数据,本课题构建了一个集数据分析、风险预测、AI辅助问诊、自然语言数据查询于一体的医疗健康智能分析系统。

1.2 项目概述

本项目构建了一套集 机器学习预测、RAG 智能问诊、自然语言交互查询 于一体的医疗健康智能分析系统。系统以 70,000 条心血管疾病患者真实数据 为基础,通过集成学习模型实现高精度风险预测,融合医学知识库与 DeepSeek 大模型提供智能问诊服务,并将所有功能封装为直观的 Web 可视化界面。

1.3 核心亮点

亮点 说明
四模型对比 + Stacking 集成 XGBoost、LightGBM、Random Forest 横向对比,Stacking 融合提升准确率达 80%
RAG 检索增强生成 基于 17,864 条真实医患对话构建 FAISS 向量知识库,38 万条知识片段零幻觉回答
自然语言转 SQL 输入"高血压患者有多少",自动生成 SQL 并执行,非技术人员也能轻松上手
一键批量评估 + PDF 报告 上传 CSV 批量预测,自动生成专业健康评估报告,支持打印存档
完整前后端分离 FastAPI + Vue3,RESTful API 规范,部署在阿里云上 24 小时可访问

1.4 技术栈

层级 技术选型
前端框架 Vue 3 + Element Plus + ECharts
后端框架 FastAPI + Uvicorn
机器学习 XGBoost / LightGBM / RandomForest / Stacking
数据处理 Pandas / NumPy / Scikit-learn
知识检索 Sentence-Transformers + FAISS 向量引擎
大模型 DeepSeek API
数据库 SQLite
部署 Nginx 反向代理 + systemd 守护进程

1.5 适用场景

  • 基层社区卫生服务中心的慢病初筛
  • 个人健康自测与风险预警
  • 医学数据分析与教学演示
  • 机器学习/全栈开发课程设计参考

部署网址:http://8.136.117.84
源码地址:https://gitee.com/qqc2026/medical-vue


二、系统架构

2.1 整体架构

系统采用 前后端分离 + Nginx 反向代理 的经典架构,前端为 Vue3 构建的单页面应用,后端为 FastAPI 提供的 RESTful API 服务。
在这里插入图片描述
前端部分(Vue3):用 Vue 3 框架搭建的网页界面,包含首页看板、风险预测、AI问诊等六个页面。写好后打包成纯静态文件(HTML + CSS + JS),交给 Nginx 直接返回给用户,不需要额外的前端服务器。

后端部分(FastAPI):用 Python 写的接口服务,跑在 8000 端口。前端的所有操作——点预测、问AI、查数据——都会变成 HTTP 请求发给后端,后端再调对应的模块来处理。

数据库(SQLite):存着 7 万条患者数据,后端需要统计查询时就来这里取。

预测模型(Stacking):训练好保存在 best_model.pkl 文件里,用户提交 11 个健康指标,模型算出患心血管疾病的风险概率。

DeepSeek 大模型:给 AI 问诊和 SQL 生成两个功能提供智能支持。问诊时结合医学知识库给出专业建议,问数时把白话转成 SQL 语句。

请求流程:用户在浏览器操作 → 请求到达 Nginx → 如果是 /api/ 开头的转发给后端,其他的直接返回前端页面 → 后端处理完返回数据 → 前端渲染显示。

层级 用什么
前端 Vue 3 + Element Plus
后端 FastAPI
模型 XGBoost / LightGBM / Stacking
大模型 DeepSeek
部署 Nginx + 阿里云

三、六大功能模块

1. 系统首页 - 数据看板

打开系统首先看到的是蓝色 Banner 和三个关键数字:70,000 条数据、17,864 条医患对话、385,951 条知识片段,一下子就能感受到数据量有多大。
在这里插入图片描述

首页有两个 Tab 页:

Tab 1:系统总览

  • 三个大卡片:点击"心血管风险预测"直接跳转到评估页;点击"AI 智能问诊"和"数据分析看板"同理
  • 使用指引三步走:填指标 → 预测 → 看建议
  • 健康小贴士:低盐饮食、规律运动、戒烟限酒、定期检查

Tab 2:数据看板

切换到数据看板时,系统会自动请求后端接口,几秒后就能看到 7 个可视化图表:

图表 类型 能看出什么
年龄组患病率 柱状图+折线图 哪个年龄段最容易得心脏病
血压分布对比 分组柱状图 患病的人血压明显更高
BMI 分类占比 环形饼图 超重肥胖占了多少比例
风险因子雷达 雷达图 每个风险因素在人群中占多少
生活方式与患病率 柱状图 吸烟喝酒不运动的人患病率有多高
患病率仪表盘 仪表盘 整体患病率,红黄绿三色一目了然
关键指标卡片 数字卡片 高血压率、高血糖率、总人数等 8 个数字

顶部还有冠心病 CTA、心电图、心脏超声三张医学影像图,展示多模态数据概念。
在这里插入图片描述
在这里插入图片描述


2. 风险评估(核心功能)

这是整个系统最重要的功能,左右分两栏:左边填表单,右边出结果,操作非常直观。
在这里插入图片描述

单次评估:

  1. 填基本信息:姓名、年龄、性别、身高、体重
  2. 填健康指标:收缩压、舒张压、胆固醇(正常/偏高/很高)、血糖(正常/偏高/很高)
  3. 选生活方式:吸烟(开/关)、饮酒(开/关)、运动(开/关)
  4. 点击"开始预测"按钮

预测完成后底下会显示:

  • 风险等级标签:低风险(绿色)→ 中高风险(红色),颜色越红越危险
  • 风险概率:比如 72.3%,带进度条直观展示
  • BMI、脉压差、风险因子数:三个关键数据
  • 三个操作按钮
    • “保存到档案”:存到历史记录里,以后可以看趋势变化
    • “下载 PDF 报告”:生成一份正式的健康评估报告,可以打印
    • “AI 健康建议”:让 DeepSeek 大模型根据你的指标给出个性化的健康指导
      在这里插入图片描述

批量评估:
在这里插入图片描述

如果你有很多人的数据(比如一个社区体检后拿到一批 Excel),不用一个一个填:

  1. 导出 CSV 文件(列名要和模板一致)
  2. 上传到页面
  3. 一键批量预测,结果以表格展示
  4. 可以批量保存到档案,或下载汇总 PDF 报告
    在这里插入图片描述

历史档案:
在这里插入图片描述

  • 上面选择看过的人,下面自动画出两条趋势折线图:
    • 风险概率趋势:你的风险是升高了还是降低了
    • 血压趋势:收缩压和舒张压的变化
  • 下面是每次评估的详细记录表格,可以删单条

3. 数据分析看板

这个页面帮你从统计学角度理解数据,四个模块从上到下一口气展示:

数据集概览:7 万条数据、19 个特征、正样本率约 50%,四个大数字一目了然。

显著性检验:用 Mann-Whitney U 检验和卡方检验,自动筛选出哪些特征对患病有显著影响,用 ***(极显著)、**(非常显著)、*(显著)标记,绿色 Tag 越多越重要。

风险因子分析:把每个特征拆开看,比如"血压分级=4 的患者,患病率是多少?"逐条列出,还带进度条可视化。

MedDG 医疗对话数据:展示了用于构建知识库的对话数据统计,包括对话轮次、疾病数量、Top 10 疾病排行。

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


4. 模型训练

这是一个在网页上就能完成的机器学习实验面板,分两步:

第一步:特征选择

  • 三种方法可选:互信息法(看特征和目标的相关性)、RFECV(递归消除,逐个去掉不重要的特征)、两者结合
  • 点击执行后出结果表格,告诉你哪些特征重要、该留哪些
    在这里插入图片描述

第二步:训练模型

  • 勾选"使用特征选择结果",然后点"开始训练"
  • 十几秒后出结果,四个模型横向对比:
    在这里插入图片描述
  • Stacking 集成模型(把前三个模型的输出再喂给逻辑回归做最终判断)效果最好,自动高亮、自动保存为 best_model.pkl

5. AI 智能问诊

页面是三栏布局:

左侧:对话历史

  • 每次聊天的内容都会自动保存
  • 可以切换回之前的对话继续聊
  • 可以删除不想要的对话
  • 点"新建对话"就开一个新的空白聊天

中间:聊天区

  • 和新版 ChatGPT 一样的操作:打字发出去,AI 思考几秒后回复
  • 首次进来有 5 个快捷问题可以点:发烧怎么办、头痛是什么原因、胃疼吃什么药、高血压怎么控制、失眠多梦怎么办

问到专业问题怎么回答?

不是让 AI 瞎编。背后有一套 RAG(检索增强生成)机制:

  1. 你的问题先用向量模型转成数学表示
  2. 在 38 万条医学知识中找最相关的几条
  3. 把找到的医学知识 + 你的问题一起发给 DeepSeek
  4. DeepSeek 基于真实知识生成回答

所以回答是有据可查的,不是凭空编造。

右侧:知识来源

  • AI 回答后,右侧会显示 RAG 检索到的医学知识条目,点开能看到原文
  • 如果有匹配到 ICD-10 疾病编码也会显示
  • 底部有免责声明:AI 建议仅供参考,不能替代医生诊断
    在这里插入图片描述

6. SQL 智能问数

这个功能让不懂 SQL 的人也能查数据。你只需要用大白话提问,系统自动转成 SQL:
你问:“高血压患者有多少人?”
系统生成:SELECT COUNT(*) FROM patients WHERE 血压分级 >= 2
自动执行,返回:25,013 人

两个模式:

  • AI 模式(默认):把问题发给 DeepSeek,大模型根据数据表结构自动生成 SQL。性别、吸烟等编码字段会自动转成中文标签,一眼能看懂
  • 基础模式:关键词匹配,适合简单的查询

12 个快捷提问卡片,覆盖了常见的查询类型,不用打字直接点:

  • 高血压有多少人、各年龄段患病率、吸烟者比例
  • 平均 BMI 和血压、肥胖且高血压人数、男女患病率对比
  • 风险因子数大于 5、不运动人数、年龄大于 60 等

查询结果可以复制 SQL导出 CSV,方便放到 Excel 里进一步分析。

如果问了数据集里没有的字段(比如"低血糖"),系统不会返回错误数据,而是温馨提示:“该数据集不包含低血糖分类,血糖数据仅区分正常、偏高、很高三个等级”。
在这里插入图片描述


四、核心技术点

4.1 特征工程

原始数据只有 12 个基础指标,我通过计算衍生出了 7 个新特征,让模型学得更准:

原始列 衍生新特征 计算公式
身高 + 体重 BMI 体重 ÷ 身高²
身高 + 体重 BMI分级 偏瘦/正常/超重/肥胖
收缩压 + 舒张压 脉压差 收缩压 - 舒张压
收缩压 + 舒张压 平均动脉压 舒张压 + 脉压差/3
收缩压 + 舒张压 血压分级 正常/偏高/高血压
年龄 年龄分组 青年/中年/老年
全部 风险因子数 统计有几个指标超标

最终 19 个特征一起喂给模型训练。

4.2 Stacking 集成模型

# 第一层:三个基学习器
base_models = [
    ('xgb', XGBClassifier()),
    ('lgb', LGBMClassifier()),
    ('rf', RandomForestClassifier())
]

# 第二层:元学习器
meta_model = LogisticRegression()

# Stacking 集成
stacking = StackingClassifier(
    estimators=base_models,
    final_estimator=meta_model,
    cv=5  # 5折交叉验证
)

4.3 RAG 检索增强生成

# 向量检索
query_embedding = model.encode(user_query)
distances, indices = faiss_index.search(query_embedding, top_k=5)

# 拼接上下文
context = "\n".join([knowledge_base[i] for i in indices[0]])

# 调用大模型
prompt = f"基于以下医学知识回答:\n{context}\n\n用户问题:{user_query}"
response = llm.chat(prompt)

4.4 自然语言转 SQL

# 将表格结构和用户问题发送给 DeepSeek
prompt = f"""
数据库表 patients 包含以下列:{columns}
请将以下问题转换为 SQL 查询:
"{question}"
要求:性别1=女,2=男;吸烟/饮酒0=否,1=是;返回结果用中文别名
"""
sql = llm.chat(prompt)

五、部署方案

项目已部署至阿里云 ECS,架构如下:

  • 前端:Vue3 构建为静态文件,由 Nginx 托管
  • 后端:FastAPI + Uvicorn,由 systemd 守护进程管理
  • 反向代理:Nginx 将 /api/* 请求代理到后端 8000 端口
  • 进程守护medical-backend.service 配置开机自启
server {
    listen 80;
    root /opt/medical_vue/frontend/dist;
    
    location /api/ {
        proxy_pass http://127.0.0.1:8000/api/;
    }
    
    location / {
        try_files $uri /index.html;
    }
}

六、本地运行

# 后端
cd backend
pip install -r requirements.txt
python main.py

# 前端
cd frontend
npm install
npm run dev

访问 http://localhost:5173 即可体验。


七、总结

7.1 项目总结

本项目完整覆盖了 数据处理 → 特征工程 → 模型训练 → 知识库构建 → Web 可视化 → 线上部署 的全流程,核心用到的技术如下:

技术点 方案 起到了什么作用
机器学习 Stacking 集成(XGBoost + LightGBM + RF) 综合三个模型的长处,预测准确率约 73%,AUC 达 0.80
知识检索 FAISS 向量检索 + MedDG 医学语料 从 38 万条知识中快速找到相关医学内容
大模型 DeepSeek API 智能问诊给出专业回答,智能问数把白话转成 SQL
前端 Vue3 + Element Plus + ECharts 好看的界面 + 丰富的图表 + 流畅的交互
后端 FastAPI + Uvicorn 高性能的 Python 接口服务,代码量少但功能强
部署 Nginx 反向代理 + systemd 守护进程 前后端分离部署,服务开机自启,24 小时在线

7.2 学到了什么

从技术角度:

  • 了解了机器学习从数据到模型的完整流程:清洗 → 特征工程 → 训练 → 评估 → 保存模型 → 集成到项目中
  • 掌握了前后端分离的开发模式:前端负责界面和交互,后端负责计算和数据,通过 HTTP 接口通信
  • 理解了 RAG(检索增强生成)的原理:不是让 AI 瞎猜,而是先从知识库检索相关内容,再让 AI 基于真实知识回答
  • 学会了怎么把本地项目部署到云服务器上,让别人通过网址就能用

从项目角度:

  • 做项目不是把代码堆起来就行,用户体验也很重要:表单好不好填、结果清不清楚、错误有没有提示
  • 文档很重要:README 说明怎么运行、API 接口要有注释、代码结构要清晰

7.3 可以继续优化的方向

  • 增加更多疾病预测:目前只覆盖心血管疾病,可以扩展到糖尿病、高血压等慢病
  • 移动端适配:目前是 PC 端布局,可以适配手机和平板
  • 用户登录系统:不同用户看到不同的评估记录,保护隐私
  • 性能优化:模型推理可以用 ONNX 加速,知识库检索可以用更大规模的向量数据库

部署网址:http://8.136.117.84
源码地址:https://gitee.com/qqc2026/medical-vue

八、视频演示

医疗健康智能分析系统

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐