Last updated: 2026-06-04
本项目研究 PU(Paderborn University)轴承数据集上的二值故障检测,并将诊断过程建模为序贯决策问题。模型不仅要判断 normal / fault,还可以选择 continue observing,在更多观察证据和更早诊断之间做权衡。
README 用于说明项目结构、运行方式和当前论文实验口径。具体实验开关和路径以 training/project_config.py 为准;实验结论必须来自正式运行结果,不应直接从 README 推断。
当前任务为二值故障检测:
normal = 0fault = 1
DQN 动作空间为:
0:predict normal1:predict fault2:continue observing
与固定帧数静态分类器不同,DQN-TA 关注的是“何时判断”和“是否继续观察”。因此项目评估不只看分类指标,还关注:
decision_ratetimeout_rateavg_observe_stepsavg_used_frames- 不同使用帧数下的决策分布
- 噪声鲁棒性
- 跨工况泛化鲁棒性
当前论文叙事以 实验方案.md 为准,核心逻辑为:
DQN-TA-clean 证明序贯决策有效
-> 噪声测试暴露 clean 训练鲁棒性不足
-> 引入训练期噪声增强并选择 DQN-TA-Aug0.5
-> 与同样 0-0.5 噪声训练的 2frames RF / SVM / CNN 公平对比
-> 验证跨工况泛化鲁棒性
-> 用消融实验验证 TA 机制有效性
当前主 baseline 口径为:
ML_ACTIVE_N_FRAMES = 2也就是说,论文重点比较 2frames RF、2frames SVM、2frames CNN 与 DQN-TA。这样做是为了让静态 baseline 的固定观察帧数更接近 DQN 的平均观察成本。
同时,数据构建仍保留:
ML_STATIC_N_FRAMES_OPTIONS = [1, 2, 3, 4, 5]这些多帧数 baseline 版本主要用于补充展示固定帧数模型的性能趋势,而不是全文主对比口径。
最终论文与答辩 PPT 的实验结论统一为:三动作 DQN-TA 可以在保持接近强静态基线分类性能的同时,输出静态模型不具备的观察成本、超时率和决策步数分布,并在加入 0-0.5 训练期噪声增强后取得更均衡的噪声与跨工况鲁棒性。
clean 主工况下,DQN-TA-clean 与 2 帧静态 baseline 的核心结果如下:
| 模型 | Accuracy | F1 | Recall | FPR |
|---|---|---|---|---|
| DQN-TA-clean | 0.9122±0.0048 | 0.9341±0.0041 | 0.9265±0.0095 | 0.1135±0.0043 |
| RF-2F-clean | 0.9014±0.0010 | 0.9259±0.0008 | 0.9267±0.0008 | 0.1486±0.0015 |
| SVM-2F-clean | 0.8993±0 | 0.9237±0 | 0.9163±0 | 0.1344±0 |
| CNN-2F-clean | 0.9127±0.0024 | 0.9340±0.0018 | 0.9289±0.0034 | 0.1194±0.0072 |
DQN-TA-clean 的超时率为 0.0018±0.0006,平均使用帧数为 1.6324±0.2185;相比固定 2 帧 baseline,平均观察帧数减少约 18.38%。
噪声增强实验最终选择 DQN-TA-Aug0.5。在同等 0-0.5 噪声增强训练下,各方法 F1 对比如下:
| Noise | DQN-TA-Aug0.5 | RF-2F-Aug0.5 | SVM-2F-Aug0.5 | CNN-2F-Aug0.5 |
|---|---|---|---|---|
| 0 | 0.9277 | 0.9159 | 0.9085 | 0.9160 |
| 0.1 | 0.9262 | 0.9110 | 0.9083 | 0.9124 |
| 0.3 | 0.9146 | 0.8989 | 0.9014 | 0.8955 |
| 0.5 | 0.9012 | 0.8928 | 0.8918 | 0.8802 |
| 0.8 | 0.8816 | 0.8785 | 0.8736 | 0.8580 |
| 1.0 | 0.8694 | 0.8663 | 0.8625 | 0.8445 |
跨工况泛化中,DQN-TA-Aug0.5 在 N15_M01_F10 的 F1 为 0.9175 / 0.8956 / 0.8649(Noise=0 / 0.5 / 1.0),在 N15_M07_F04 的 F1 为 0.8931 / 0.8768 / 0.8454。时间感知奖励消融表明,TA 的主要贡献不是单纯抬高 F1 上限,而是在相近分类性能下减少平均使用帧数,改善诊断时机。
PU 原始 .mat 信号
-> 数据加载与清洗
-> 滑动窗口分帧
-> 人工特征提取
-> 状态构建
-> 静态多帧 states(RF / SVM / CNN)
-> 序贯 episodes(DQN-TA)
-> 模型训练
-> DQN-TA
-> Random Forest / SVM / CNN
-> 评估
-> clean / noisy final test
-> cross-condition generalization
-> TA ablation
主要步骤:
- 从
../Dataset/PU Dataset/读取 PU 原始振动信号。 - 在
preprocessing/中完成信号清洗、分帧与 15 维人工特征提取。 - 构建两类输入:
- 静态多帧 states:供 RF、SVM、CNN 使用;
- 序贯 episodes:供
environment/FaultDiagnosisEnv和 DQN 使用。
- 在
training/中训练 DQN 与监督学习基线。 - 在
evaluation/中完成最终测试、噪声评估和跨工况泛化评估。
fault_detection_rl_dqn_code/
├─ agents/ # DQN、特征编码器、RF / SVM / CNN 定义
├─ environment/ # Gymnasium 环境、三动作交互、奖励与 timeout
├─ evaluation/ # final test、噪声测试、泛化评估
├─ preprocessing/ # PU 数据加载、特征提取、dataset.pkl 构建
├─ training/ # 配置、训练入口、数据加载兼容层
├─ outputs/ # 模型、日志、评估记录
├─ tests/evaluation/ # 轻量 pytest 测试
├─ main.py # 总入口
├─ 实验方案.md # 论文实验叙事方案
├─ README.md
├─ AGENTS.md
└─ CLAUDE.md
推荐使用 Conda 环境 rl_sb3:
conda activate rl_sb3
pip install -r requirements.txt
python -c "import numpy, scipy, sklearn, gymnasium, stable_baselines3, torch; print('environment ready')"核心依赖固定在 requirements.txt,包括 numpy、scipy、scikit-learn、gymnasium、stable-baselines3、torch、tqdm、rich、tensorboard 和 pytest。
项目默认数据位于仓库上一级目录:
Design_for_Graduation/
├─ Dataset/
│ ├─ PU Dataset/
│ └─ processed/
└─ fault_detection_rl_dqn_code/
关键路径:
- 原始 PU 数据:
../Dataset/PU Dataset/ - 处理后主数据集:
../Dataset/processed/dataset.pkl - 泛化缓存:
../Dataset/processed/generalization_cache/ - DQN 输出:
outputs/dqn/ - baseline 输出:
outputs/ml/nf{ML_ACTIVE_N_FRAMES}/ - TensorBoard 日志:
outputs/logs/tb/
python main.pymain.py 不接收 CLI 参数,执行哪些阶段由 training/project_config.py 中的布尔开关控制。运行前重点检查:
RUN_BUILD_DATASETRUN_TRAIN_DQNRUN_TRAIN_BASELINESRUN_DQN_FINAL_TESTRUN_BASELINE_FINAL_TESTENABLE_DQN_GENERALIZATIONENABLE_ML_GENERALIZATIONFORCE_RETRAIN_DQNGENERALIZATION_CACHE_FORCE_REBUILD
python preprocessing/build_dataset.py
python training/train_dqn.py
python training/train_supervised_baselines.py
python evaluation/run_final_test_dqn.py
python evaluation/run_final_test_baselines.py
python evaluation/run_generalization_dqn.py
python evaluation/run_generalization_baselines.py当前存在少量 pytest 可发现测试,主要覆盖评估输出格式和指标标签:
python -m pytest tests/evaluation更接近 smoke check 的脚本入口:
python preprocessing/load_data.py
python preprocessing/feature_extract.py
python preprocessing/build_dataset.pypreprocessing/build_dataset.py 当前一次构建“baseline 多版本 + DQN 单版本”数据:
baseline_by_n_frames[1]到baseline_by_n_frames[5]- 每个 baseline 版本包含
X_train、y_train、X_val、y_val、X_test、y_test、scaler - DQN 使用
X_train_seq、y_train_seq、X_val_seq、y_val_seq、X_test_seq、y_test_seq、dqn_scaler meta.dataset_schema_version用于校验缓存是否与当前代码布局一致
training/dataset_loader.py 会根据 ML_ACTIVE_N_FRAMES 自动选择当前 baseline 版本,并暴露为兼容旧接口的 X_train / X_val / X_test / baseline_scaler。
如果修改特征、窗口、帧数、stride、schema、训练工况或 repeat 划分,需要重新运行:
python preprocessing/build_dataset.py训练期噪声增强由以下配置控制:
TRAIN_ENABLE_NOISE_AUG
TRAIN_NOISE_STD_MIN = 0.0
TRAIN_NOISE_STD_MAX = 0.5最终测试噪声水平为:
NOISE_LEVELS = [0.1, 0.3, 0.5, 0.8, 1.0]当前论文最终模型选择为 DQN-TA-Aug0.5,即使用 0-0.5 训练期噪声增强的 DQN-TA。后续与 baseline 对比时,RF、SVM、CNN 也应使用相同 0-0.5 噪声增强训练,保证公平。
泛化工况来自:
PU_GENERALIZATION_CONDITIONS = ["N15_M01_F10", "N15_M07_F04"]泛化评估不在目标工况上重新训练模型,也不重新拟合 scaler。
本项目中的 TA 指 time-aware reward,核心开关是:
ENABLE_TIME_AWARE_REWARD = TrueTA 不是额外模型结构,而是奖励函数中的时间感知项。它通过早期正确奖励、早期错误惩罚和随观察进度增长的继续观察代价,引导 DQN 学会:
- 证据充分时尽早决策;
- 证据不足时继续观察;
- 拖到上限仍不判断需要付出 timeout 代价。
TA 消融建议对比:
DQN-clean vs DQN-TA-clean
DQN-Aug0.5 vs DQN-TA-Aug0.5
论文主实验建议按以下顺序整理:
- 构建数据集。
- 训练并评估
DQN-TA-clean,完成 clean 主工况对比。 - 对
DQN-TA-clean做噪声测试,说明 clean 训练鲁棒性不足。 - 比较
DQN-TA-Aug0.2到DQN-TA-Aug0.6,选择DQN-TA-Aug0.5。 - 在相同
0-0.5噪声增强条件下训练2frames RF / SVM / CNN。 - 比较
DQN-TA-Aug0.5与同噪声训练 baseline。 - 运行
N15_M01_F10、N15_M07_F04跨工况泛化实验。 - 运行 TA 机制消融。
- 不要根据测试集挑选最佳 seed。
- DQN 使用验证集做选模和早停,测试集只用于最终报告。
- clean 对比中所有模型应使用 clean 训练。
- 噪声鲁棒性公平对比中所有模型应使用相同
0-0.5训练噪声增强。 - DQN 的
strict_*指标会把 timeout 视为未成功诊断。 - baseline 没有
continue observing或 timeout 机制,不能直接报告 DQN 的序贯指标。 - 不要宣称 DQN 在所有指标、所有噪声、所有工况下绝对优于传统模型;应围绕自适应观察、鲁棒性和 TA 机制贡献做克制结论。