1. 项目背景与核心价值
这个毕业设计项目瞄准了一个当下非常值得关注的公共卫生问题——肥胖成因分析。根据世界卫生组织的数据,全球肥胖人口在过去40年里几乎翻了三倍。传统的肥胖研究往往依赖于小样本的问卷调查或实验室数据,而我们的系统通过整合机器学习和大数据技术,能够从更宏观的维度发现潜在的影响因素。
我选择用Django作为开发框架,主要是考虑到它完善的ORM系统可以轻松处理复杂的医疗数据关系,同时内置的Admin后台非常适合科研人员直接操作数据。系统最核心的创新点在于同时实现了决策树和深度学习两种算法的对比分析——决策树可以提供清晰的可解释性规则,而深度学习则能捕捉更复杂的非线性关系。
2. 系统架构设计
2.1 技术栈选型
前端采用Bootstrap + ECharts的组合,确保在展示复杂数据关系时既能保持响应式布局,又能通过丰富的图表类型直观呈现分析结果。后端选择Django 3.2版本,这个长期支持版本在稳定性和功能完整性上达到了很好的平衡。
数据库方面,考虑到医疗数据的敏感性,我们使用PostgreSQL 13,它的JSONB字段类型非常适合存储结构多变的体检数据,同时具备完善的角色权限管理系统。对于需要高性能计算的部分,我们通过Celery将预测任务分发到单独的计算节点。
2.2 数据流设计
系统数据处理流程分为四个关键阶段:
- 数据采集层:对接医院HIS系统的API接口,自动获取脱敏后的体检数据
- 特征工程层:使用Python的Feature-engine库进行缺失值处理和特征编码
- 模型训练层:并行运行决策树和LSTM神经网络
- 可视化展示层:生成交互式的特征重要性矩阵和预测结果对比
特别注意:所有医疗数据都需要经过严格的脱敏处理,删除18项个人标识字段后才能进入分析流程
3. 核心算法实现
3.1 决策树模型优化
我们采用CART算法构建决策树,通过网格搜索确定最优参数组合:
python复制from sklearn.tree import DecisionTreeClassifier
params = {
'max_depth': range(3,8),
'min_samples_split': [10,20,30],
'criterion': ['gini','entropy']
}
grid_search = GridSearchCV(
DecisionTreeClassifier(),
param_grid=params,
cv=5,
scoring='f1_weighted'
)
在实际测试中发现,当max_depth=5、min_samples_split=20时,模型在保持可解释性的同时达到了82%的准确率。特征重要性分析显示,每日静坐时间、夜间进食频率和家族病史是影响最大的三个因素。
3.2 深度学习模型构建
考虑到医疗数据的时序特性,我们设计了一个混合神经网络架构:
python复制from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout
model = Sequential([
LSTM(64, input_shape=(30, 15), return_sequences=True),
Dropout(0.3),
LSTM(32),
Dense(16, activation='relu'),
Dense(1, activation='sigmoid')
])
这个模型特别处理了两种关键数据:
- 静态数据:年龄、性别、基础代谢率等
- 动态数据:连续30天的运动量、饮食记录等
通过Attention机制增强模型的可解释性,最终在测试集上达到89%的AUC值。
4. 系统功能实现
4.1 数据看板设计
使用Django Template语言结合ECharts实现了动态数据看板,关键代码结构:
html复制<div class="row">
<div id="feature-importance" style="height:400px;"></div>
</div>
<script></script>
4.2 预测API接口
为方便移动端调用,我们设计了RESTful API:
python复制@api_view(['POST'])
@permission_classes([IsAuthenticated])
def predict(request):
serializer = PatientSerializer(data=request.data)
if serializer.is_valid():
data = preprocess(serializer.validated_data)
dt_pred = dt_model.predict_proba(data)[0][1]
dl_pred = dl_model.predict(data)[0][0]
return Response({
'decision_tree': dt_pred,
'deep_learning': dl_pred,
'final': (dt_pred + dl_pred)/2
})
5. 实际应用中的挑战
5.1 数据不平衡问题
原始数据中肥胖样本仅占17%,我们采用以下解决方案:
- 过采样:使用SMOTE算法生成合成样本
- 代价敏感学习:设置class_weight参数
- 评估指标:采用F1-score代替准确率
5.2 模型可解释性
虽然深度学习效果更好,但医疗机构更看重可解释性。我们的解决方案:
- 使用SHAP值解释预测结果
- 开发决策路径可视化工具
- 为每个预测生成自然语言解释
6. 部署注意事项
-
性能优化:
- 使用Django的cache_page装饰器缓存常用查询
- 对模型进行ONNX格式转换,提升推理速度
- 配置Gunicorn+Gevent的异步worker
-
安全措施:
- 实现HIPAA兼容的数据加密
- 定期进行渗透测试
- 操作日志完整审计
这个项目最让我有成就感的是发现了一个有趣的现象:通过对比分析,决策树和深度学习模型在某些特征的重要性评估上存在显著差异。例如,决策树认为睡眠质量是次要因素,而深度学习模型却显示它与肥胖有很强的非线性关联。这提示我们可能需要更深入地研究睡眠节律对代谢的影响机制。