332-基于XGBoost与SHAP的可穿戴设备亚健康风险识别系统

基于XGBoost与SHAP的可穿戴设备亚健康风险识别系统 - 技术文档

1. 系统概述

1.1 项目背景

随着可穿戴设备的普及,人们可以方便地采集心率、睡眠、运动等健康数据。本系统利用机器学习技术,对这些数据进行分析,识别用户的亚健康风险,并通过SHAP可解释性技术让用户理解影响健康的关键因素。

1.2 系统目标

  • 收集和管理用户的可穿戴设备健康数据
  • 基于XGBoost模型进行亚健康风险评估
  • 使用SHAP提供可解释的预测结果
  • 生成个性化的健康报告和建议
  • 提供直观的数据可视化展示

1.3 技术栈

层次 技术 版本 说明
前端框架 Vue.js 3.x 响应式前端框架
构建工具 Vite 5.x 快速的前端构建工具
UI组件库 Element Plus 2.x Vue3 UI组件库
图表库 ECharts 5.x 数据可视化
状态管理 Pinia 2.x Vue3状态管理
后端框架 Flask 3.x Python Web框架
ORM SQLAlchemy 2.x 数据库ORM
数据库 MySQL 8.0 关系型数据库
机器学习 XGBoost 2.x 梯度提升算法
可解释AI SHAP 0.44+ 模型解释工具
认证 JWT - JSON Web Token
数据导出 openpyxl/reportlab - Excel/PDF生成

1.4 演示图片






















2. 系统架构

2.1 整体架构

复制代码
┌─────────────────────────────────────────────────────────────┐
│                        客户端层                              │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │
│  │   Web端     │  │   移动端    │  │   数据大屏   │         │
│  │  (Vue3)     │  │  (响应式)   │  │  (Screen)   │         │
│  └─────────────┘  └─────────────┘  └─────────────┘         │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                        API网关层                             │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                  Flask RESTful API                   │   │
│  │    /api/auth  /api/health  /api/risk  /api/shap    │   │
│  └─────────────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                        业务逻辑层                            │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐   │
│  │ 用户服务  │  │ 健康服务  │  │ 评估服务  │  │ 报告服务  │   │
│  └──────────┘  └──────────┘  └──────────┘  └──────────┘   │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐                  │
│  │ ML服务   │  │ SHAP服务  │  │ 导出服务  │                  │
│  └──────────┘  └──────────┘  └──────────┘                  │
└─────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌─────────────────────────────────────────────────────────────┐
│                        数据访问层                            │
│  ┌─────────────────────────────────────────────────────┐   │
│  │                   SQLAlchemy ORM                     │   │
│  └─────────────────────────────────────────────────────┘   │
│                              │                              │
│  ┌──────────────────┐  ┌──────────────────┐               │
│  │     MySQL        │  │   文件存储        │               │
│  │   (主数据库)      │  │  (头像/模型)      │               │
│  └──────────────────┘  └──────────────────┘               │
└─────────────────────────────────────────────────────────────┘

2.2 目录结构

复制代码
code/
├── backend/                      # 后端应用
│   ├── app/
│   │   ├── __init__.py          # Flask应用工厂
│   │   ├── models/              # 数据模型
│   │   │   ├── __init__.py      # 模型导出
│   │   │   ├── user.py          # 用户模型
│   │   │   ├── health_data.py   # 健康数据模型
│   │   │   ├── risk_assessment.py # 风险评估模型
│   │   │   ├── shap_explanation.py # SHAP解释模型
│   │   │   ├── health_report.py # 健康报告模型
│   │   │   ├── device.py        # 设备模型
│   │   │   ├── notification.py  # 通知模型
│   │   │   └── feature_importance.py # 特征重要性模型
│   │   ├── routes/              # API路由
│   │   │   ├── auth.py          # 认证相关
│   │   │   ├── health.py        # 健康数据
│   │   │   ├── risk.py          # 风险评估
│   │   │   ├── shap.py          # SHAP解释
│   │   │   ├── report.py        # 健康报告
│   │   │   ├── user.py          # 用户管理
│   │   │   ├── device.py        # 设备管理
│   │   │   ├── notification.py  # 通知管理
│   │   │   ├── stats.py         # 统计数据
│   │   │   └── export.py        # 数据导出
│   │   └── services/            # 业务服务
│   │       ├── ml_service.py    # 机器学习服务
│   │       ├── report_service.py # 报告生成服务
│   │       └── export_service.py # 数据导出服务
│   ├── ml/                      # 机器学习模块
│   │   ├── __init__.py
│   │   ├── train_model.py       # 模型训练脚本
│   │   └── models/              # 训练好的模型文件
│   ├── static/                  # 静态资源
│   │   ├── devices/             # 设备图标
│   │   └── uploads/             # 用户上传文件
│   ├── config.py                # 配置文件
│   ├── run.py                   # 启动脚本
│   └── requirements.txt         # Python依赖
│
├── frontend/                    # 前端应用
│   ├── src/
│   │   ├── api/                 # API请求模块
│   │   │   ├── request.js       # Axios封装
│   │   │   ├── auth.js          # 认证API
│   │   │   ├── health.js        # 健康数据API
│   │   │   ├── risk.js          # 风险评估API
│   │   │   ├── shap.js          # SHAP API
│   │   │   ├── report.js        # 报告API
│   │   │   ├── user.js          # 用户API
│   │   │   ├── device.js        # 设备API
│   │   │   ├── notification.js  # 通知API
│   │   │   ├── stats.js         # 统计API
│   │   │   └── export.js        # 导出API
│   │   ├── components/          # 公共组件
│   │   │   ├── PageHeader.vue   # 页面头部
│   │   │   └── UserInfoBanner.vue # 用户信息横幅
│   │   ├── layouts/             # 布局组件
│   │   │   └── MainLayout.vue   # 主布局
│   │   ├── router/              # 路由配置
│   │   │   └── index.js
│   │   ├── store/               # 状态管理
│   │   │   ├── user.js          # 用户状态
│   │   │   └── theme.js         # 主题状态
│   │   ├── styles/              # 全局样式
│   │   │   └── index.scss
│   │   ├── views/               # 页面视图
│   │   │   ├── Login.vue        # 登录页
│   │   │   ├── Register.vue     # 注册页
│   │   │   ├── Dashboard.vue    # 仪表盘
│   │   │   ├── Health.vue       # 健康数据
│   │   │   ├── Risk.vue         # 风险评估
│   │   │   ├── RiskDetail.vue   # 评估详情
│   │   │   ├── Analytics.vue    # 数据分析
│   │   │   ├── Report.vue       # 健康报告
│   │   │   ├── ReportDetail.vue # 报告详情
│   │   │   ├── Explain.vue      # SHAP解释
│   │   │   ├── Device.vue       # 设备管理
│   │   │   ├── Profile.vue      # 个人中心
│   │   │   ├── Screen.vue       # 数据大屏
│   │   │   ├── UserManagement.vue # 用户管理(管理员)
│   │   │   └── NotificationManage.vue # 通知管理
│   │   ├── App.vue              # 根组件
│   │   └── main.js              # 入口文件
│   ├── index.html
│   ├── vite.config.js           # Vite配置
│   └── package.json             # 依赖配置
│
├── database/                    # 数据库脚本
│   ├── init.sql                 # 数据库初始化
│   ├── mock_data.sql            # 模拟数据
│   ├── training_data.csv        # 训练数据
│   ├── generate_mock_data.py    # 数据生成脚本
│   └── generate_password_hash.py # 密码哈希生成
│
└── docs/                        # 文档目录
    ├── 技术文档.md
    └── 部署手册.md

3. 数据库设计

3.1 ER图

复制代码
┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│     User     │────<│  HealthData  │     │   Device     │
│──────────────│     │──────────────│     │──────────────│
│ id (PK)      │     │ id (PK)      │     │ id (PK)      │
│ username     │     │ user_id (FK) │     │ brand        │
│ password     │     │ record_date  │     │ model        │
│ email        │     │ heart_rate   │     │ device_type  │
│ phone_number │     │ blood_oxygen │     │ support_*    │
│ role         │     │ sleep_*      │     └──────────────┘
│ ...          │     │ steps        │            │
└──────────────┘     │ stress_level │     ┌──────────────┐
       │             │ ...          │     │  UserDevice  │
       │             └──────────────┘     │──────────────│
       │                                  │ user_id (FK) │
       │                                  │ device_id(FK)│
       │                                  │ device_sn    │
       │                                  │ status       │
       │                                  └──────────────┘
       │
       ├────────────<┌──────────────┐
       │             │RiskAssessment│
       │             │──────────────│
       │             │ id (PK)      │
       │             │ user_id (FK) │
       │             │ risk_level   │
       │             │ risk_score   │
       │             │ risk_factors │
       │             │ input_features│
       │             └──────────────┘
       │                    │
       │             ┌──────────────┐
       │             │SHAPExplanation│
       │             │──────────────│
       │             │ id (PK)      │
       │             │ assessment_id│
       │             │ shap_values  │
       │             │ base_value   │
       │             │ waterfall    │
       │             └──────────────┘
       │
       ├────────────<┌──────────────┐
       │             │ HealthReport │
       │             │──────────────│
       │             │ id (PK)      │
       │             │ user_id (FK) │
       │             │ assessment_id│
       │             │ report_title │
       │             │ report_content│
       │             │ suggestions  │
       │             └──────────────┘
       │
       └────────────<┌──────────────┐
                     │ Notification │
                     │──────────────│
                     │ id (PK)      │
                     │ user_id (FK) │
                     │ type         │
                     │ title        │
                     │ content      │
                     │ is_read      │
                     └──────────────┘

3.2 数据表详细说明

3.2.1 用户表 (user)
字段 类型 说明
id INT 主键,自增
username VARCHAR(50) 用户名,唯一
password VARCHAR(255) 密码哈希 (scrypt)
email VARCHAR(100) 邮箱
phone_number VARCHAR(20) 手机号
image VARCHAR(255) 头像路径
gender VARCHAR(10) 性别
birthday DATE 生日
age INT 年龄
height DECIMAL(5,2) 身高(cm)
weight DECIMAL(5,2) 体重(kg)
role VARCHAR(20) 角色(user/admin)
created_at DATETIME 创建时间
updated_at DATETIME 更新时间
3.2.2 健康数据表 (health_data)
字段 类型 说明
id INT 主键
user_id INT 用户ID (外键)
record_date DATE 记录日期
heart_rate_avg INT 平均心率
heart_rate_max INT 最大心率
heart_rate_resting INT 静息心率
blood_oxygen DECIMAL(5,2) 血氧饱和度(%)
sleep_duration DECIMAL(4,2) 睡眠时长(小时)
deep_sleep DECIMAL(4,2) 深睡时长
light_sleep DECIMAL(4,2) 浅睡时长
rem_sleep DECIMAL(4,2) REM睡眠时长
sleep_score INT 睡眠评分
steps INT 步数
distance DECIMAL(6,2) 运动距离(km)
calories INT 消耗卡路里
active_minutes INT 活动分钟数
stress_level INT 压力指数(0-100)
hrv INT 心率变异性
device_id INT 数据来源设备
created_at DATETIME 创建时间
3.2.3 风险评估表 (risk_assessment)
字段 类型 说明
id INT 主键
user_id INT 用户ID (外键)
assessment_date DATETIME 评估时间
risk_level VARCHAR(20) 风险等级
risk_score DECIMAL(5,2) 风险评分(0-100)
risk_probability DECIMAL(5,4) 风险概率
top_risk_factors JSON 主要风险因素
input_features JSON 输入特征值
model_version VARCHAR(50) 模型版本
created_at DATETIME 创建时间

risk_level 枚举值:

  • healthy: 健康 (评分 0-25)
  • mild: 轻度亚健康 (评分 25-50)
  • moderate: 中度亚健康 (评分 50-75)
  • severe: 重度亚健康 (评分 75-100)
3.2.4 SHAP解释表 (shap_explanations)
字段 类型 说明
id INT 主键
assessment_id INT 评估ID (外键)
shap_values JSON SHAP值数组
base_value DECIMAL(10,6) 基准值
waterfall_data JSON 瀑布图数据
force_plot_data JSON 力图数据
created_at DATETIME 创建时间

4. API接口文档

4.1 认证接口

4.1.1 用户注册
复制代码
POST /api/auth/register

Request:
{
  "username": "string",      // 4-20位字母数字
  "password": "string",      // 6-20位
  "email": "string",         // 可选
  "phone_number": "string"   // 可选
}

Response:
{
  "code": 200,
  "message": "注册成功",
  "data": {
    "user_id": 1,
    "username": "string"
  }
}
4.1.2 用户登录
复制代码
POST /api/auth/login

Request:
{
  "username": "string",
  "password": "string"
}

Response:
{
  "code": 200,
  "message": "登录成功",
  "data": {
    "token": "eyJ...",       // JWT Token
    "user": {
      "id": 1,
      "username": "string",
      "role": "user"
    }
  }
}
4.1.3 获取用户信息
复制代码
GET /api/auth/info
Headers: Authorization: Bearer <token>

Response:
{
  "code": 200,
  "data": {
    "id": 1,
    "username": "string",
    "email": "string",
    "role": "user",
    ...
  }
}

4.2 健康数据接口

4.2.1 上传健康数据
复制代码
POST /api/health/upload
Headers: Authorization: Bearer <token>

Request:
{
  "record_date": "2024-01-01",
  "heart_rate_avg": 72,
  "heart_rate_resting": 65,
  "blood_oxygen": 98.5,
  "sleep_duration": 7.5,
  "deep_sleep": 1.5,
  "steps": 8000,
  "stress_level": 35,
  ...
}

Response:
{
  "code": 200,
  "message": "上传成功",
  "data": { "id": 1 }
}
4.2.2 获取健康数据列表
复制代码
GET /api/health/list?page=1&per_page=10&start_date=2024-01-01&end_date=2024-01-31
Headers: Authorization: Bearer <token>

Response:
{
  "code": 200,
  "data": {
    "list": [...],
    "total": 100,
    "page": 1,
    "per_page": 10
  }
}
4.2.3 获取健康趋势
复制代码
GET /api/health/trend?days=14
Headers: Authorization: Bearer <token>

Response:
{
  "code": 200,
  "data": {
    "dates": ["2024-01-01", ...],
    "heart_rate_avg": [72, 73, ...],
    "sleep_duration": [7.5, 8.0, ...],
    "steps": [8000, 7500, ...],
    ...
  }
}

4.3 风险评估接口

4.3.1 执行风险评估
复制代码
POST /api/risk/assess
Headers: Authorization: Bearer <token>

Request:
{
  "health_data_id": 1  // 可选,不传则使用最新数据
}

Response:
{
  "code": 200,
  "data": {
    "assessment_id": 1,
    "risk_level": "mild",
    "risk_score": 35.5,
    "risk_probability": 0.355,
    "top_risk_factors": [
      {
        "feature": "sleep_duration",
        "feature_cn": "睡眠时长",
        "value": 5.5,
        "impact": 0.12
      },
      ...
    ]
  }
}
4.3.2 获取评估历史
复制代码
GET /api/risk/history?page=1&per_page=10
Headers: Authorization: Bearer <token>

Response:
{
  "code": 200,
  "data": {
    "list": [...],
    "total": 50
  }
}

4.4 SHAP解释接口

4.4.1 获取全局特征重要性
复制代码
GET /api/shap/global-importance
Headers: Authorization: Bearer <token>

Response:
{
  "code": 200,
  "data": [
    {
      "feature_name": "sleep_duration",
      "feature_name_cn": "睡眠时长",
      "importance_value": 0.185
    },
    ...
  ]
}
4.4.2 获取瀑布图数据
复制代码
GET /api/shap/waterfall/{assessment_id}
Headers: Authorization: Bearer <token>

Response:
{
  "code": 200,
  "data": {
    "base_value": 0.5,
    "features": [
      {
        "feature": "sleep_duration",
        "feature_cn": "睡眠时长",
        "value": 5.5,
        "shap_value": 0.12,
        "contribution": "positive"
      },
      ...
    ],
    "prediction": 0.65
  }
}

4.5 数据导出接口

4.5.1 导出健康数据Excel
复制代码
GET /api/export/health/excel?start_date=2024-01-01&end_date=2024-01-31
Headers: Authorization: Bearer <token>

Response: Excel文件流
Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
4.5.2 导出健康报告PDF
复制代码
GET /api/export/report/pdf/{report_id}
Headers: Authorization: Bearer <token>

Response: PDF文件流
Content-Type: application/pdf

5. 机器学习模型

5.1 模型概述

本系统采用XGBoost(eXtreme Gradient Boosting)算法进行亚健康风险预测。XGBoost是一种集成学习方法,通过组合多个弱学习器来构建强学习器。

5.2 特征工程

输入特征(13个)
特征名 中文名 数据范围 说明
heart_rate_avg 平均心率 50-120 bpm 日均心率
heart_rate_resting 静息心率 40-100 bpm 静息状态心率
hrv 心率变异性 10-100 ms 心率变异程度
blood_oxygen 血氧饱和度 90-100% 血液氧含量
sleep_duration 睡眠时长 3-12 h 每日睡眠时间
deep_sleep 深睡时长 0-4 h 深度睡眠时间
sleep_score 睡眠评分 0-100 综合睡眠质量
steps 日均步数 0-30000 每日行走步数
active_minutes 活动时长 0-300 min 活动分钟数
calories 消耗卡路里 0-1000 kcal 运动消耗热量
stress_level 压力指数 0-100 压力水平
exercise_frequency 运动频率 0-7 次/周 每周运动次数
water_intake 饮水量 0-5 L 每日饮水量
输出标签
  • 分类标签:healthy(0), mild(1), moderate(2), severe(3)
  • 回归目标:风险评分 0-100

5.3 模型参数

python 复制代码
xgb_params = {
    'objective': 'multi:softprob',
    'num_class': 4,
    'max_depth': 6,
    'learning_rate': 0.1,
    'n_estimators': 100,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'random_state': 42
}

5.4 SHAP可解释性

SHAP(SHapley Additive exPlanations)基于博弈论中的Shapley值,为每个特征分配一个贡献值,表示该特征对预测结果的影响程度。

SHAP值解读:

  • 正值:该特征增加了亚健康风险
  • 负值:该特征降低了亚健康风险
  • 绝对值大小:表示影响程度

5.5 模型训练流程

python 复制代码
# 1. 数据加载与预处理
data = pd.read_csv('training_data.csv')
X = data[feature_columns]
y = data['risk_level']

# 2. 数据集划分
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# 3. 模型训练
model = XGBClassifier(**xgb_params)
model.fit(X_train, y_train)

# 4. 模型评估
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)

# 5. SHAP解释器
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)

# 6. 保存模型
joblib.dump(model, 'xgboost_model.pkl')
joblib.dump(explainer, 'shap_explainer.pkl')

6. 前端架构

6.1 路由设计

路径 组件 说明 权限
/login Login.vue 登录页 公开
/register Register.vue 注册页 公开
/ Dashboard.vue 仪表盘 用户
/health Health.vue 健康数据 用户
/risk Risk.vue 风险评估 用户
/risk/:id RiskDetail.vue 评估详情 用户
/analytics Analytics.vue 数据分析 用户
/report Report.vue 健康报告 用户
/explain Explain.vue SHAP解释 用户
/device Device.vue 设备管理 用户
/profile Profile.vue 个人中心 用户
/screen Screen.vue 数据大屏 公开
/admin/users UserManagement.vue 用户管理 管理员

6.2 状态管理

javascript 复制代码
// store/user.js
export const useUserStore = defineStore('user', {
  state: () => ({
    token: localStorage.getItem('token') || '',
    userInfo: null,
    isLoggedIn: false
  }),
  actions: {
    async login(credentials) { ... },
    async logout() { ... },
    async fetchUserInfo() { ... }
  }
})

6.3 API请求封装

javascript 复制代码
// api/request.js
const request = axios.create({
  baseURL: '/api',
  timeout: 30000
})

// 请求拦截器 - 添加Token
request.interceptors.request.use(config => {
  const token = localStorage.getItem('token')
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config
})

// 响应拦截器 - 统一错误处理
request.interceptors.response.use(
  response => response.data,
  error => {
    if (error.response?.status === 401) {
      // Token过期,跳转登录
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

6.4 图表组件

系统使用ECharts实现数据可视化,主要图表类型:

图表类型 使用场景
折线图 健康趋势、风险趋势
柱状图 周数据对比、特征重要性
饼图 风险分布、睡眠结构
雷达图 健康指标综合评估
仪表盘 目标达成进度
热力图 日历健康评分
散点图 指标相关性分析

7. 安全设计

7.1 认证机制

  • 使用JWT (JSON Web Token) 进行身份认证
  • Token有效期24小时
  • 密码使用werkzeug的scrypt算法加密存储

7.2 权限控制

  • 普通用户:只能访问自己的数据
  • 管理员:可以查看和管理所有用户数据

7.3 数据安全

  • 敏感数据(密码)加密存储
  • API接口需要Token认证
  • 文件上传限制类型和大小
  • SQL注入防护(SQLAlchemy ORM)
  • XSS防护(Vue自动转义)

8. 性能优化

8.1 后端优化

  • 数据库连接池
  • 查询结果缓存
  • 分页加载
  • 异步任务处理

8.2 前端优化

  • 路由懒加载
  • 组件按需导入
  • 图片懒加载
  • 请求防抖/节流
  • 虚拟滚动(大数据列表)

9. 版本信息

版本 日期 说明
v1.0.0 2024-02 初始版本,完成核心功能

文档更新日期:2024年2月

相关推荐
啊阿狸不会拉杆2 小时前
《计算机视觉:模型、学习和推理》第 7 章-复杂数据密度建模
人工智能·python·学习·算法·计算机视觉·t分布·复杂数据密度建模
喵手2 小时前
Python爬虫实战:基于ETag/Last-Modified的智能条件请求与流量优化!
爬虫·python·爬虫实战·零基础python爬虫教学·etag/last·modified·智能条件请求与流量优化
MediaTea2 小时前
Python:比较协议
运维·服务器·开发语言·网络·python
sg_knight3 小时前
对象池模式(Object Pool)
python·设计模式·object pool·对象池模式
240291003373 小时前
自编码器(AE)与变分自编码器(VAE)-- 认识篇
python·神经网络·机器学习
郝学胜-神的一滴3 小时前
Python中的“==“与“is“:深入解析与Vibe Coding时代的优化实践
开发语言·数据结构·c++·python·算法
上单带刀不带妹3 小时前
【Axios 实战】网络图片地址转 File 对象,附跨域解决方案
开发语言·前端·javascript·vue
SuperEugene4 小时前
前端模块化与 import/export入门:从「乱成一团」到「清晰可维护」
前端·javascript·面试·vue