1. 这次为什么选 GU EEG 这条线

这次我没有继续沿用图像数据集,而是换到了一条更小、更贴论文任务本身的数据线:

  • 数据集:EEG Emotion Recognition Dataset_GU
  • 论文时间:2025
  • 任务:三分类情绪识别
  • 情绪类别:happinesssadnessfear

这条线适合做复现,有几个很现实的原因:

  • 论文和数据集之间是直接对应关系
  • 原始数据已经在本地,不需要重新找数据源
  • 任务规模不大,适合快速固定协议
  • 即使最终没复现到论文数值,也能形成一篇高质量复现实录

2. 论文原文到底要求怎么做

这篇论文真正做的不是“原始 EEG 直接上深度学习”,而是下面这套流程:

  1. 数据采集与情绪诱发
  2. 0.5–45 Hz 带通
  3. Savitzky-Golay 去趋势
  4. ICA 去眼动伪迹
  5. VMD 分解成 5IMF
  6. 使用 3s sliding window,而且是 50% overlap
  7. 计算频带功率特征
  8. KNN / SVM / DT / RF 做分类

其中几个非常关键的论文参数,原文是明确写出来的:

  • 5-IMF decomposition
  • 3s 窗口
  • 50% overlap
  • 80/20 train-test split
  • 训练集上再做 6-fold cross-validation

更重要的是,论文 SHAP 段落明确写到最终模型解释的是 25 个特征。这个信号很关键,因为它几乎等价于:

  • 5 个 IMF
  • 5 个频带
  • 5 × 5 = 25 维输入

也就是说,如果复现时还是把通道维直接展开,那和论文最优模型的输入口径大概率就不一致了。

3. 我先把本地数据协议固定了

在本地这套工程里,我先做的是把“实验口径”固定下来,而不是一上来盲目追分。

当前本地数据事实是:

  • 原始记录数:10
  • 通道数:32
  • 采样率:128 Hz

我先按论文描述的刺激时间切 trial:

  • 10-25s:happiness phase 1
  • 30-45s:sadness phase 1
  • 50-65s:fear phase 1
  • 75-90s:happiness phase 2
  • 95-110s:sadness phase 2
  • 115-130s:fear phase 2

这样得到:

  • 60 个 trial-level 样本
  • 30 个训练 trial
  • 30 个测试 trial

这一步的意义不是“先刷高分”,而是先保证后续每一轮实验都能在同一套协议上比较。

图 1 项目逻辑图

在这里插入图片描述

4. 第一阶段:先把基础 baseline 跑通

我最开始先不碰论文主线里的 VMD,而是先做一个比较稳的频域 baseline:

  • Bandpower + SVM
    • accuracy:0.5000
    • macro-F1:0.4682
  • Bandpower + RF
    • accuracy:0.4333
    • macro-F1:0.4202
  • CNN1D
    • accuracy:0.3929
    • macro-F1:0.3379

这组结果不算高,但它说明了一件更重要的事:

数据读取、标签映射、特征抽取、训练和评估链路已经真正闭合了。

图 2 baseline

在这里插入图片描述

5. 第二阶段:把论文主线里的 VMD 补进来

跑通 baseline 之后,我开始往论文口径靠:

  • VMD-IMF5
  • 3s 窗口
  • 后来补上 bandpass + Savitzky-Golay + z-score

先看一版更贴论文的主线结果:

  • VMD-IMF5 + RF
    • accuracy:0.3400
    • macro-F1:0.3211
  • VMD-IMF5 + SVM
    • accuracy:0.3667
    • macro-F1:0.3511

补完更像论文的前处理之后:

  • Preprocess + VMD-IMF5 + RF
    • accuracy:0.3533
    • macro-F1:0.3512
  • Preprocess + VMD-IMF5 + SVM
    • accuracy:0.4133
    • macro-F1:0.4084

这里有一个很明确的结论:

低准确率不是随便换个分类器就能救起来的,前处理链本身就很重要。

6. 第三阶段:我把论文里最关键的 25 维特征也重做了

论文原文里有一个很容易被忽视、但非常关键的信号:

SHAP 分析对象是 25 个特征。

这让我意识到,论文最优结果的输入很可能不是高维通道展开,而是:

  • 5 IMF × 5 band = 25 维特征

所以我又单独实现了一版更像论文的 25 维特征输入:

  • 3s 窗口
  • 50% overlap
  • 5 IMF
  • 5 band
  • 跨通道做聚合

然后把论文里明确提到的四个分类器全部跑了一遍:

  • KNN:accuracy 0.4148
  • SVM:accuracy 0.4148
  • RF:accuracy 0.3593
  • DT:accuracy 0.3407

这一步特别重要,因为它说明:

即使把输入特征口径也往论文靠,结果依然没有复现出论文里的 RF 优势。

7. 第四阶段:把论文的评估协议也补进来了

论文正文里明写的是:

  • 80/20 train-test split
  • 训练集上做 6-fold CV

所以我后来把训练脚本扩成了论文式评估模式,然后用这套协议重跑了同一版 25 维特征。

这一轮结果依然是:

  • KNN 最好,test accuracy 0.4352
  • RF 只有 0.3611

也就是说:

把评估协议对齐之后,结果依然没有往论文的 99% 靠拢。

图 3 当前结果总览

在这里插入图片描述

8. 论文和本地结果差得有多大

我把论文报告值和本地最好结果画成了一张很直接的图。

论文公开报告值:

  • RF validation accuracy = 0.9957
  • RF testing accuracy = 0.9936

而我这边目前比较稳的本地结果,大致在:

  • 0.41 ~ 0.50

这说明这次复现不是“少调一点参数就能对齐”的量级差异,而是:

公开论文里一定还有一些没有在正文里写清楚的关键实现细节。

图 4 论文结果与本地复现差距图

在这里插入图片描述

9. 我还验证了哪些可疑点

为了尽量把“是不是我自己实现错了”这件事排干净,我又补做了几轮验证:

  • 更密的 overlap
  • CNN1D
  • CNN-BiLSTM-Attention
  • STFT + CNN2D
  • ICA 两种版本
  • 不同 VMD 参数
  • 25 维特征的不同跨通道聚合方式

这些验证最后给出的共同结论是:

  • 不是轮数问题
  • 不只是窗口 overlap 问题
  • 不只是评估协议问题
  • 不只是“通道均值聚合”问题

真正没对齐的,最可能还是:

  • 作者内部未公开的特征构造细节
  • RF / KNN / SVM / DT 的具体超参数
  • 人工 ICA 成分剔除规则
  • 数据清洗与样本筛选的隐含规则

图 5 论文 Table 1 热力图

在这里插入图片描述

10. 那这次复现算不算成立

我现在对这条线的判断很明确:

成立,但不是“论文数值复现成功”,而是“高保真复现尝试成立”。

也就是说,这次最有价值的不是某一个分数,而是把下面这些事情真的做出来了:

  • 论文任务定义被翻译成了本地工程
  • 论文主线方法被逐段实现和核验
  • 多种潜在差异被逐个排查
  • 最终把“为什么没能对齐结果”这件事讲清楚了

这比只写一句“我没复现出来”有价值多了。

11. 这条线对后续写作有什么价值

如果你把这条线当成一篇 CSDN 文章,它的亮点不在于“我也做到了 99%”,而在于:

  • 你不是停留在摘要复述
  • 你真的把论文拆开重做了
  • 你做了多轮排查
  • 最后给出了一个有根据的复现结论

这种文章比单纯贴代码和结果更有说服力,因为它更像真实科研工程,而不是结果导向展示。

12. 当前结论

一句话总结这次 GU EEG + 2025 复现:

这不是一篇“我成功复现到了 99%”的文章,而是一篇“我把一篇近两年 EEG 论文拆开做完,最后确认公开细节不足导致结果无法对齐”的高保真复现实录。

这次复现最让我感受到的一点是,真正难的从来不是“把代码跑起来”,而是把论文里那些默认被略过的实现细节一点点补齐。GU EEG 这条线最后没有把 99% 复现出来,但它让我更清楚地看到了高分论文和可复现工程之间到底隔着什么。对我来说,这样的复现实验不是失败,反而更接近真实。
需要资料私信我哟

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐