抑郁检测概率计算详细分析

返回 毕设项目解析

抑郁检测概率计算详细分析

🎯 文档概述#

本文档详细分析多模态抑郁检测系统中抑郁概率的计算过程,包括模型训练、推理计算、多模态融合、阈值判断和严重程度评估等完整流程。通过具体实例和数学公式,帮助您理解概率计算的每一步。

🧠 训练阶段:模型学习过程#

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 模型学习原理#

逻辑回归模型通过以下步骤学习特征权重:

  1. 线性组合计算:
z=w0+w1×特征1+w2×特征2+⋯+wn×特征n z = w_0 + w_1 \times \text{特征}_1 + w_2 \times \text{特征}_2 + \dots + w_n \times \text{特征}_n
  1. Sigmoid函数转换:
P(y=1∣X)=11+e−z P(y=1|X) = \frac{1}{1 + e^{-z}}
  1. 权重优化:通过最大似然估计优化权重 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)×85+(−0.8)×0.32+0.6×0.25+0.9×2.0 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)=11+e−(−3.756)=11+e3.756≈11+42.7≈0.023 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 概率计算步骤#

  1. 特征准备:从输入数据中提取对应模态的特征向量

  2. 特征标准化:使用训练时保存的 scaler 进行标准化

  3. 模型预测:调用 predict_proba() 方法获取预测概率

  4. 结果提取:[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 阈值确定方法#

  1. 手动配置阈值:优先使用用户手动设置的阈值

  2. 自动校准阈值:基于F2分数优化的阈值(0.05-0.75范围)

  3. 默认阈值:音频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:多模态融合#

proba=0.82×0.55+0.68×0.45=0.451+0.306=0.757 \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:用户界面


评论区

Profile Image of the Author
LuvGaze
Hello, Everyone.
公告
项目开发测试中 ~
天气预报
☁️
获取天气中...
我和宝宝在一起已经 287 天
♥
💕
0年0月0天
音乐
封面

音乐

暂未播放

0:000:00
暂无歌词
站点统计
运行时长
--
最后活动
0 天前
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录