基于集成学习的心血管疾病风险预测系统(Flask+Vue3+大模型)
基于集成学习的心血管疾病风险预测系统(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. 风险评估(核心功能)
这是整个系统最重要的功能,左右分两栏:左边填表单,右边出结果,操作非常直观。
单次评估:
- 填基本信息:姓名、年龄、性别、身高、体重
- 填健康指标:收缩压、舒张压、胆固醇(正常/偏高/很高)、血糖(正常/偏高/很高)
- 选生活方式:吸烟(开/关)、饮酒(开/关)、运动(开/关)
- 点击"开始预测"按钮
预测完成后底下会显示:
- 风险等级标签:低风险(绿色)→ 中高风险(红色),颜色越红越危险
- 风险概率:比如 72.3%,带进度条直观展示
- BMI、脉压差、风险因子数:三个关键数据
- 三个操作按钮:
- “保存到档案”:存到历史记录里,以后可以看趋势变化
- “下载 PDF 报告”:生成一份正式的健康评估报告,可以打印
- “AI 健康建议”:让 DeepSeek 大模型根据你的指标给出个性化的健康指导

批量评估:
如果你有很多人的数据(比如一个社区体检后拿到一批 Excel),不用一个一个填:
- 导出 CSV 文件(列名要和模板一致)
- 上传到页面
- 一键批量预测,结果以表格展示
- 可以批量保存到档案,或下载汇总 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(检索增强生成)机制:
- 你的问题先用向量模型转成数学表示
- 在 38 万条医学知识中找最相关的几条
- 把找到的医学知识 + 你的问题一起发给 DeepSeek
- 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
八、视频演示
医疗健康智能分析系统
更多推荐


所有评论(0)