分類:從PSG信號(hào)處理到CNN-LSTM混合模型實(shí)戰(zhàn))
1. 項(xiàng)目概述從腦電波到睡眠報(bào)告如果你接觸過(guò)睡眠醫(yī)學(xué)或者神經(jīng)科學(xué)大概率聽(tīng)說(shuō)過(guò)“多導(dǎo)睡眠圖”這個(gè)名字它聽(tīng)起來(lái)專業(yè)又復(fù)雜常被簡(jiǎn)稱為PSG。但說(shuō)白了它就是一次睡眠的“全身大體檢”。想象一下你晚上睡覺(jué)時(shí)身上被貼上幾十個(gè)電極同時(shí)記錄你的腦電波、眼動(dòng)、下巴肌肉活動(dòng)、心電、腿動(dòng)還有呼吸氣流和血氧——PSG干的就是這個(gè)事。它產(chǎn)生的不是一張簡(jiǎn)單的圖片而是一整夜、長(zhǎng)達(dá)數(shù)小時(shí)、包含多個(gè)生理信號(hào)通道的海量數(shù)據(jù)。這個(gè)項(xiàng)目的核心目標(biāo)就是從這片數(shù)據(jù)的海洋里像淘金一樣把睡眠的各個(gè)階段——清醒、快速眼動(dòng)睡眠REM、以及非快速眼動(dòng)睡眠的三個(gè)子階段N1 N2 N3——給自動(dòng)識(shí)別并分類出來(lái)。這活兒以前全靠睡眠技師人工“讀圖”他們盯著屏幕上的波形按照一套嚴(yán)格的規(guī)則比如AASM標(biāo)準(zhǔn)每30秒為一個(gè)“epoch”進(jìn)行標(biāo)注一份8小時(shí)的記錄就需要標(biāo)注近千個(gè)epoch耗時(shí)耗力且容易受主觀疲勞影響。而“睡眠階段分類”項(xiàng)目就是要用算法和模型來(lái)模擬甚至超越這個(gè)過(guò)程。它不僅僅是簡(jiǎn)單的模式識(shí)別更是對(duì)睡眠結(jié)構(gòu)、睡眠質(zhì)量進(jìn)行量化評(píng)估的基石。準(zhǔn)確的自動(dòng)分期能極大地解放人力讓睡眠技師專注于更復(fù)雜的病理事件如呼吸暫停、腿動(dòng)判讀也為睡眠障礙的篩查、診斷以及治療效果評(píng)估提供了穩(wěn)定、可重復(fù)的分析工具。無(wú)論是睡眠中心的日常報(bào)告還是可穿戴設(shè)備睡眠監(jiān)測(cè)功能的算法內(nèi)核都離不開(kāi)這套核心技術(shù)。2. 核心思路與技術(shù)選型規(guī)則、特征與深度學(xué)習(xí)的三條路徑面對(duì)PSG數(shù)據(jù)尤其是作為“金標(biāo)準(zhǔn)”的腦電EEG、眼電EOG和肌電EMG信號(hào)如何讓機(jī)器學(xué)會(huì)區(qū)分不同的睡眠階段業(yè)界和學(xué)界主要探索了三條技術(shù)路徑各有優(yōu)劣選擇哪一條取決于你的數(shù)據(jù)條件、精度要求和計(jì)算資源。2.1 基于規(guī)則與經(jīng)典特征提取的方法這是最傳統(tǒng)、最可解釋的路徑其核心思想是模仿睡眠技師的判讀規(guī)則。AASM手冊(cè)本身就是一套詳細(xì)的規(guī)則集。算法實(shí)現(xiàn)上我們首先對(duì)原始信號(hào)進(jìn)行預(yù)處理去噪、濾波然后從每個(gè)30秒的epoch中提取一系列特征。特征工程是關(guān)鍵時(shí)域特征例如腦電波的幅度、方差眼電信號(hào)中快速眼動(dòng)事件的密度和幅度下巴肌電的振幅REM期肌張力顯著降低。頻域特征這是重中之重。通過(guò)快速傅里葉變換FFT將腦電波分解為不同頻帶。δ波0.5-4 Hz的功率在深睡眠N3中占主導(dǎo)θ波4-8 Hz在思睡期N1和REM期活躍α波8-13 Hz在閉眼安靜清醒時(shí)出現(xiàn)紡錘波11-16 Hz和K復(fù)合波是N2期的標(biāo)志性特征通常需要額外的檢測(cè)算法來(lái)識(shí)別。非線性特征如熵值用于刻畫(huà)腦電信號(hào)的復(fù)雜度不同睡眠階段復(fù)雜度不同。提取出上百個(gè)特征后我們將其輸入到一個(gè)分類器如隨機(jī)森林、支持向量機(jī)或梯度提升樹(shù)中進(jìn)行訓(xùn)練。這套方法的優(yōu)勢(shì)在于透明、可解釋每個(gè)分類決策都可以追溯到是哪些特征如δ波功率高、紡錘波多起了主要作用非常符合醫(yī)療領(lǐng)域?qū)山忉屝缘囊蟆5淦款i在于特征的設(shè)計(jì)和篩選極度依賴專家知識(shí)且難以捕捉睡眠階段轉(zhuǎn)換時(shí)復(fù)雜的時(shí)空動(dòng)態(tài)模式。2.2 基于深度學(xué)習(xí)端到端的方法這是當(dāng)前研究的主流和前沿其哲學(xué)是“讓數(shù)據(jù)自己說(shuō)話”。我們不再手動(dòng)設(shè)計(jì)特征而是將預(yù)處理后的原始信號(hào)波形或簡(jiǎn)單的時(shí)頻圖如頻譜圖直接輸入深度神經(jīng)網(wǎng)絡(luò)。主流網(wǎng)絡(luò)架構(gòu)卷積神經(jīng)網(wǎng)絡(luò)CNN擅長(zhǎng)捕捉信號(hào)的局部空間通道間和局部時(shí)間模式。例如一維CNN可以像濾波器一樣掃描EEG波形自動(dòng)學(xué)習(xí)到類似紡錘波、δ波的局部形態(tài)特征。多通道數(shù)據(jù)可以視為一維時(shí)間序列的集合也可以用二維CNN處理時(shí)頻圖。循環(huán)神經(jīng)網(wǎng)絡(luò)RNN及其變體如LSTM GRU睡眠是一個(gè)強(qiáng)時(shí)序過(guò)程當(dāng)前階段與前后階段高度相關(guān)。RNN類網(wǎng)絡(luò)專門為序列數(shù)據(jù)設(shè)計(jì)能夠記憶歷史信息非常適合于建模睡眠階段的時(shí)序依賴關(guān)系。例如一個(gè)短暫的覺(jué)醒Wake后緊跟的往往是N1期而非N3期。CNNRNN混合模型目前最有效的架構(gòu)之一。先用CNN層從每個(gè)epoch中提取高級(jí)特征再將一系列epoch的特征序列輸入RNN層同時(shí)捕捉局部特征和長(zhǎng)程時(shí)序上下文。這就像先讓CNN識(shí)別出每個(gè)時(shí)間片段里的“單詞”如高δ波、紡錘波再讓RNN來(lái)理解這些單詞組成的“句子”睡眠結(jié)構(gòu)。深度學(xué)習(xí)的強(qiáng)大之處在于它能自動(dòng)學(xué)習(xí)到人眼難以察覺(jué)的、復(fù)雜的特征表示往往能達(dá)到甚至超過(guò)基于規(guī)則方法的精度。但其缺點(diǎn)是“黑箱”性質(zhì)需要大量的標(biāo)注數(shù)據(jù)數(shù)百到數(shù)千份完整的PSG記錄進(jìn)行訓(xùn)練且對(duì)計(jì)算資源要求較高。2.3 結(jié)合領(lǐng)域知識(shí)的混合模型這是實(shí)踐中最具潛力的方向旨在兼顧精度與可解釋性。不是二選一而是將兩者融合。思路一用深度學(xué)習(xí)模型作為強(qiáng)大的特征提取器替代手動(dòng)設(shè)計(jì)特征然后將這些深度特征與少數(shù)關(guān)鍵的、可解釋的經(jīng)典特征如δ/θ/α頻帶功率比拼接再送入一個(gè)相對(duì)簡(jiǎn)單的分類器如線性模型或樹(shù)模型。這樣既利用了深度模型的表征能力又保留了部分可解釋性。思路二在深度學(xué)習(xí)模型的后處理中引入規(guī)則約束。例如用隱馬爾可夫模型HMM對(duì)神經(jīng)網(wǎng)絡(luò)輸出的初步概率序列進(jìn)行平滑強(qiáng)制其符合睡眠階段轉(zhuǎn)換的基本規(guī)律如不能從Wake直接跳到N3REM期通常持續(xù)一段時(shí)間等。選型建議如果你是初學(xué)者或資源有限從基于經(jīng)典特征機(jī)器學(xué)習(xí)如隨機(jī)森林開(kāi)始。它流程清晰對(duì)數(shù)據(jù)量要求相對(duì)較低能幫你快速理解睡眠分期的核心物理意義。如果你追求最高精度且有充足數(shù)據(jù)優(yōu)先考慮CNN-LSTM混合模型。這是目前學(xué)術(shù)競(jìng)賽如Sleep-EDF數(shù)據(jù)庫(kù)上的比賽中的主流方案。如果你需要向臨床醫(yī)生解釋結(jié)果混合模型是更穩(wěn)妥的選擇。你可以展示“模型判斷這是N2期主要是因?yàn)闄z測(cè)到了紡錘波可解釋特征同時(shí)其深度神經(jīng)網(wǎng)絡(luò)分支也給出了高置信度。”3. 數(shù)據(jù)預(yù)處理與特征工程實(shí)戰(zhàn)無(wú)論選擇哪條路徑高質(zhì)量的數(shù)據(jù)預(yù)處理都是成功的半壁江山。原始PSG信號(hào)充滿了工頻干擾、肌電偽差、電極脫落等噪聲不加以清洗再好的模型也無(wú)用武之地。3.1 數(shù)據(jù)讀取與標(biāo)準(zhǔn)化PSG數(shù)據(jù)通常以EDFEuropean Data Format或EDF格式存儲(chǔ)。可以使用Python的mne或pyedflib庫(kù)進(jìn)行讀取。讀取后首要任務(wù)是統(tǒng)一采樣率通常EEG/EOG為100-200 Hz EMG可能更高并核查通道名稱與AASM標(biāo)準(zhǔn)導(dǎo)聯(lián)如C4-M1 O2-M1 EOG左右下巴EMG是否對(duì)應(yīng)。注意公開(kāi)數(shù)據(jù)集如Sleep-EDF MASS的導(dǎo)聯(lián)設(shè)置可能與你的目標(biāo)設(shè)置不同務(wù)必仔細(xì)閱讀數(shù)據(jù)說(shuō)明必要時(shí)進(jìn)行重參考如將C4-A1轉(zhuǎn)換為C4-M1的近似。3.2 信號(hào)預(yù)處理流水線帶通濾波這是最關(guān)鍵的一步。根據(jù)目標(biāo)頻段設(shè)置濾波器。EEG通常保留0.5-35 Hz覆蓋δ到β波。使用零相位濾波如mne.filter.filter_data設(shè)置phasezero以避免 distort 波形。EOG0.1-10 Hz主要捕捉慢速和快速眼動(dòng)。EMG10-100 Hz強(qiáng)調(diào)肌肉活動(dòng)的高頻成分。實(shí)操心得濾波器的階數(shù)和類型巴特沃斯、切比雪夫會(huì)影響信號(hào)。巴特沃斯濾波器通帶平坦是安全的選擇。階數(shù)不宜過(guò)高否則會(huì)引入振鈴偽差。建議先用一小段數(shù)據(jù)可視化濾波前后效果。工頻干擾去除50Hz或60Hz的電源干擾。推薦使用陷波濾波器Notch Filter但帶寬要窄如49-51 Hz。更優(yōu)的方法是結(jié)合獨(dú)立成分分析ICA但復(fù)雜度較高。偽差檢測(cè)與剔除振幅過(guò)高設(shè)定一個(gè)基于全局或滑動(dòng)窗口的振幅閾值如±200μV超過(guò)該閾值的epoch標(biāo)記為偽差。肌電偽差EMG信號(hào)突然大幅升高通常伴隨EEG高頻成分的增多。可以通過(guò)計(jì)算EEG在高頻段20-40 Hz的功率來(lái)檢測(cè)。處理策略對(duì)于訓(xùn)練集通常直接剔除偽差嚴(yán)重的epoch。在推理預(yù)測(cè)新數(shù)據(jù)時(shí)可以將其標(biāo)記為“運(yùn)動(dòng)偽差”或“不可評(píng)分”或者用前后epoch的插值來(lái)填補(bǔ)但需謹(jǐn)慎。3.3 經(jīng)典特征計(jì)算示例假設(shè)我們有一個(gè)30秒的EEG epoch采樣率100Hz即3000個(gè)數(shù)據(jù)點(diǎn)。import numpy as np from scipy import signal, stats import antropy as ant # 一個(gè)計(jì)算熵特征的好用庫(kù) def extract_features(eeg_epoch): 從一個(gè)EEG epoch中提取經(jīng)典特征。 eeg_epoch: 一維數(shù)組形狀為 (n_samples,) features {} # 1. 時(shí)域特征 features[amplitude_mean] np.mean(np.abs(eeg_epoch)) features[amplitude_std] np.std(eeg_epoch) features[line_length] np.sum(np.abs(np.diff(eeg_epoch))) # 曲線長(zhǎng)度反映復(fù)雜度 # 2. 頻域特征 (使用Welch方法估計(jì)功率譜密度) freqs, psd signal.welch(eeg_epoch, fs100.0, nperseg256) # 定義頻帶邊界 (單位: Hz) band_defs {delta: (0.5, 4), theta: (4, 8), alpha: (8, 13), beta: (13, 30)} total_power np.trapz(psd, freqs) for band_name, (low, high) in band_defs.items(): # 找到頻帶對(duì)應(yīng)的索引 idx_band np.logical_and(freqs low, freqs high) # 計(jì)算該頻帶內(nèi)的絕對(duì)功率和相對(duì)功率 band_power np.trapz(psd[idx_band], freqs[idx_band]) features[f{band_name}_abs_power] band_power features[f{band_name}_rel_power] band_power / total_power if total_power 0 else 0 # 計(jì)算頻譜邊緣頻率 (如95%功率所在的頻率) cum_power np.cumsum(psd) cum_power_norm cum_power / cum_power[-1] features[spectral_edge_freq_95] freqs[np.where(cum_power_norm 0.95)[0][0]] # 3. 非線性特征 features[permutation_entropy] ant.perm_entropy(eeg_epoch, order3, delay1, normalizeTrue) features[hjorth_mobility] ant.hjorth_params(eeg_epoch)[1] # 復(fù)雜度 return features注意事項(xiàng)特征計(jì)算后必須進(jìn)行標(biāo)準(zhǔn)化如Z-score標(biāo)準(zhǔn)化。因?yàn)椴煌卣鞯牧烤V和范圍差異巨大如功率值可能很大熵值在0-1之間不標(biāo)準(zhǔn)化會(huì)使得模型訓(xùn)練不穩(wěn)定并偏向于數(shù)值大的特征。務(wù)必在訓(xùn)練集上計(jì)算均值和標(biāo)準(zhǔn)差然后用同樣的參數(shù)去標(biāo)準(zhǔn)化驗(yàn)證集和測(cè)試集這是避免數(shù)據(jù)泄露的常見(jiàn)錯(cuò)誤點(diǎn)。4. 構(gòu)建一個(gè)CNN-LSTM混合模型進(jìn)行端到端分類這里我們以PyTorch為例展示一個(gè)相對(duì)完整的CNN-LSTM混合模型構(gòu)建、訓(xùn)練和評(píng)估流程。我們假設(shè)輸入是經(jīng)過(guò)預(yù)處理的、固定長(zhǎng)度的多通道信號(hào)段。4.1 模型架構(gòu)設(shè)計(jì)import torch import torch.nn as nn import torch.nn.functional as F class SleepStageCNNLSTM(nn.Module): def __init__(self, n_channels, seq_len, n_classes5): n_channels: 輸入信號(hào)的通道數(shù) (e.g., 3 for EEG, EOG, EMG) seq_len: 輸入序列的長(zhǎng)度單位epoch數(shù)用于建模時(shí)序上下文例如輸入5個(gè)連續(xù)的epoch n_classes: 分類類別數(shù) (e.g., Wake, N1, N2, N3, REM) super(SleepStageCNNLSTM, self).__init__() self.seq_len seq_len # CNN部分用于從單個(gè)epoch中提取特征 self.cnn nn.Sequential( # 輸入形狀: (batch, n_channels, epoch_samples) nn.Conv1d(in_channelsn_channels, out_channels32, kernel_size7, padding3), nn.BatchNorm1d(32), nn.ReLU(), nn.MaxPool1d(kernel_size2), nn.Conv1d(32, 64, kernel_size5, padding2), nn.BatchNorm1d(64), nn.ReLU(), nn.MaxPool1d(2), nn.Conv1d(64, 128, kernel_size3, padding1), nn.BatchNorm1d(128), nn.ReLU(), nn.AdaptiveAvgPool1d(1) # 全局平均池化將每個(gè)通道的時(shí)間維度壓成1 ) # 經(jīng)過(guò)CNN后每個(gè)epoch被編碼為一個(gè)128維的特征向量 # LSTM部分用于處理epoch序列 self.lstm nn.LSTM(input_size128, hidden_size64, num_layers2, batch_firstTrue, bidirectionalTrue) # 雙向LSTM輸出維度: 64 * 2 128 # 分類頭 self.fc nn.Sequential( nn.Dropout(0.5), nn.Linear(128, 64), nn.ReLU(), nn.Dropout(0.3), nn.Linear(64, n_classes) ) def forward(self, x): x 輸入形狀: (batch_size, seq_len, n_channels, epoch_samples) 例如: (32, 5, 3, 3000) batch_size, seq_len, n_channels, epoch_samples x.shape # 重塑以便CNN能獨(dú)立處理每個(gè)epoch x x.view(batch_size * seq_len, n_channels, epoch_samples) # CNN編碼每個(gè)epoch cnn_features self.cnn(x) # 形狀: (batch*seq, 128, 1) cnn_features cnn_features.squeeze(-1) # 形狀: (batch*seq, 128) # 恢復(fù)序列形狀 cnn_features cnn_features.view(batch_size, seq_len, -1) # (batch, seq, 128) # LSTM處理序列 lstm_out, _ self.lstm(cnn_features) # lstm_out 形狀: (batch, seq, 128) # 這里我們?nèi)⌒蛄凶詈笠粋€(gè)時(shí)間步的輸出用于分類當(dāng)前epoch序列的中心epoch # 更復(fù)雜的做法可以每個(gè)時(shí)間步都輸出或使用注意力機(jī)制 last_step_features lstm_out[:, seq_len // 2, :] # 假設(shè)目標(biāo)epoch在序列中間 # 分類 output self.fc(last_step_features) return output設(shè)計(jì)解析CNN部分使用一維卷積處理每個(gè)epoch的波形。卷積核大小從7到3遞減旨在捕捉從粗到細(xì)的波形特征。批歸一化BatchNorm加速訓(xùn)練并提升穩(wěn)定性。全局平均池化替代了全連接層減少了參數(shù)量并增強(qiáng)了特征的空間魯棒性。LSTM部分輸入是CNN為每個(gè)epoch提取的128維特征向量組成的序列。使用雙向LSTM是為了同時(shí)利用過(guò)去和未來(lái)的上下文信息這在睡眠分期中是合理的因?yàn)榧紟熥x圖時(shí)也會(huì)前后對(duì)照。我們這里簡(jiǎn)化處理只取序列中心點(diǎn)的LSTM輸出作為分類依據(jù)這假設(shè)了目標(biāo)epoch位于輸入序列的正中。更精細(xì)的做法是使用序列到序列Seq2Seq架構(gòu)為每個(gè)epoch都輸出一個(gè)預(yù)測(cè)。Dropout在分類頭中使用了較高的Dropout率0.5這是防止深度學(xué)習(xí)模型在小規(guī)模醫(yī)療數(shù)據(jù)上過(guò)擬合的有效手段。4.2 數(shù)據(jù)加載與訓(xùn)練策略from torch.utils.data import Dataset, DataLoader import numpy as np class PSGDataset(Dataset): def __init__(self, signals, labels, seq_len5): signals: list of numpy arrays, 每個(gè)元素是一個(gè)受試者的所有epoch數(shù)據(jù)形狀為 (n_epochs, n_channels, n_samples) labels: list of numpy arrays, 對(duì)應(yīng)的標(biāo)簽 seq_len: 上下文序列長(zhǎng)度 self.signals [] self.labels [] # 為每個(gè)受試者生成序列樣本 for sig, lab in zip(signals, labels): n_epochs sig.shape[0] for i in range(seq_len//2, n_epochs - seq_len//2): # 取以第i個(gè)epoch為中心的序列 seq_signal sig[i-seq_len//2 : iseq_len//21] seq_label lab[i] self.signals.append(seq_signal) self.labels.append(seq_label) def __len__(self): return len(self.labels) def __getitem__(self, idx): signal torch.FloatTensor(self.signals[idx]) # (seq_len, C, T) label torch.LongTensor([self.labels[idx]]).squeeze() return signal, label # 訓(xùn)練循環(huán)關(guān)鍵部分 device torch.device(cuda if torch.cuda.is_available() else cpu) model SleepStageCNNLSTM(n_channels3, seq_len5, n_classes5).to(device) criterion nn.CrossEntropyLoss() optimizer torch.optim.Adam(model.parameters(), lr1e-4, weight_decay1e-5) # 使用權(quán)重衰減正則化 # 類別不平衡處理睡眠階段分布極不均衡N2占大部分N1很少 # 計(jì)算訓(xùn)練集中每個(gè)類別的頻率 class_counts np.bincount(train_labels) class_weights 1. / class_counts class_weights torch.FloatTensor(class_weights).to(device) criterion nn.CrossEntropyLoss(weightclass_weights) for epoch in range(num_epochs): model.train() for batch_signals, batch_labels in train_loader: batch_signals, batch_labels batch_signals.to(device), batch_labels.to(device) optimizer.zero_grad() outputs model(batch_signals) loss criterion(outputs, batch_labels) loss.backward() # 梯度裁剪防止RNN訓(xùn)練中的梯度爆炸 torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0) optimizer.step()實(shí)操心得序列構(gòu)建構(gòu)建輸入序列時(shí)要處理好數(shù)據(jù)邊界。上述代碼在序列中心進(jìn)行采樣因此會(huì)損失開(kāi)頭和結(jié)尾的一些epoch。也可以采用填充padding策略。類別不平衡睡眠數(shù)據(jù)中N2期通常占40%-50%而N1期可能只有5%。直接使用交叉熵?fù)p失會(huì)導(dǎo)致模型偏向多數(shù)類。使用加權(quán)交叉熵?fù)p失是基礎(chǔ)且有效的方法。更高級(jí)的可以采用過(guò)采樣如SMOTE、欠采樣或Focal Loss。梯度裁剪訓(xùn)練LSTM時(shí)梯度裁剪幾乎是必需品它能穩(wěn)定訓(xùn)練過(guò)程。驗(yàn)證策略務(wù)必按受試者劃分訓(xùn)練集、驗(yàn)證集和測(cè)試集而不是隨機(jī)打亂所有epoch。即某些人的全部數(shù)據(jù)在訓(xùn)練集另一些人的在測(cè)試集留一受試者出LOO或K折受試者交叉驗(yàn)證。這是評(píng)估模型泛化到新個(gè)體能力的關(guān)鍵隨機(jī)劃分epoch會(huì)嚴(yán)重高估性能。5. 模型評(píng)估、結(jié)果解讀與常見(jiàn)問(wèn)題模型訓(xùn)練完成后不能只看準(zhǔn)確率。睡眠分期有其特殊性需要一套專門的評(píng)估體系。5.1 評(píng)估指標(biāo)詳解總體準(zhǔn)確率最直觀但最不可靠的指標(biāo)。由于類別不平衡一個(gè)把所有epoch都預(yù)測(cè)為N2的模型也能獲得很高的準(zhǔn)確率。混淆矩陣必須查看。它能清晰揭示模型在哪些類別上容易混淆。通常N1期最容易與Wake、N2或REM混淆REM期容易與N1混淆因?yàn)閮烧叨加械驼穹旌项l率腦電。每類性能指標(biāo)針對(duì)每個(gè)睡眠階段Wake N1 N2 N3 REM計(jì)算靈敏度真正例率。模型找出所有真實(shí)為該類的epoch的能力。特異度真負(fù)例率。模型排除所有非該類epoch的能力。F1分?jǐn)?shù)精確率和召回率的調(diào)和平均數(shù)是衡量各類別性能的綜合性指標(biāo)。我們通常更關(guān)注N1和REM的F1分?jǐn)?shù)因?yàn)檫@兩類最難分但對(duì)臨床意義重大REM睡眠行為障礙、嗜睡癥等。Cohen‘s Kappa系數(shù)衡量模型預(yù)測(cè)與人工標(biāo)注之間的一致性排除了隨機(jī)一致的可能性。Kappa 0.8 表示極好的一致性0.6-0.8為良好。一個(gè)優(yōu)秀的自動(dòng)分期系統(tǒng)其Kappa值應(yīng)能達(dá)到甚至超過(guò)不同睡眠技師之間的一致性水平約0.7-0.8。5.2 結(jié)果可視化與解讀除了數(shù)字指標(biāo)可視化能提供更深刻的洞察。睡眠結(jié)構(gòu)圖對(duì)比將模型預(yù)測(cè)的睡眠階段序列hypnogram與人工標(biāo)注的金標(biāo)準(zhǔn)并排繪制。觀察整體結(jié)構(gòu)睡眠周期是否吻合特別注意在睡眠階段轉(zhuǎn)換點(diǎn)如Wake到N1 N2到N3 N2到REM附近模型是否穩(wěn)定。置信度分析對(duì)于輸出概率的模型可以分析模型在不同階段、不同情況下的預(yù)測(cè)置信度。通常模型對(duì)N2和Wake的預(yù)測(cè)置信度最高對(duì)N1和某些REM期的置信度較低。低置信度的epoch正是需要人工復(fù)核或規(guī)則后處理的重點(diǎn)區(qū)域。5.3 常見(jiàn)問(wèn)題與排查技巧問(wèn)題1模型在N1期表現(xiàn)極差F1分?jǐn)?shù)很低。原因N1期本身生理特征模糊是清醒到睡眠的過(guò)渡期持續(xù)時(shí)間短且標(biāo)注者間一致性最低。數(shù)據(jù)量也通常最少。排查與解決檢查數(shù)據(jù)確認(rèn)N1期的標(biāo)注質(zhì)量。可以抽樣查看被誤判的N1期epoch的原始信號(hào)看其是否確實(shí)具有典型的低振幅混合頻率α波減弱特征還是標(biāo)注本身有爭(zhēng)議。特征/模型層面對(duì)于特征方法嘗試增加更多刻畫(huà)“過(guò)渡態(tài)”的特征如α波衰減的斜率、特定頻帶功率比的變化率。對(duì)于深度模型可以嘗試引入注意力機(jī)制讓模型學(xué)會(huì)關(guān)注那些對(duì)區(qū)分N1與其他階段更關(guān)鍵的信號(hào)片段或頻帶。數(shù)據(jù)層面對(duì)N1類進(jìn)行過(guò)采樣或使用更激進(jìn)的類別權(quán)重。問(wèn)題2模型將部分REM期錯(cuò)誤分類為N1。原因兩者在EEG上相似均為低振幅混合頻率主要區(qū)別在于EOGREM期有快速眼動(dòng)和下巴EMGREM期肌張力缺失。排查與解決確認(rèn)輸入確保模型確實(shí)接收到了高質(zhì)量的EOG和EMG通道。檢查這些通道的預(yù)處理是否得當(dāng)如EOG濾波范圍是否正確EMG是否受到嚴(yán)重干擾。特征設(shè)計(jì)對(duì)于特征方法確保提取了有效的EOG特征如眼動(dòng)事件的密度、幅度和EMG特征如振幅方差、均方根。可以設(shè)計(jì)一個(gè)“肌電張力指數(shù)”。后處理規(guī)則引入簡(jiǎn)單的后處理規(guī)則。例如如果模型預(yù)測(cè)為N1但同期EMG振幅極低且檢測(cè)到快速眼動(dòng)事件則強(qiáng)制將其改為REM。這能有效糾正一些低級(jí)錯(cuò)誤。問(wèn)題3模型在測(cè)試集上表現(xiàn)遠(yuǎn)差于驗(yàn)證集。原因過(guò)擬合或訓(xùn)練集與測(cè)試集存在分布差異如來(lái)自不同醫(yī)院、不同設(shè)備型號(hào)、不同人群。排查與解決加強(qiáng)正則化增加Dropout比率加大L2權(quán)重衰減或使用更深的模型配合更早的停止early stopping。數(shù)據(jù)增強(qiáng)對(duì)PSG信號(hào)進(jìn)行輕微的數(shù)據(jù)增強(qiáng)如添加高斯噪聲、隨機(jī)小幅縮放、隨機(jī)時(shí)間偏移在epoch內(nèi)等提升模型魯棒性。域適應(yīng)如果數(shù)據(jù)來(lái)自不同源考慮使用域適應(yīng)技術(shù)或在訓(xùn)練時(shí)混合更多樣化的數(shù)據(jù)。問(wèn)題4模型預(yù)測(cè)的睡眠結(jié)構(gòu)“跳變”過(guò)多不符合生理規(guī)律。原因模型獨(dú)立地判斷每個(gè)epoch忽略了睡眠階段的時(shí)序連續(xù)性。解決序列建模使用我們上面介紹的LSTM或Transformer結(jié)構(gòu)顯式建模時(shí)序依賴。后處理平滑使用隱馬爾可夫模型HMM或簡(jiǎn)單的滑動(dòng)窗口投票進(jìn)行平滑。例如規(guī)定一個(gè)睡眠階段至少持續(xù)3個(gè)epoch1.5分鐘將孤立的、短于該時(shí)長(zhǎng)的階段合并到前后主要階段中。這是提升結(jié)果“臨床可接受度”的立竿見(jiàn)影的方法。這個(gè)項(xiàng)目從數(shù)據(jù)預(yù)處理到模型構(gòu)建、訓(xùn)練、評(píng)估是一個(gè)典型的醫(yī)療信號(hào)處理與機(jī)器學(xué)習(xí)交叉的課題。它沒(méi)有唯一的正確答案需要在模型精度、計(jì)算效率、可解釋性和臨床可用性之間不斷權(quán)衡和迭代。每一次對(duì)混淆矩陣的分析每一次對(duì)錯(cuò)誤案例的信號(hào)回看都是你對(duì)睡眠生理和算法理解加深的過(guò)程。