Files
AIcode/test/README.md
2026-04-02 19:52:38 +08:00

13 KiB
Raw Blame History

CardioAI - 心血管疾病智能辅助系统

项目概述

CardioAI是一个多模块应用系统集成了数据可视化、机器学习预测和AI语音问答功能用于心血管疾病的智能辅助分析和诊断。

系统模块

  1. Module 1: 数据可视化仪表板 (Streamlit) - 本模块

    • 数据清洗与特征工程
    • 交互式数据筛选
    • 可视化分析图表
  2. Module 2: 机器学习预测器 (Flask + XGBoost)

    • 心血管疾病风险预测模型
    • RESTful API接口
    • 实时预测服务
  3. Module 3: AI语音助手 (DeepSeek + CosyVoice)

    • 自然语言问答
    • 语音交互界面
    • 疾病知识查询

Module 1: 数据可视化仪表板

功能特性

  • 数据加载与清洗: 自动处理异常值和缺失数据
  • 特征工程: 年龄转换、BMI计算、类别编码
  • 交互式筛选: 侧边栏多维度数据筛选
  • 可视化分析: Plotly交互式图表
  • 性能优化: 使用缓存加速数据加载

数据处理流程

  1. 数据加载: 从Excel文件加载原始数据
  2. 年龄转换: 将天数转换为年数(四舍五入)
  3. BMI计算: BMI = 体重(kg) / (身高(m)^2)
  4. 异常值处理:
    • 删除舒张压 ≥ 收缩压的记录
    • 删除收缩压不在[90, 250] mmHg范围的记录
    • 删除舒张压不在[60, 150] mmHg范围的记录
  5. 类别转换:
    • 胆固醇水平: 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分类偏瘦/正常/超重/肥胖)
  • 胆固醇水平: 多选框,选择胆固醇水平
  • 血糖水平: 多选框,选择血糖水平

主界面区域

  1. 关键指标面板

    • 筛选后记录数
    • 心血管疾病风险率
    • 平均年龄
    • 平均BMI
  2. 数据可视化图表

    • 年龄分布与心血管疾病关系直方图
    • BMI分类对心血管疾病影响的堆叠柱状图
    • 血压关系散点图
    • 胆固醇水平分布饼图
    • 血糖水平分布饼图
  3. 数据预览

    • 数据摘要(形状、类型、缺失值)
    • 原始数据表格(可自定义显示的列)

配置文件说明

.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

训练脚本将:

  1. 加载和清洗数据与Module 1相同
  2. 特征工程年龄转换、BMI计算
  3. 构建机器学习PipelineStandardScaler + OneHotEncoder + XGBoost
  4. 训练模型并评估性能
  5. 保存模型到 module2_predictor/models/cardio_predictor_model.pkl

2. 模型特征

  • 连续特征: age_years, bmi, ap_hi, ap_lo
  • 分类特征: gender, cholesterol, gluc
  • 二元特征: smoke, alco, active

Top 5 重要特征:

  1. 收缩压 (ap_hi)
  2. 极高胆固醇 (cholesterol_3)
  3. 年龄 (age_years)
  4. 舒张压 (ap_lo)
  5. 极高血糖 (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 使用预测界面:

  1. 输入表单: 11个特征字段包含验证和示例数据
  2. 实时预测: 点击"开始预测"获取风险评估
  3. 结果展示: 风险等级、概率、健康建议
  4. 示例数据: 提供低、中、高风险示例数据

项目结构

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服务

  1. 启动Flask应用python module2_predictor/app.py
  2. 打开浏览器访问:http://localhost:5000
  3. 使用示例数据测试预测功能
  4. 检查健康状态: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

注意事项

  1. 模型更新: 当数据变化时,重新运行训练脚本
  2. 输入验证: API对输入数据有严格的范围验证
  3. 血压合理性: 自动拒绝舒张压≥收缩压的输入
  4. 错误处理: 详细的错误信息和日志记录
  5. 性能: 单次预测时间 < 100ms

常见问题

Q1: 模型训练失败

症状: 训练脚本报错或无法保存模型 解决:

  1. 检查数据文件路径是否正确
  2. 确保有足够的磁盘空间
  3. 检查Python依赖包是否完整安装

Q2: Flask应用无法启动

症状: 启动时出现导入错误或模型加载失败 解决:

  1. 检查conda环境是否激活
  2. 确保模型文件存在:module2_predictor/models/cardio_predictor_model.pkl
  3. 检查端口5000是否被占用

Q3: 预测结果不合理

症状: 预测概率总是0或1或与预期不符 解决:

  1. 检查输入数据是否在合理范围内
  2. 验证特征预处理是否正确
  3. 确保模型训练时使用了正确的特征

Q4: 前端界面无法访问

症状: 浏览器显示连接错误 解决:

  1. 确认Flask应用正在运行
  2. 检查防火墙设置允许端口5000
  3. 尝试访问 http://localhost:5000/health 检查服务状态

下一步开发

  1. 模型优化: 尝试其他算法LightGBM, CatBoost和超参数调优
  2. 特征扩展: 添加更多临床特征(家族史、药物治疗等)
  3. API增强: 添加批量预测、模型版本管理
  4. 监控告警: 添加性能监控和异常告警
  5. 部署优化: Docker容器化云平台部署

常见问题

Q1: 数据加载失败

症状: 应用程序无法启动,提示文件找不到或格式错误 解决:

  1. 检查 data/心血管疾病.xlsx 文件是否存在
  2. 确认文件格式为Excel 2007+ (.xlsx)
  3. 检查文件编码,确保不是二进制损坏

Q2: 图表显示异常

症状: 图表不显示或显示错误 解决:

  1. 检查Plotly是否正确安装pip install plotly
  2. 确保数据经过正确清洗没有无限值或NaN
  3. 检查筛选条件是否过于严格导致无数据

Q3: 应用程序运行缓慢

症状: 页面响应慢,筛选操作延迟 解决:

  1. 利用 @st.cache_data 装饰器的缓存功能
  2. 减少一次性加载的数据量
  3. 优化图表复杂度,减少数据点数量

Q4: 中文显示乱码

症状: 中文文字显示为乱码 解决:

  1. 确保系统支持中文字体
  2. Streamlit默认支持UTF-8编码检查源代码文件保存为UTF-8
  3. 在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(): 显示数据预览和摘要

扩展开发

  1. 添加新图表

    def create_new_chart(df):
        fig = px.scatter(df, x='column1', y='column2', color='cardio_str')
        st.plotly_chart(fig, use_container_width=True)
    
  2. 添加新筛选器

    # 在create_filters函数中添加
    new_filter = st.sidebar.selectbox("新筛选器", options=['选项1', '选项2'])
    
  3. 自定义样式

    st.markdown("""
    <style>
        .custom-class { color: blue; }
    </style>
    """, unsafe_allow_html=True)
    

性能优化建议

  1. 数据缓存: 所有数据处理函数使用 @st.cache_data 装饰器
  2. 增量加载: 对于大型数据集,考虑分页或懒加载
  3. 图表优化: 使用采样或聚合减少数据点数量
  4. 异步处理: 长时间操作使用异步函数避免阻塞UI

下一步计划

  1. Module 2开发: 实现XGBoost预测模型和Flask API
  2. Module 3开发: 集成DeepSeek和CosyVoice语音助手
  3. 功能增强: 添加数据导出、报告生成功能
  4. 部署优化: Docker容器化云平台部署

技术支持

  • 问题反馈: 检查GitHub Issues或联系开发团队
  • 文档更新: 随着功能迭代保持文档同步
  • 版本管理: 使用Git进行版本控制定期发布稳定版本

版权所有 © 2024 CardioAI项目组
版本: 1.0.0
最后更新: 2024-04-02