13 KiB
13 KiB
CardioAI - 心血管疾病智能辅助系统
项目概述
CardioAI是一个多模块应用系统,集成了数据可视化、机器学习预测和AI语音问答功能,用于心血管疾病的智能辅助分析和诊断。
系统模块
-
Module 1: 数据可视化仪表板 (Streamlit) - 本模块
- 数据清洗与特征工程
- 交互式数据筛选
- 可视化分析图表
-
Module 2: 机器学习预测器 (Flask + XGBoost)
- 心血管疾病风险预测模型
- RESTful API接口
- 实时预测服务
-
Module 3: AI语音助手 (DeepSeek + CosyVoice)
- 自然语言问答
- 语音交互界面
- 疾病知识查询
Module 1: 数据可视化仪表板
功能特性
- ✅ 数据加载与清洗: 自动处理异常值和缺失数据
- ✅ 特征工程: 年龄转换、BMI计算、类别编码
- ✅ 交互式筛选: 侧边栏多维度数据筛选
- ✅ 可视化分析: Plotly交互式图表
- ✅ 性能优化: 使用缓存加速数据加载
数据处理流程
- 数据加载: 从Excel文件加载原始数据
- 年龄转换: 将天数转换为年数(四舍五入)
- BMI计算:
BMI = 体重(kg) / (身高(m)^2) - 异常值处理:
- 删除舒张压 ≥ 收缩压的记录
- 删除收缩压不在[90, 250] mmHg范围的记录
- 删除舒张压不在[60, 150] mmHg范围的记录
- 类别转换:
- 胆固醇水平: 1=正常, 2=高于正常, 3=极高
- 血糖水平: 1=正常, 2=高于正常, 3=极高
- 性别: 1=女性, 2=男性
- BMI分类: <18.5=偏瘦, 18.5-24.9=正常, 25-29.9=超重, ≥30=肥胖
快速开始
1. 环境配置
# 创建并激活conda虚拟环境
conda create -n cardioenv python=3.10
conda activate cardioenv
# 安装依赖包
pip install -r requirements.txt
2. 数据准备
确保数据文件位于正确路径:
项目根目录/
├── data/
│ └── 心血管疾病.xlsx
└── module1_dashboard/
└── cardio_dashboard.py
3. 启动仪表板
# 进入项目根目录
cd D:\Project\PythonProject\AIcode\test
# 激活conda环境
conda activate cardioenv
# 启动Streamlit应用程序
streamlit run module1_dashboard/cardio_dashboard.py
或者使用conda直接运行:
"D:\software\anaconda\Scripts\conda.exe" run -n cardioenv streamlit run module1_dashboard/cardio_dashboard.py
4. 访问应用
打开浏览器,访问: http://localhost:8501
界面说明
侧边栏筛选器
- 年龄范围: 滑动选择器,筛选指定年龄范围的记录
- 性别: 多选框,选择要分析的性别(女性/男性)
- 心血管疾病状态: 多选框,选择疾病状态(有/无)
- BMI分类: 多选框,选择BMI分类(偏瘦/正常/超重/肥胖)
- 胆固醇水平: 多选框,选择胆固醇水平
- 血糖水平: 多选框,选择血糖水平
主界面区域
-
关键指标面板
- 筛选后记录数
- 心血管疾病风险率
- 平均年龄
- 平均BMI
-
数据可视化图表
- 年龄分布与心血管疾病关系直方图
- BMI分类对心血管疾病影响的堆叠柱状图
- 血压关系散点图
- 胆固醇水平分布饼图
- 血糖水平分布饼图
-
数据预览
- 数据摘要(形状、类型、缺失值)
- 原始数据表格(可自定义显示的列)
配置文件说明
.env 文件包含以下配置项:
# 数据文件路径
DATA_PATH=./data/心血管疾病.xlsx
# Flask服务器配置
FLASK_APP=module2_predictor/app.py
FLASK_ENV=development
# Streamlit配置
STREAMLIT_PORT=8501
# AI模型API密钥(需要替换为实际值)
DASHSCOPE_API_KEY=your_dashscope_api_key_here
OPENAI_API_KEY=your_openai_api_key_here
# 模型文件路径
MODEL_PATH=./module2_predictor/models/xgb_model.pkl
依赖包说明
详细依赖见 requirements.txt:
- 数据处理: pandas, numpy, openpyxl
- 机器学习: scikit-learn, xgboost, joblib
- 可视化: streamlit, plotly
- Web服务: Flask
- 环境管理: python-dotenv
- AI集成: langchain-openai, dashscope, requests
Module 2: 机器学习预测器
功能特性
- ✅ 模型训练: XGBoost分类器,准确率约73%
- ✅ 特征工程: 年龄转换、BMI计算、异常值处理
- ✅ RESTful API: Flask提供预测接口
- ✅ 前端界面: 交互式Web表单,实时预测
- ✅ 模型持久化: Joblib保存完整Pipeline
模型训练
1. 训练模型(一次性)
# 进入项目根目录
cd D:\Project\PythonProject\AIcode\test
# 激活conda环境
conda activate cardioenv
# 运行训练脚本
python module2_predictor/train_and_save.py
训练脚本将:
- 加载和清洗数据(与Module 1相同)
- 特征工程:年龄转换、BMI计算
- 构建机器学习Pipeline(StandardScaler + OneHotEncoder + XGBoost)
- 训练模型并评估性能
- 保存模型到
module2_predictor/models/cardio_predictor_model.pkl
2. 模型特征
- 连续特征: age_years, bmi, ap_hi, ap_lo
- 分类特征: gender, cholesterol, gluc
- 二元特征: smoke, alco, active
Top 5 重要特征:
- 收缩压 (ap_hi)
- 极高胆固醇 (cholesterol_3)
- 年龄 (age_years)
- 舒张压 (ap_lo)
- 极高血糖 (gluc_3)
Flask API服务
1. 启动API服务
# 进入项目根目录
cd D:\Project\PythonProject\AIcode\test
# 激活conda环境
conda activate cardioenv
# 方法1: 直接运行Python脚本
python module2_predictor/app.py
# 方法2: 使用Flask CLI
set FLASK_APP=module2_predictor/app.py
flask run --host=0.0.0.0 --port=5000
# 方法3: 使用conda直接运行
"D:\software\anaconda\Scripts\conda.exe" run -n cardioenv python module2_predictor/app.py
2. API端点
| 端点 | 方法 | 描述 |
|---|---|---|
/ |
GET | 前端预测界面 |
/predict_cardio |
POST | 预测接口(接收JSON) |
/health |
GET | 健康检查 |
/model_info |
GET | 模型信息 |
3. 预测接口示例
请求:
curl -X POST http://localhost:5000/predict_cardio \
-H "Content-Type: application/json" \
-d '{
"age": 20228,
"gender": 1,
"height": 156,
"weight": 85,
"ap_hi": 140,
"ap_lo": 90,
"cholesterol": 1,
"gluc": 1,
"smoke": 0,
"alco": 0,
"active": 1
}'
响应:
{
"success": true,
"prediction": 1,
"probability": 0.85,
"risk_level": "高危",
"message": "预测成功",
"features": {
"age_years": 55,
"bmi": 34.9,
"ap_hi": 140,
"ap_lo": 90,
"gender": 1,
"cholesterol": 1,
"gluc": 1,
"smoke": 0,
"alco": 0,
"active": 1
}
}
前端界面
访问 http://localhost:5000 使用预测界面:
- 输入表单: 11个特征字段,包含验证和示例数据
- 实时预测: 点击"开始预测"获取风险评估
- 结果展示: 风险等级、概率、健康建议
- 示例数据: 提供低、中、高风险示例数据
项目结构
module2_predictor/
├── app.py # Flask应用主程序
├── train_and_save.py # 模型训练脚本(一次性)
├── test_api.py # API测试脚本
├── templates/
│ └── index.html # 前端界面模板
└── models/ # 模型文件目录(训练后生成)
├── cardio_predictor_model.pkl
└── feature_info.txt
测试验证
1. 测试模型加载
python module2_predictor/test_api.py
2. 测试API服务
- 启动Flask应用:
python module2_predictor/app.py - 打开浏览器访问:
http://localhost:5000 - 使用示例数据测试预测功能
- 检查健康状态:
http://localhost:5000/health
3. 验证预测准确性
- 测试集准确率:约73%
- 特征重要性符合医学常识
- 风险等级划分合理
配置说明
模型参数
- 算法: XGBoost Classifier
- 树数量: 100
- 最大深度: 5
- 学习率: 0.1
- 子采样率: 0.8
- 随机种子: 42
特征预处理
- 连续特征: StandardScaler标准化
- 分类特征: OneHotEncoder独热编码
- 二元特征: 直接使用(0/1)
性能指标
| 指标 | 训练集 | 测试集 |
|---|---|---|
| 准确率 | 74.21% | 73.14% |
| 特征数量 | 10个 | 10个 |
| 模型大小 | ~1.2 MB | ~1.2 MB |
注意事项
- 模型更新: 当数据变化时,重新运行训练脚本
- 输入验证: API对输入数据有严格的范围验证
- 血压合理性: 自动拒绝舒张压≥收缩压的输入
- 错误处理: 详细的错误信息和日志记录
- 性能: 单次预测时间 < 100ms
常见问题
Q1: 模型训练失败
症状: 训练脚本报错或无法保存模型 解决:
- 检查数据文件路径是否正确
- 确保有足够的磁盘空间
- 检查Python依赖包是否完整安装
Q2: Flask应用无法启动
症状: 启动时出现导入错误或模型加载失败 解决:
- 检查conda环境是否激活
- 确保模型文件存在:
module2_predictor/models/cardio_predictor_model.pkl - 检查端口5000是否被占用
Q3: 预测结果不合理
症状: 预测概率总是0或1,或与预期不符 解决:
- 检查输入数据是否在合理范围内
- 验证特征预处理是否正确
- 确保模型训练时使用了正确的特征
Q4: 前端界面无法访问
症状: 浏览器显示连接错误 解决:
- 确认Flask应用正在运行
- 检查防火墙设置,允许端口5000
- 尝试访问
http://localhost:5000/health检查服务状态
下一步开发
- 模型优化: 尝试其他算法(LightGBM, CatBoost)和超参数调优
- 特征扩展: 添加更多临床特征(家族史、药物治疗等)
- API增强: 添加批量预测、模型版本管理
- 监控告警: 添加性能监控和异常告警
- 部署优化: Docker容器化,云平台部署
常见问题
Q1: 数据加载失败
症状: 应用程序无法启动,提示文件找不到或格式错误 解决:
- 检查
data/心血管疾病.xlsx文件是否存在 - 确认文件格式为Excel 2007+ (.xlsx)
- 检查文件编码,确保不是二进制损坏
Q2: 图表显示异常
症状: 图表不显示或显示错误 解决:
- 检查Plotly是否正确安装:
pip install plotly - 确保数据经过正确清洗,没有无限值或NaN
- 检查筛选条件是否过于严格导致无数据
Q3: 应用程序运行缓慢
症状: 页面响应慢,筛选操作延迟 解决:
- 利用
@st.cache_data装饰器的缓存功能 - 减少一次性加载的数据量
- 优化图表复杂度,减少数据点数量
Q4: 中文显示乱码
症状: 中文文字显示为乱码 解决:
- 确保系统支持中文字体
- Streamlit默认支持UTF-8编码,检查源代码文件保存为UTF-8
- 在Windows系统上,设置控制台编码为UTF-8
开发说明
项目结构
D:\Project\PythonProject\AIcode\test\
├── data\ # 数据文件目录
│ └── 心血管疾病.xlsx
├── module1_dashboard\ # 数据可视化模块
│ ├── cardio_dashboard.py
│ └── test_data.py
├── module2_predictor\ # 机器学习预测模块
│ └── templates\
├── module3_voice_assistant\ # AI语音助手模块
│ └── templates\
├── requirements.txt # Python依赖包
├── .env # 环境配置
└── README.md # 项目文档
代码结构
load_and_process_data(): 数据加载和清洗主函数,使用@st.cache_data缓存create_filters(): 创建侧边栏筛选器组件apply_filters(): 应用筛选条件到数据框display_metrics(): 显示关键指标卡片create_visualizations(): 创建所有可视化图表display_data_preview(): 显示数据预览和摘要
扩展开发
-
添加新图表
def create_new_chart(df): fig = px.scatter(df, x='column1', y='column2', color='cardio_str') st.plotly_chart(fig, use_container_width=True) -
添加新筛选器
# 在create_filters函数中添加 new_filter = st.sidebar.selectbox("新筛选器", options=['选项1', '选项2']) -
自定义样式
st.markdown(""" <style> .custom-class { color: blue; } </style> """, unsafe_allow_html=True)
性能优化建议
- 数据缓存: 所有数据处理函数使用
@st.cache_data装饰器 - 增量加载: 对于大型数据集,考虑分页或懒加载
- 图表优化: 使用采样或聚合减少数据点数量
- 异步处理: 长时间操作使用异步函数避免阻塞UI
下一步计划
- Module 2开发: 实现XGBoost预测模型和Flask API
- Module 3开发: 集成DeepSeek和CosyVoice语音助手
- 功能增强: 添加数据导出、报告生成功能
- 部署优化: Docker容器化,云平台部署
技术支持
- 问题反馈: 检查GitHub Issues或联系开发团队
- 文档更新: 随着功能迭代保持文档同步
- 版本管理: 使用Git进行版本控制,定期发布稳定版本
版权所有 © 2024 CardioAI项目组
版本: 1.0.0
最后更新: 2024-04-02