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月

相关推荐
电气_空空17 小时前
基于 Labview/Matlab 的人脸识别系统设计与实现
单片机·嵌入式硬件·毕业设计·labview
阿_旭17 小时前
基于YOLO26深度学习的风力机缺陷检测与语音提示系统【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·风力机缺陷检测
郝学胜-神的一滴17 小时前
深度解析:Python元类手撸ORM框架,解锁底层编程魔法
数据结构·数据库·python·算法·职场和发展
李恒-聆机智能专精数采17 小时前
从零开始了解数据采集技术篇(8)——为什么工业数据采集很难用“一站式平台”解决?从设备生态到系统架构的技术分析
运维·网络·数据库·数据分析·数据采集
badhope17 小时前
GitHub热门AI技能Top20实战指南
前端·javascript·人工智能·git·python·github·电脑
前端付豪18 小时前
练习单导出
前端·python·llm
@OuYang18 小时前
android10 应用安装
开发语言·python
_MyFavorite_18 小时前
Python 中通过命令行向函数传参
开发语言·chrome·python
墨染天姬18 小时前
【AI】TensorFlow 框架
人工智能·python·tensorflow
jianfeng_zhu18 小时前
用java解决空心金字塔的问题
java·开发语言·python