📊 抑郁检测概率计算详细分析
🎯 文档概述
本文档详细分析多模态抑郁检测系统中抑郁概率的计算过程,包括模型训练、推理计算、多模态融合、阈值判断和严重程度评估等完整流程。通过具体实例和数学公式,帮助您理解概率计算的每一步。
🏗️ 目录
🧠 训练阶段:模型学习过程
1.1 逻辑回归模型训练
逻辑回归是本项目的核心分类算法,其训练过程如下:
pipeline = Pipeline([
('scaler', StandardScaler()),
('selector', SelectKBest(f_classif, k=25)),
('smote', SMOTE(random_state=42, k_neighbors=2)),
('clf', LogisticRegression(
penalty='l1',
solver='liblinear',
class_weight='balanced',
random_state=42,
max_iter=1000
))
])
pipeline.fit(X_train, y_train)
1.2 模型学习原理
逻辑回归模型通过以下步骤学习特征权重:
- 线性组合计算:
“`math
z = w_0 + w_1 \times \text{特征}_1 + w_2 \times \text{特征}_2 + \dots + w_n \times \text{特征}_n
“`
- Sigmoid函数转换:
“`math
P(y=1|X) = \frac{1}{1 + e^{-z}}
“`
- 权重优化:通过最大似然估计优化权重 w_0, w_1, w_2, …, w_n
1.3 关键组件
- 特征选择:使用SelectKBest选择最具判别力的特征
– 多模态模型:选择25个特征
– 单模态模型:最多选择20个特征 - 特征标准化:使用StandardScaler将特征标准化为均值0、标准差1的分布
- 类别不平衡处理:使用SMOTE算法生成合成样本,平衡抑郁样本(约30%)和正常样本(约70%)的分布
1.4 实例说明
假设我们有以下特征:
- 音频特征:基频(f0_mean) = 85Hz,能量(energy) = 0.32
- 视频特征:微笑强度(AU12) = 0.25,眉毛降低(AU04) = 2.0
训练后的权重可能如下:
w_0 = -1.2, w_1 = -0.05, w_2 = -0.8, w_3 = 0.6, w_4 = 0.9
线性组合计算:
z = -1.2 + (-0.05) \times 85 + (-0.8) \times 0.32 + 0.6 \times 0.25 + 0.9 \times 2.0
z = -1.2 – 4.25 – 0.256 + 0.15 + 1.8 = -3.756
Sigmoid转换:
P(y=1|X) = \frac{1}{1 + e^{-(-3.756)}} = \frac{1}{1 + e^{3.756}} \approx \frac{1}{1 + 42.7} \approx 0.023
这表示该样本有2.3%的概率是抑郁。
🔍 推理阶段:概率计算
2.1 单模态概率计算
在推理阶段,系统根据输入特征计算抑郁概率:
# 音频模型概率计算
p_a = float(self.models['audio'].predict_proba(X_a)[0][1])
# 视频模型概率计算
p_v = float(self.models['visual'].predict_proba(X_v)[0][1])
2.2 概率计算步骤
-
特征准备:从输入数据中提取对应模态的特征向量
-
特征标准化:使用训练时保存的
scaler进行标准化 -
模型预测:调用
predict_proba()方法获取预测概率 -
结果提取:
[0][1]表示第一个样本的正类(抑郁)概率
2.3 概率范围
-
最小值:0.0(完全不可能抑郁)
-
最大值:1.0(确定抑郁)
-
实际意义:表示样本属于抑郁类别的概率
2.4 实例说明
假设我们有以下输入特征:
音频特征:
audio_features = {
'aud_f0_mean': 75,
'aud_energy': 0.28,
'aud_voiced_ratio': 0.6
}
视频特征:
visual_features = {
'vis_AU12_r_mean': 0.15,
'vis_AU04_r_mean': 2.5,
'vis_gaze_angle_x_mean': 0.12
}
模型预测结果:
-
音频模型输出:
p_a = 0.78(78%概率抑郁) -
视频模型输出:
p_v = 0.65(65%概率抑郁)
🔄 多模态融合:加权决策融合
3.1 融合策略
系统采用加权决策融合策略,结合音频和视频模型的预测结果:
# 加权融合:音频权重0.55,视频权重0.45
proba = p_a * 0.55 + p_v * 0.45
3.2 融合原理
-
权重来源:基于实验结果优化得到的最佳权重组合
-
音频权重更高:0.55(音频)vs 0.45(视频)
-
原理:音频特征对抑郁检测的贡献更大
3.3 融合优势
-
信息互补:音频和视频特征提供不同维度的信息
-
鲁棒性增强:单个模态质量不佳时仍能获得较好结果
-
准确性提升:融合结果通常优于单模态预测
3.4 融合示例
示例1:正常情况
# 音频模型输出概率:p_a = 0.85
# 视频模型输出概率:p_v = 0.65
# 融合后概率:0.85 × 0.55 + 0.65 × 0.45 = 0.76(76%概率抑郁)
示例2:单模态质量差
# 音频模型输出概率:p_a = 0.90(高质量音频)
# 视频模型输出概率:p_v = 0.40(模糊视频,质量差)
# 融合后概率:0.90 × 0.55 + 0.40 × 0.45 = 0.675(67.5%概率抑郁)
# 即使视频质量差,系统仍能基于音频特征给出合理判断
示例3:双模态一致
# 音频模型输出概率:p_a = 0.80
# 视频模型输出概率:p_v = 0.80
# 融合后概率:0.80 × 0.55 + 0.80 × 0.45 = 0.80(80%概率抑郁)
✅ 阈值判断:最终分类
4.1 阈值获取
系统通过以下优先级获取阈值:
threshold, th_source = self.get_threshold(mode)
is_depressed = proba >= threshold
4.2 阈值确定方法
-
手动配置阈值:优先使用用户手动设置的阈值
-
自动校准阈值:基于F2分数优化的阈值(0.05-0.75范围)
-
默认阈值:音频0.55,视频0.5,多模态0.5
4.3 阈值优化
阈值通过最大化F2分数进行优化:
def _optimal_f2_threshold(probas, y_true, default=0.50):
best_th, best_f2 = default, -1.0
for th in np.linspace(0.1, 0.9, 41):
y_pred = (probas >= th).astype(int)
f2 = fbeta_score(y_true, y_pred, beta=2)
if f2 > best_f2:
best_f2, best_th = f2, th
return float(best_th)
4.4 阈值作用
-
将连续的概率值转换为二分类结果(抑郁/非抑郁)
-
平衡召回率和精确率(优先保证高召回率,减少漏诊)
4.5 判断示例
示例1:高于阈值
# 融合后概率:proba = 0.76
# 多模态阈值:threshold = 0.5
# 判断:0.76 >= 0.5 → 判定为抑郁
示例2:低于阈值
# 融合后概率:proba = 0.45
# 多模态阈值:threshold = 0.5
# 判断:0.45 < 0.5 → 判定为非抑郁
示例3:接近阈值
# 融合后概率:proba = 0.52
# 多模态阈值:threshold = 0.5
# 判断:0.52 >= 0.5 → 判定为抑郁(临界情况)
📈 严重程度评估:PHQ-8分数计算
5.1 双重评估机制
系统采用双重机制评估严重程度:
# 方法1:回归模型预测(优先)
predicted_score = float(self.score_models[mode].predict(X_score)[0])
# 方法2:概率映射(备用)
if final_score <= 0:
if proba < threshold:
final_score = (proba / threshold) * 9.9 # 映射到0~9.9
else:
ratio = (proba - threshold) / (1.0 - threshold)
final_score = 10.0 + ratio * 14.0 # 映射到10~24
5.2 回归模型
系统训练了Ridge回归模型预测PHQ-8分数:
reg_pipeline = Pipeline([
('scaler', StandardScaler()),
('selector', SelectKBest(f_regression, k=25)),
('reg', Ridge(alpha=1.0, random_state=42))
])
5.3 严重程度分级标准
根据PHQ-8分数进行严重程度分级:
| 分数范围 | 严重程度 | 颜色标识 |
|———|———|——–|
| 0-4分 | 无抑郁倾向 | 绿色 |
| 5-9分 | 轻度抑郁 | 黄色 |
| 10-14分 | 中度抑郁 | 橙色 |
| 15-19分 | 中重度抑郁 | 橙红色 |
| 20-24分 | 重度抑郁 | 红色 |
5.4 分数融合逻辑
系统实现了智能的分数融合逻辑,确保分类结果与分数保持一致:
# 如果分类器判定为抑郁但分数过低,强制提升分数
if is_depressed and final_score < 10:
confidence = (proba - threshold) / (1.0 - threshold)
boost = 10.5 + confidence * 5.0
final_score = max(final_score, boost)
# 如果分类器判定为非抑郁但分数过高,强制压低分数
if not is_depressed and final_score >= 10:
final_score = min(final_score, 9.5)
5.5 分数计算示例
示例1:使用回归模型
# 回归模型预测分数:predicted_score = 16.5
# 分类结果:is_depressed = True(抑郁)
# 最终分数:16.5 → 中重度抑郁
示例2:使用概率映射(低于阈值)
# 融合后概率:proba = 0.4(低于阈值0.5)
# 计算:final_score = (0.4 / 0.5) × 9.9 = 7.92
# 最终分数:7.92 → 轻度抑郁
示例3:使用概率映射(高于阈值)
# 融合后概率:proba = 0.75(高于阈值0.5)
# 计算:ratio = (0.75 - 0.5) / (1.0 - 0.5) = 0.5
# final_score = 10.0 + 0.5 × 14.0 = 17.0
# 最终分数:17.0 → 中重度抑郁
示例4:分数融合修正
# 分类结果:is_depressed = True(抑郁)
# 回归模型预测:final_score = 8.5(低于10)
# 修正计算:
# confidence = (0.76 - 0.5) / (1.0 - 0.5) = 0.52
# boost = 10.5 + 0.52 × 5.0 = 13.1
# final_score = max(8.5, 13.1) = 13.1
# 最终分数:13.1 → 中度抑郁(与分类结果一致)
📊 完整流程图
输入数据 → 特征提取 → 特征预处理 → 模型预测 → 多模态融合 → 阈值判断 → 严重程度评估 → 最终结果
↓ ↓ ↓ ↓ ↓ ↓ ↓
音视频文件 音频特征 标准化 单模态概率 加权融合 抑郁/非抑郁 PHQ-8分数
视频特征 特征选择 0.55/0.45
🔢 示例计算过程
步骤1:特征提取
-
音频特征:
aud_f0_mean=85, aud_energy=0.32, aud_voiced_ratio=0.75, ... -
视频特征:
vis_AU12_r_mean=0.25, vis_pose_Rx_mean=0.15, vis_gaze_angle_x_mean=0.08, ...
步骤2:模型预测
-
音频模型:通过逻辑回归计算得到概率
p_a = 0.82 -
视频模型:通过逻辑回归计算得到概率
p_v = 0.68
步骤3:多模态融合
\text{proba} = 0.82 \times 0.55 + 0.68 \times 0.45 = 0.451 + 0.306 = 0.757
步骤4:阈值判断
-
阈值:
threshold = 0.5 -
判断:
0.757 >= 0.5 → 判定为抑郁
步骤5:严重程度评估
-
回归模型预测:PHQ-8分数 = 16.5
-
严重程度:中重度抑郁(橙红色)
步骤6:最终结果
{
'mode': 'multimodal',
'proba': 0.757,
'threshold': 0.5,
'is_depressed': True,
'phq8_score': 16.5,
'severity': '中重度抑郁',
'severity_color': '#eb5e34'
}
💡 技术要点总结
1. 概率计算基础
-
算法核心:逻辑回归 + Sigmoid函数
-
概率范围:0.0~1.0
-
输出解释:样本属于抑郁类别的概率
2. 多模态融合优势
-
权重优化:基于实验确定的最佳权重组合
-
信息互补:音频和视频特征相互补充
-
鲁棒性:支持单模态回退机制
3. 阈值优化策略
-
优化目标:最大化F2分数(强调召回率)
-
阈值范围:0.05~0.75(经过钳位处理)
-
优先级:手动配置 > 自动校准 > 默认值
4. 严重程度评估
-
双重机制:回归模型 + 概率映射
-
分数范围:0~24分(PHQ-8量表)
-
分级标准:5级严重程度,颜色编码
5. 系统设计特点
-
模块化:清晰的组件划分
-
灵活性:支持不同模态的输入
-
可解释性:提供特征贡献度分析
-
用户友好:直观的可视化结果
📚 相关文件
-
3.训练模型.py:模型训练代码 -
本地测试系统/inference.py:推理引擎实现 -
本地测试系统/gui_main.py:用户界面