做EEG数据分类这几年,我越来越觉得,与其满世界去找一篇“最新综述”,不如自己把分类体系吃透。所谓分类体系,并不是一堆论文的拼盘,而是从原始脑电到最终标签的整套解决方案:采集、预处理、EEG去噪、分段、特征提取、模型选择和评价指标。每次新任务来,只要把这套体系从头到尾过一遍,基本就知道该从哪里下手。这篇文章就按这条主线来写,重点讲一讲去噪和特征设计,也聊聊不同分类器到底怎么选。适合刚接触脑电分类的学生,也适合已经跑通了基础流程、但常常被结果波动折磨的工程师。先说清楚:本文不打算像传统综述那样一张张罗列论文,而是把常见分类任务和算法拆成可复用的体系,这样比攒一堆结论更经用。
1. 先搞清楚任务类型:EEG分类体系的最底层设计
1.1 一个分类任务背后藏着的完整链路
EEG分类不是什么“拿到信号就用模型跑一个标签”的简单事,它的上游链路非常长。先看常见任务类型:
- 运动想象:想象左手/右手/脚运动时,大脑运动皮层出现不同的感觉运动节律变化;
- 情绪识别:通过脑电判断正性/中性/负性情绪,常用DEAP、SEED等数据集;
- 睡眠分期:把整晚睡眠分为清醒、浅睡、深睡、REM等阶段;
- 癫痫发作检测:区分发作期和间歇期,往往是长时程连续监测;
- 认知负荷/注意力评估:用脑电量化人当前的精神负荷,常用于人因工程和脑机交互。
这些任务看起来完全不沾边,但用户从原始信号拿到标签的过程高度相似:先采集多通道EEG,接着去除伪迹和噪声,再按照实验事件把连续数据切成一个个“epoch”(事件片段),然后从每个epoch里提取特征,最后交给分类器。这个链路就是老生常谈的“预处理—特征—分类”三段式。但真正做项目的人都知道,每一个环节都有大量需要根据自己的数据形态去调整的地方。所谓建立分类体系,本质上就是把这三段式变成一套可回退、可组合、可替换的模块。为什么我强调“可回退”?因为很多工程问题不是模型不行,而是前置环节已经把信号毁了,再牛的Transformer也补不回来。
1.2 从两个维度给EEG分类“定坐标系”
我在实际项目中喜欢用两个维度来快速定位一个分类问题。第一个维度是“信号范式”,第二个维度是“建模方式”。
信号范式可以粗略分成诱发型和自发型。诱发型需要给被试一个明确的刺激,比如P300拼写器、SSVEP稳态视觉诱发电位,这类信号在时间上与被试的注视/反应强相关,特征是相位清晰、时间锁定好,预处理时可以做的严格切段和叠加平均。自发型则更“自由”,比如睡眠分期、情绪识别、静息态分类,信号本身没有强时间锁定,更多依赖频段功率和空间分布。这个区分很重要:诱发型任务对时域准确性要求高,自发型任务则对频段分离度更敏感。
第二个维度是建模方式,也就是常说的“手工特征+传统机器学习”和“端到端深度学习”。前者适合小样本、高噪声、需要可解释性的场景,因为特征维度和模型复杂度都可以控制;后者依赖大量标注数据,由卷积网络或Transformer直接从原始波形中学习特征,虽然能绕过繁琐的特征工程,但对数据质量和数量要求都很高。很多新手一上来就上EEGNet、上Transformer,却连数据分层划分都没做对,结果在公开数据集上刷出高分,换到自己采集的数据就全线崩溃。分类体系里最关键的,其实是知道每一种方法适合解决哪一类问题,而不是把最新模型无脑往上堆。
为了更直观,我用一个表格来对比两种建模方式在多个维度上的表现差异:
| 对比项 | 手工特征 + 传统ML | 端到端深度学习 |
|---|---|---|
| 数据量需求 | 少量样本即可 | 通常需要大量样本 |
| 特征设计成本 | 高,需要领域知识 | 低,网络自动学习 |
| 可解释性 | 较好 | 较差 |
| 对EEG去噪的依赖 | 极高,伪迹会造成特征污染 | 较高,但模型可能自行鲁棒化 |
| 常用场合 | 离线分析、小样本设备 | 大规模数据、在线BCI系统 |
建模方式没有绝对优劣,只有匹配不匹配。我的建议是:如果你的样本量只有几十到几百,特征工程和传统分类器仍然是更稳的选择;如果你有上万段数据,又有GPU资源,深度学习才能真正发挥威力。
2. 分类前的第一道门槛:EEG去噪与预处理
2.1 为什么伪迹会让分类结果失真
EEG信号本身的幅度只有几十微伏,而眨眼时产生的眼电伪迹可以达到几百微伏,肌电更是能在短时间内覆盖全频段。分类器在做决策时,天然喜欢找那些“一眼就能分开”的线索。如果我们的类别标签恰好和眨眼频率、肌肉紧张程度相关,分类器就会学着用伪迹去分类,而不是用真实的神经振荡活动。
举一个实际例子:某个情绪识别实验里,被试看负性图片时更容易皱眉头,此时前额和颞侧通道的肌电明显增加。如果在预处理阶段没有把这些伪迹去除干净,分类器很可能会学到“肌电多=负性情绪”这种虚假规则。数据内部验证时准确率能到95%以上,一旦换成另一批被试,这个规则立刻失效。这不是模型过拟合,而是伪迹造成的系统性偏差。EEG去噪不是锦上添花,是防止分类系统学到错误规律的第一道防线。
2.2 常见伪迹类型与对应的去噪手段
我把自己实盘遇到过的伪迹整理成了一张表,方便对照:
| 伪迹来源 | 典型特征 | 常用去噪手段 | 注意事项 |
|---|---|---|---|
| 眨眼/眼动(EOG) | 前额通道大幅低频偏转,时程90-200ms | 回归法、ICA去除眼电成分 | ICA成分识别需要看拓扑图和频谱,不能只看IC个数 |
| 肌电(EMG) | 高频随机爆发,频率多在20Hz以上 | 低通滤波、ICA剔除高频成分、ASR | 过度滤波会连带去掉gamma频段的神经活动 |
| 工频干扰(50/60Hz) | 固定频率正弦叠加 | 陷波滤波 | 欧洲50Hz,北美60Hz,别搞混 |
| 电极漂移/运动伪迹 | 极低频缓慢基线变化 | 高通滤波(0.5-1Hz)、ASR | 高通截止频率太高会把慢波事件也削掉 |
| 心电(ECG) | 低频周期性峰,常见耳垂/参考导联 | 信号空间投影、ICA | 干扰不严重时不用管,严重时需要参考通道信息 |
这里多说两句ICA和ASR,因为它们是目前最主流的两个去噪工具。ICA(独立成分分析)把多通道信号分解成多个相互独立的成分,眨眼、肌电、工频干扰往往集中在少数几个成分里,把这些成分剔掉,再重构信号就能得到相对干净的EEG。但ICA的效果依赖通道数目和成分数量的设置,也不能盲目剔除太多成分,否则会把脑网络之间的真实连接信息也一起扔掉。ASR(Artifact Subset Reduction)则是一种自适应子空间重构方法,对运动伪迹和大幅噪声很有效,执行速度快,常用于在线BCI系统。我的经验是:静态实验用ICA精细剔除,运动或在线场景用ASR兜底。
2.3 实际用下来的去噪选型心得
去噪方法不是用得越猛越好。我见过很多同学把ICA成分一口气删了一半,觉得删得越干净越高级,结果下游分类准确率反而下降。原因是脑电和伪迹在统计上并不完全独立,ICA分解出的那些成分里多多少少混着真实神经流信号;过度剔除等于把特征信号也扔了。
实际操作中我习惯这样排序:先做高通滤波去掉基线漂移,再做陷波去掉工频干扰,然后跑ICA和人工/自动成分选择。对于成分选择,不要只看ICA的时域波形,一定要结合成分的拓扑图和频谱图一起看。典型的眨眼眼电成分通常位于额叶、频谱集中在低频;肌电成分能量集中在高频且空间分布靠两侧颞肌;工频成分在50/60Hz处出现尖峰。每次去噪后我会顺手做一次“数据质量对比”:
- 计算剩余伪迹功率与总功率的比值;
- 观察去噪前后的功率谱密度有没有明显毛刺;
- 用同一个分类器,在“去噪前”和“去噪后”的数据上分别跑一遍,看看性能变化。
如果去噪后分类性能显著下降,我会先去查是不是把和任务相关的成分删掉了。有个做运动想象的同事曾经把ICA里一个幅值很大的低频成分当成眼电剔了,结果那个成分恰好是运动相关的mu节律,删完之后他的二分类准确率直接从0.82掉到0.66,查了一下午才找到原因。这类问题在EEG去噪里太常见,值得一开始就养成“先看成分物理意义,再决定是否删除”的习惯。
3. 特征提取:从波形到可分性指标
3.1 时域特征:简单但容易被低估
预处理干净之后,很多人直接顺手把原始波形往分类器里塞,但其实手工特征仍然有不可替代的价值。时域特征是最直观的一类,常见的有均值、方差、标准差、过零点率、Hjorth参数中的活动度(Activity)和复杂度(Complexity),以及事件相关电位(ERP)的峰值幅度和潜伏期。
对于P300这类诱发型任务,ERP的P300成分就是一个天然的判别特征:目标刺激出现后300ms左右会有一个正向波峰,非目标刺激不明显。此时只要在Cz、Pz等中心导联提取峰值和平均幅值,再用线性分类器就能得到不错的效果。时域特征计算成本低,物理意义明确,很适合做在线系统。但缺点是它对时间对齐要求高,刺激延迟、被试状态波动都会直接影响特征质量。
3.2 频域特征:脑节律与功率谱密度
频域特征大概是EEG分类中最常用的一类。通过傅里叶变换或Welch法估计功率谱密度(PSD),然后提取特定频段的平均功率、峰值频率、带宽等,就可以把原始信号压缩成一组低维特征。常见的频段分类是:delta(1-4Hz)、theta(4-8Hz)、alpha(8-13Hz)、beta(13-30Hz)、gamma(30-45Hz)等。
不同任务的敏感频段完全不同。运动想象中,想象右手运动时左侧运动皮层的mu/beta节律会出现事件相关去同步(ERD),因此C3、C4等通道上的alpha/beta功率差异是核心特征。情绪识别里,前额alpha不对称性经常被用作正负情绪的分辨特征,比如F3和F4通道alpha功率的差值。睡眠分期的分类则几乎离不开delta和theta慢波成分的比例变化。
频域特征有一点注意:如果每一段epoch只有几十毫秒,PSD估计会很不稳定,这时可以考虑使用小波包变换或短时傅里叶变换来保留时频联合信息。另外,功率谱密度容易受伪迹残留影响,特别是工频干扰,所以频域特征提取一定要放在EEG去噪之后。
3.3 空间特征:通道组合与共空间模式
单通道特征只代表了局部脑区的活动,很多分类任务里的关键区别其实是不同脑区之间的协同关系。空间特征就是为了捕捉这种协同关系。最经典的是共空间模式(Common Spatial Patterns,CSP),它通过寻找一组空间滤波器,使得两类任务下滤波后信号的方差差异最大化,在运动想象二分类中几乎是标配。
我自己用CSP的体会是,它对通道位置和样本数量敏感:通道数太少,空间滤波的效果不明显;样本太少,协方差矩阵估计不稳,CSP很容易过拟合。标准做法是先对原始信号做带通滤波,通常选8-30Hz,然后用CSP估算4-8个空间滤波器,再提取滤波后信号的log-variance作为特征。
除了CSP,功能连接指标如相位锁定值(PLV)、相干性(coherence)也在情绪和认知任务中越来越常见。这些指标计算量大,要谨慎使用,否则光特征提取就跑到天荒地老。
3.4 特征降维:不是越少越好,是要避免数据泄露
特征提取完成后,你手里的特征维度可能高达几百甚至几千,直接喂给分类器不仅慢,而且容易过拟合。此时选择降维算法是必要的,但切记降维必须放在训练集内部来做。
最常见的错误是:先对全部数据做PCA,然后再划分训练集和测试集。这个流程会带来“数据泄露”:测试集的信息通过PCA降维矩阵被传染到了训练过程里,导致验证结果虚高。正确流程应该是:先在训练集上拟合PCA或LDA,保存投影矩阵,再把这个矩阵用到测试集上。mRMR(最大相关最小冗余)这类特征选择算法也一样,只能在训练集上进行特征筛选,并保存选中的特征列名,再对测试集做同样的筛选过程。
降维也不是必须用PCA。在小样本条件下,LDA本身就能承担降维和分类的双重任务,SVM则可以靠正则化避免高维问题。所以我的建议是:特征太多时才考虑降维,特征量在几百以内可以先用简单的特征选择过滤掉低方差特征,再根据分类性能调整。
4. 分类模型:传统机器学习、深度学习与混合体系
4.1 传统分类器:小样本时代的可靠选择
特征提取完成后,就到了真正做分类的环节。传统机器学习在EEG分类里仍然占据重要位置,尤其是样本量不够大、算力有限、需要实时响应的场景。常用的分类器包括线性判别分析(LDA)、支持向量机(SVM)、随机森林(RF)和k近邻(kNN)。
LDA是BCI领域元老级分类器,亮点是计算简单、对平稳特征很有效,尤其适合CSP提取后的运动想象特征。SVM在高维特征上表现稳定,配合RBF核可以在非线性分类任务中取得不错效果,但要注意调节C和gamma,通常需要做交叉验证网格搜索。随机森林不需要太精细的特征缩放,也能给出特征重要性排序,但树模型在脑电这种高噪声信号上有时不如线性模型稳定。
我在跑小样本情绪分类时,用SVM配合前额alpha不对称特征,在单个被试的几十个样本上就能获得0.70以上的准确率。换成深度学习模型,同样数据量基本就是死路一条。传统模型的另一个优势是可解释性:特征权重能告诉我们哪个通道、哪个频段在类别决策中起作用,这在做学术论文和临床分析时非常宝贵。
4.2 深度学习模型:端到端的代价与收益
深度学习真正改变EEG分类,是从自动特征学习开始的。2017年前后提出的EEGNet,用深度可分离卷积把时间和空间信息分别建模,在运动想象和ERP分类上做到了与传统方法相当的成绩,但模型参数少、速度快,非常适合在线BCI。DeepConvNet则用更深层的卷积结构捕捉更复杂的时空模式,通常在数据量大的时候比EEGNet更稳。
循环神经网络(LSTM、GRU)适合处理睡眠分期这类时间序列标签连绵的任务,因为睡眠阶段在时间上存在状态转移,利用前后文的上下文信息能显著提升分期准确率。Transformer在EEG领域的应用这几年也越来越多,比如用自注意力机制捕捉长时间依赖,但Transformer容易因为数据量不足而过拟合,我一般会先做预训练或加比较强的正则化。
深度学习的代价也很明显:对数据量要求高,训练过程黑箱化,而且对EEG去噪的“脏数据”容忍度并不像想象中那么高。如果输入里混着大片肌电,网络会在前几层学到的特征全是肌电纹理,后续无论怎么调结构都救不回来。因此即使走端到端路线,也不等于可以跳过EEG去噪。端到端模型的优势是省去特征工程,不是省去数据清洗。
4.3 模型选型对照与我的建议
| 模型 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|
| LDA | 简单快速,线性可分好 | 对特征要求高 | CSP特征的运动想象二分类 |
| SVM | 高维能力强,可调正则 | 大数据量训练慢 | 中小样本的离线分类 |
| 随机森林 | 抗噪声,特征重要性 | 可能过拟合高维数据 | 频域/时域混合特征 |
| EEGNet | 轻量、端到端 | 需要数据增强 | 在线BCI、小规模CNN |
| DeepConvNet | 拟合能力强 | 参数多,易过拟合 | 大样本离线研究 |
| LSTM/Transformer | 时序上下文建模 | 需要大量数据 | 睡眠分期、连续监测 |
我的选型经验是“从简到繁”:先用手工特征+线性模型跑通全流程,得到一个baseline;如果准确率不符合预期,再去加大特征复杂度或换深度学习模型。直接上深度模型并不是不行,而是容易把“数据问题”和“模型问题”混在一起,排查时非常痛苦。
5. 一套可以落地的EEG分类实操流水线
5.1 数据划分到底该怎么做
很多EEG分类项目翻车,不是模型不好,而是数据划分错了。EEG数据有明显的个体差异性,同一个被试的脑电模式高度自相似。如果随机打乱所有样本,让同一被试的片段同时出现在训练集和测试集里,模型会记住被试特征,测试准确率虚高,这叫“被试泄漏”。正确的做法是尽量按被试划分:比如有20个被试,训练集用16个被试的全部片段,测试集用剩余4个被试的全部片段。
对于时间序列类任务(睡眠分期、癫痫监测),还要额外注意不能把同一连续记录的片段随机打乱进训练和测试,否则会导致时间上相邻的信息泄漏。更稳妥的方案是按“记录/会话”划分,或者采用leave-one-session-out交叉验证。运动想象这类试次独立的任务,按被试划分已经可以满足大多数实验需求。
交叉验证的选择上,小样本用K折交叉验证(K=5或10),跨个体性能评估用leave-one-subject-out(LOSO)。LOSO比较严格,也非常耗时,但它最接近真实使用场景。如果LOSO性能比随机划分掉了10个百分点以上,先别急着调模型,多半是跨被试泛化问题,需要引入个体校准或域适应技术。
5.2 简化版流水线示例:运动想象二分类
下面我用一个运动想象二分类任务演示整套流水线。假设数据是64导联,采样率250Hz,采集时被试做左手/右手想象,每个试次持续4秒。为了简洁,我写的代码只是核心流程的伪代码,真实项目里需要根据文件格式和通道位置做适配。
import mne import numpy as np # 1. 读取原始EDF文件 raw = mne.io.read_raw_edf("subject01.edf", preload=True) # 2. 重参考为平均参考 raw.set_eeg_reference("average") # 3. 带通滤波:保留0.5-40Hz,滤掉漂移和部分高频噪声 raw.filter(0.5, 40., fir_design="firwin") # 4. 50Hz工频陷波(中国的电网是50Hz) raw.notch_filter(50.) # 5. ICA去眼电和肌电 ica = mne.preprocessing.ICA(n_components=20, method="fastica", random_state=42) ica.fit(raw) # 实际项目中需要根据拓扑图和频谱识别伪迹成分,这里用exclude列表示意 raw = ica.apply(raw, exclude=[0, 3]) # 6. 根据事件标记切分epoch,取事件发生后0.5-3.5秒,共3秒 events = mne.find_events(raw, stim_channel="STI 014") epochs = mne.Epochs(raw, events, tmin=0.5, tmax=3.5, baseline=(0.5, 0.5), event_id={"left": 1, "right": 2}, preload=True) # 7. 提取CSP特征 from mne.decoding import CSP csp = CSP(n_components=8, reg="ledoit_wolf", log=True) X = csp.fit_transform(epochs.get_data(), epochs.events[:, 2]) # 8. 训练LDA分类器 from sklearn.discriminant_analysis import LinearDiscriminantAnalysis lda = LinearDiscriminantAnalysis() # 这里用按被试划分的训练集,实际代码会把X和标签拆成train/test # clf.fit(X_train, y_train) # accuracy = clf.score(X_test, y_test)这个流程里几个参数值得解释:
- 0.5-40Hz带通滤波:覆盖了运动想象相关的mu和beta节律,同时把工频以上的高频噪声尽量压制。
- ICA成分数设为20:64导联数据用20个成分属于比较常见的经验值,成分数太少分离效果差,太多则计算慢且容易过拟合。
- 取事件后0.5-3.5秒:这是为了避免刺激刚开始引起的视觉诱发响应干扰分类,让模型更聚焦于运动想象持续期的活动。
- CSP用8个空间滤波器:太少可能损失信息,太多又会在小样本下不稳定。
- LDA配合log-variance特征:经典组合,计算极快。
5.3 评价指标:准确率只是最表面的数
很多教程只教你算accuracy,但EEG分类的类别往往不平衡。比如睡眠分期里深睡样本远少于清醒样本,癫痫检测里正常段远多于发作段。此时只看总体准确率,一个什么都是“正常”的模型也能达到90%以上的accuracy,毫无意义。
更稳的指标组合是:
- 平衡准确率(balanced accuracy):对每个类别分别计算召回率后取平均,能有效反映类别不平衡下的真实性能;
- F1-score:兼顾精确率和召回率,二分类和多分类都可以用macro平均;
- AUC:用于阈值可变的二分类问题,尤其适合连续决策场景;
- 混淆矩阵:能直观看到哪两类容易互相混淆,比如睡眠分期中N1和N2阶段就很难区分。
评估时的另一个要点是“多重比较陷阱”:同一个模型在多个被试或多个fold上跑了多次,如果只挑效果最好的fold汇报,这也是自欺欺人。我习惯的做法是,每个fold都保留模型和结果,最终汇报平均值±标准差,同时给出最差的fold来检验模型稳定性。
5.4 实时分类与跨被试迁移的坑
如果做的是BCI应用,分类不仅是离线评估,还要考虑实时性。实时分类通常用滑动窗口,比如每250ms处理一个窗口,用当前窗口的特征预测当前时刻的类别,然后滑向下一个窗口。窗口长度和叠放步长直接影响延迟和稳定性:窗口太短,特征估计不稳定;窗口太长,决策延迟明显,用户会觉得系统“不跟手”。
在线EEG去噪也要格外小心,ICA不能简单照搬离线流程,因为在线数据没有完整record去拟合全局ICA。常用的替代方案是用一段干净静息态数据预先拟合ICA/ASR参数,然后在线应用;或者直接用基于通道空间分布的自动伪迹去除模块,比如ASR的在线版本。
跨被试迁移是另一个大坑。每个人的脑电特征分布都不一样,一个被试训练的模型直接用到另一个被试,性能常常跌到随机水平。解决思路包括:
- 少量校准:对每个新被试采集2-3分钟静息态或少量任务数据,重新归一化特征或微调模型;
- 域自适应:用对抗训练把源域和被试域的特征分布拉近,比如DANN;
- 特征级归一化:对每个被试单独做z-score,可以消除幅值差异带来的部分影响。
6. 常见问题与排查技巧实录
6.1 过拟合、数据不平衡与“刷分幻觉”
症状:在训练集上准确率接近100%,在测试集上却远低于预期。原因通常有几个:模型太复杂、特征维度太高、训练样本太少,或者数据划分泄露。
解决办法按优先级排序:
- 先检查数据划分是否按被试/会话独立,如果有泄漏,先修数据划分;
- 引入正则化,比如SVM调大C、深度学习加dropout和权重衰减;
- 减少特征维度,做特征选择;
- 使用交叉验证而不是单次划分,避免凭运气出结果。
数据不平衡也会造成一种特殊的“过拟合幻觉”:模型在多数类上表现极好,少数类几乎全错,总体准确率仍然很高。解决不平衡可以用类权重、重采样(对少数类过采样)、或者换用平衡准确率作为主要指标。
6.2 伪迹残留导致的分类虚高怎么自查
分类性能好到“不真实”的时候,我先怀疑的不是模型,而是伪迹。有个很实用的自查方法:把分类器输入里的EOG通道或额叶通道去掉,看性能是否大幅下降。如果去掉这些通道后准确率掉了一大截,说明模型很可能正在靠眨眼模式分类。
另一个办法是在无任务静息态数据上做“假分类测试”。把完全没有目标标签的静息态数据强行分成两类(比如前半段和后半段),如果分类器还能达到不错效果,说明数据里一定存在与任务无关的系统性差异,最常见的就是伪迹漂移或设备噪声漂移。
我做实验时还会保留一份“去除所有通道平均信号”的版本。因为很多伪迹,尤其是参考电极引入的噪声,是全局共模的。如果全通道平均特征对分类贡献极大,就需要考虑是不是参考电极或系统噪声在“带飞结果”。
6.3 跨被试泛化差?先做校准和域适配
跨被试泛化差是EEG分类最普遍的痛点之一。症状是同一个模型在A被试上准确率0.85,换到B被试只有0.55。解决思路不是盲目堆更复杂的模型,而是先做个体校准。
最简单的校正在特征层面:对每个被试计算训练集特征的均值和标准差,然后对特征做z-score标准化。这个操作成本极低,但往往能带来5-10个百分点的提升。再进一步,可以采集少量新被试的带标签数据,把源模型在少量数据上微调几轮,效果通常也不错。
如果标注成本太高,可以尝试无监督域自适应,比如用最大均值差异(MMD)或对抗训练来对齐源域和目标域的特征分布。这类方法实现难度大一些,但当你的场景确实拿不到新被试标签时,这是比较现实的选择。
6.4 排查速查表
| 现象 | 可能原因 | 解决建议 |
|---|---|---|
| 训练好但测试差 | 数据划分泄露/过拟合 | 按被试划分,加正则化 |
| 准确率虚高且集中在某几个通道 | 伪迹残留 | 强化ICA/ASR,去掉EOG通道复测 |
| 跨被试性能骤降 | 个体差异大 | z-score特征校准,少量样本微调 |
| 睡眠分期N1和N2混淆严重 | 特征太局部 | 加入时间上下文信息,比如相邻epoch特征 |
| 在线分类延迟大 | 窗口太长/特征计算慢 | 缩短窗口,简化特征,提前预计算PCA |
| 不同fold方差过大 | 样本太少或fold划分不当 | 尝试LOSO,或使用分层K折 |
这些坑我踩过不止一次,现在每次做EEG分类项目,我第一天只做数据质量分析和伪迹治理,绝不碰模型。先把EEG去噪做到位,再把划分和评价指标定下来,最后才讨论选什么分类器。这个顺序救了我很多次,也建议你从下一个项目开始试试。