rayenne-deradra/parkinson-speech-detection
GitHub: rayenne-deradra/parkinson-speech-detection
基于UCI语音数据集构建的帕金森病声学生物标志物机器学习分类与可解释性分析Pipeline。
Stars: 0 | Forks: 0
# 🎙️ 基于声学生物标志物的帕金森病检测
使用声学语音测量进行帕金森病二元分类的完整机器学习 pipeline —— 从原始数据到临床优化。
## 📋 数据集
**来源:** UCI 机器学习库 — 帕金森病语音测量(Max Little,牛津大学,2008年)
🔗 https://archive.ics.uci.edu/ml/machine-learning-databases/parkinsons/
| 属性 | 数值 |
|----------|-------|
| 录音 | 195 |
| 受试者 | 31(23名患有 PD,8名健康) |
| 特征 | 22 项声学测量指标 |
| 目标 | `status` — 1 = 帕金森病,0 = 健康 |
| 类别分布 | 147 名 PD (75.4%) / 48 名健康 (24.6%) |
| 缺失值 | 0 |
| 重复值 | 0 |
### 特征组
| 组别 | 特征 |
|-------|---------|
| 频率 | MDVP:Fo(Hz), MDVP:Fhi(Hz), MDVP:Flo(Hz) |
| Jitter(频率微扰) | MDVP:Jitter(%), MDVP:Jitter(Abs), MDVP:RAP, MDVP:PPQ, Jitter:DDP |
| Shimmer(振幅微扰) | MDVP:Shimmer, MDVP:Shimmer(dB), Shimmer:APQ3/5, MDVP:APQ, Shimmer:DDA |
| 噪声测量 | NHR, HNR |
| 非线性动力学 | RPDE, DFA, spread1, spread2, D2, PPE |
## 🔬 Pipeline 概览
```
Data Loading & Inspection
→ Cleaning (missing values · duplicates · Z-score + IQR outliers)
→ Descriptive Statistics + Spearman Correlation Heatmap
→ Bivariate Analysis (Shapiro-Wilk → Mann-Whitney U / t-test)
→ Feature Selection (Random Forest + LASSO + RFE + VIF)
→ Classification (6 models · RandomizedSearchCV · 10-fold CV)
→ AIC / BIC comparison
→ SHAP Interpretation
→ Six Sigma Pre/Post Analysis
→ Threshold Optimization
```
## 📊 结果
### 双变量分析
所有 22 个特征均具有统计学意义 (p < 0.05)。由于数据不满足正态性 (Shapiro-Wilk 检验),几乎所有特征均采用了 Mann-Whitney U 检验。主要趋势:
- **Jitter, Shimmer, NHR, RPDE, PPE, spread1** → 在帕金森患者中更高
- **HNR, MDVP:Fo(Hz)** → 在帕金森患者中更低
### 特征选择
结合三种方法(RF 重要性 + LASSO + RFE)最终筛选出 **14 个特征**:
| 方法 | 选定特征 | 备注 |
|--------|------------------|-------|
| 随机森林(前 10 名) | PPE, spread1, Shimmer:APQ5, MDVP:APQ, spread2, MDVP:Shimmer, MDVP:RAP, Jitter:DDP, D2, MDVP:Fo(Hz) | 非线性特征占主导地位 |
| LASSO(L1,C=0.1) | spread1, spread2, D2, MDVP:Fo(Hz), MDVP:Flo(Hz) | 严格正则化 |
| RFE(前 10 名) | MDVP:Fo(Hz), MDVP:Jitter(%), MDVP:Jitter(Abs), MDVP:RAP, Jitter:DDP, MDVP:APQ, NHR, spread1, D2, PPE | 平衡选择 |
**特征选择前的 VIF:** 高达 15,000,000(Shimmer:APQ3, Shimmer:DDA — 近乎完全相关)。选择后显著降低。
### AIC / BIC(逻辑回归)
| 特征集 | 特征数量 | AIC | BIC |
|-------------|-------------|-----|-----|
| **特征选择集** | **14** | **141.33 ✅** | **187.08 ✅** |
| 所有特征 | 22 | 153.58 | 223.72 |
特征选择模型在两项标准上均胜出 —— 更精简且具有更好的泛化能力。
### 分类 — 特征选择集(10 折交叉验证)
| 模型 | AUC | 灵敏度 | 特异度 | F1 | PR-AUC |
|-------|-----|-------------|-------------|----|--------|
| **SVM (RBF)** | **0.948 ± 0.062** | **0.958 ± 0.059** | 0.725 ± 0.233 | **0.938 ± 0.053** | **0.985** |
| 随机森林 | 0.938 ± 0.083 | 0.933 ± 0.077 | 0.708 ± 0.212 | 0.921 ± 0.055 | 0.982 |
| XGBoost | 0.933 ± 0.085 | 0.924 ± 0.083 | **0.808 ± 0.239** | 0.931 ± 0.055 | 0.978 |
| AdaBoost | 0.910 ± 0.110 | 0.948 ± 0.044 | 0.675 ± 0.313 | 0.926 ± 0.049 | 0.973 |
| 逻辑回归 | 0.902 ± 0.111 | 0.823 ± 0.114 | 0.833 ± 0.245 | 0.875 ± 0.080 | 0.970 |
| SVM(线性) | 0.889 ± 0.114 | 0.840 ± 0.143 | 0.833 ± 0.245 | 0.884 ± 0.095 | 0.964 |
### 分类 — 特征选择集(测试集,n=39)
| 模型 | 准确率 | 灵敏度 | 特异度 | F1 | AUC | FN | FP |
|-------|----------|-------------|-------------|-----|-----|----|----|
| **随机森林** | **0.923** | **0.966** | **0.800** | **0.949** | **0.962** | 1 | 2 |
| SVM (RBF) | 0.872 | 0.897 | 0.800 | 0.912 | 0.938 | 3 | 2 |
| AdaBoost | 0.795 | 0.862 | 0.600 | 0.862 | 0.945 | 4 | 4 |
### 分类 — 所有特征(10 折交叉验证)
| 模型 | AUC | 灵敏度 | 特异度 | F1 |
|-------|-----|-------------|-------------|----|
| **XGBoost** | **0.970 ± 0.051** | 0.949 ± 0.059 | **0.842 ± 0.182** | **0.949 ± 0.034** |
| AdaBoost | 0.965 ± 0.054 | **0.958 ± 0.059** | 0.783 ± 0.258 | 0.946 ± 0.038 |
| SVM (RBF) | 0.960 ± 0.051 | 0.992 ± 0.026 | 0.317 ± 0.156 ⚠️ | 0.897 ± 0.025 |
### SHAP 解释(SVM RBF — 特征选择集)
预测帕金森病最具影响力的特征:
- **spread1, PPE** — 最高的正向影响(高数值 → 预测为 PD)
- **RPDE, D2** — 非线性动力学复杂性标志物,在 PD 中升高
- **HNR** — 负向影响(高 HNR = 健康声音 → 抵消 PD 预测)
- **DFA** — 阈值效应,在 PD 中升高
### 六西格玛分析(前/后 — 特征稳定化模拟)
模拟测试特征向健康类均值偏移 20% (α=0.20):
| 模型 | 前 Sigma | 后 Sigma | 提升 | McNemar p 值 |
|-------|-----------|------------|-------------|-----------|
| 随机森林 | 2.926 | 2.635 | -0.291 | 0.500 |
| AdaBoost | 2.323 | 2.635 | **+0.311** | 0.375 |
| SVM (RBF) | 2.635 | 2.520 | -0.115 | 1.000 |
未发现具有统计学意义的差异 (McNemar p > 0.05)。考虑到测试集较小 (n=39),这是符合预期的 —— 需要更大规模的纵向数据集才能从语音稳定化中检测到有意义的信号。
### 阈值优化(灵敏度 ≥ 0.95 约束)
| 模型 | 基准 τ | 最优 τ | 灵敏度 | Sigma | 提升 |
|-------|-----------|-----------|-------------|-------|-------------|
| 随机森林 | 0.50 | 0.50 | 0.966 | 2.926 | 已达到最优 |
| AdaBoost | 0.50 | **0.35** | **0.966** | 2.635 | +0.311 sigma |
| SVM (RBF) | 0.50 | — | 在所有阈值下均 < 0.95 | — | — |
处于默认阈值的随机森林已实现 灵敏度=0.966 —— 在测试集的 29 名患者中仅漏诊 1 名 PD 患者。
## 🛠️ 如何运行
### Google Colab(推荐)
```
# notebook 会自动下载数据集:
import urllib.request
urllib.request.urlretrieve(
'https://archive.ics.uci.edu/ml/machine-learning-databases/parkinsons/parkinsons.data',
'parkinsons.csv'
)
```
然后运行所有单元格。
### 本地运行
```
pip install pandas numpy matplotlib seaborn scikit-learn xgboost shap statsmodels scipy joblib
jupyter notebook parkinson_complete.ipynb
```
## 📦 依赖项
```
pandas · numpy · matplotlib · seaborn
scikit-learn · xgboost · shap
scipy · statsmodels · joblib
```
## 🔑 核心要点
- **PPE 和 spread1** 是所有方法中最具区分度的单一声学生物标志物
- **特征选择至关重要** —— 将 VIF 从 15,000,000 降低到可控水平,并提升模型的可解释性
- **随机森林** 实现了最佳的测试集平衡:灵敏度=0.966,特异度=0.800,仅漏诊 1 名 PD 患者
- **阈值优化** 在 τ=0.35 时使 AdaBoost 的灵敏度达到 0.966 —— 适用于高召回率的筛查场景
- **六西格玛分析** 证实,在 n=39 个测试样本的情况下,无法确立改进的统计学意义 —— 需要包含更大队列的纵向数据
## 🚀 与纵向研究的关联性(EvoluPark)
该项目为帕金森病的声学生物标志物分析确立了稳健的基线。计划向完整的纵向 pipeline 进行扩展:
1. **时间建模** —— 针对重复录音(例如每 6 个月一次)的 LSTM / Transformer 模型
2. **预训练语音模型** —— 使用 Wav2Vec 2.0 / Whisper embedding 作为更丰富的特征提取器
3. **副语言特征** —— 语速、停顿时长、不流利程度
4. **临床相关性** —— 将语音标志物与 UPDRS 和 MoCA 得分联系起来
5. **患者间的泛化能力** —— 针对数据有限的新患者采用元学习 / few-shot 方法
## 👩💻 作者
**Rayenne Maissoune Deradra**
计算机科学(数据科学)硕士,阿尔及利亚 费尔哈特·阿巴斯·塞蒂夫第一大学 (Université Ferhat Abbas Sétif-1)
rayennederadra@gmail.com
## 📄 参考文献
Little, M.A., McSharry, P.E., Roberts, S.J., Costello, D.A.E., Moroz, I.M. (2007).
*Exploiting nonlinear recurrence and fractal scaling properties for voice disorder detection.*
BioMedical Engineering OnLine, 6:23.
标签:Apex, 六西格玛, 医疗健康, 数据科学, 机器学习, 疾病诊断, 资源验证, 逆向工具, 音频处理