基于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月