深度學習檢測心臟心律不齊
- 2019 年 11 月 30 日
- 筆記
作者 | Andrew Long 來源 | Medium
編輯 | 程式碼醫生團隊
介紹
最近正在審查Andrew Ng的團隊在使用卷積神經網路(CNN)的心律不齊檢測器上的工作。發現這尤其令人著迷,尤其是隨著可穿戴產品(例如Apple Watch和攜帶型EKG機器)的出現,它們能夠在家中監測心臟。因此很好奇如何構建可以檢測異常心跳的機器學習演算法。在這裡,將使用ECG訊號(對心臟進行連續電測量)並訓練3個神經網路來預測心臟心律不齊:密集神經網路,CNN和LSTM。
在本文中,將探討3個課程:
- 將數據集拆分為患者而不是樣本
- 學習曲線可以告訴您獲得更多數據
- 測試多種類型的深度學習模型
數據集
將使用MIH-BIH Arrythmia數據集。這是一個數據集,包含從1970年代以360 Hz測量的48個半小時兩通道ECG記錄。錄音有心臟病專家對每個心跳的注釋。注釋的符號可以在鏈接中找到
項目定義
預測以心跳峰值為中心的每6秒窗口中,來自ECG訊號的心跳是否有心律不齊。
為了簡化問題,將假定QRS檢測器能夠自動識別每個心跳的峰值。由於數據減少,將忽略記錄的前3秒或後3秒中的任何非搏動注釋和任何心跳。將使用6秒的窗口,以便可以將當前搏動與之前和之後的搏動進行比較。這個決定是在與醫生交談後作出的,該醫生說這樣比較容易確定是否可以將其進行比較。
資料準備
開始列出data_path中所有患者的列表。

在這裡,將使用pypi包wfdb來載入ecg和注釋。

載入所有注釋,並查看心跳類型在所有文件中的分布。


現在可以列出非搏動和異常搏動的列表:

可以按類別分組並查看此數據集中的分布:

該數據集中約30%的異常。如果這是一個實際的項目,那麼最好檢查一下文獻。這比正常情況要高,因為這是關於心律失常的數據集!
編寫一個用於載入單個患者的訊號和注釋的函數。注意,注釋值是訊號數組的索引。

檢查一下患者的心電圖有哪些異常搏動:

可以通過以下方式繪製訊號在異常搏動之一周圍:


製作數據集
製作一個數據集,該數據集中在[apologies for broken screenshots]前後+-3秒的搏動上



第1課:按病人分成樣本
開始處理所有患者。

想像一下,天真地決定將樣本中的數據隨機分成訓練和驗證集。

現在準備構建第一個密集NN。為了簡單起見,將在Keras中進行此操作。

可以構建一些用於指標報告的功能。

可以從Keras模型獲得預測 predict_proba

為簡單起見,將閾值設置為異常搏動的發生率並計算報告:

這對新患者有效嗎?如果每個患者都有獨特的心臟訊號,也許不會。從技術上講,同一患者可以同時出現在訓練和驗證集中。這意味著可能在數據集中意外泄漏了資訊。可以通過分割患者而不是樣本來檢驗這個想法。

並訓練一個新的密集模型:


驗證AUC下降了很多,這確認了之前的數據泄漏。獲得的經驗:對患者而不是樣本的分裂!
第二課:學習曲線可以告訴應該獲取更多數據!
考慮到訓練和驗證之間的過度擬合。做一個簡單的學習曲線,看看是否應該去收集更多的數據。


獲得的經驗教訓:更多數據似乎對該項目有所幫助!
懷疑安德魯·伍(Andrew Ng)的團隊得出了相同的結論,因為花時間注釋了29,163名患者的64,121條ECG記錄,這比任何其他公共數據集都要多2個數量級。
https://stanfordmlgroup.github.io/projects/ecg /
第3課:測試多種類型的深度學習模型
有線電視新聞網
從製作CNN開始。在這裡將使用一維CNN(與用於影像的2D CNN相反)。
CNN是一種特殊類型的深度學習演算法,它使用一組濾波器和卷積運算符來減少參數數量。該演算法激發了用於影像分類的最新技術。本質上,此方法對於1D CNN的工作方式是kernel_size從第一個時間戳開始獲取一個大小的過濾器(內核)。卷積運算符獲取過濾器,並將每個元素與第一kernel_size時間步長相乘。然後,將這些乘積累加到神經網路下一層的第一個單元。過濾器然後按stride時間步長移動並重複。strideKeras中的默認值為1,我們將使用它。在影像分類中,大多數人使用padding這允許通過添加「額外」單元格來拾取影像邊緣上的某些特徵,將使用默認填充為0。然後將卷積的輸出乘以一組權重W並添加到偏差b然後通過密集神經網路中的非線性激活函數。然後如果需要,可以添加其他的CNN層重複此操作。在這裡,將使用Dropout,它是一種通過隨機刪除一些節點來減少過擬合的技術。
對於Keras的CNN模型,需要稍微重塑數據

在這裡,將成為具有退出功能的一層CNN


CNN的性能似乎比密集的NN高。
RNN:LSTM
由於此數據訊號是時間序列的,因此測試遞歸神經網路(RNN)很自然。在這裡,將測試雙向長短期記憶(LSTM)。與密集的NN和CNN不同,RNN在網路中具有循環以保留過去發生的事情。這允許網路將資訊從早期步驟傳遞到以後的時間步驟,而這些資訊通常會在其他類型的網路中丟失。從本質上講,在通過非線性激活函數之前,該存儲狀態在計算中還有一個額外的術語。在這裡,使用雙向資訊,因此資訊可以在兩個方向(從左到右和從右到左)傳遞。這將幫助獲取有關中心心跳左右兩側正常心跳的資訊。
如下所示,這花了很長時間訓練。為了使它成為一個周末項目,將訓練集減少到10,000個樣本。對於真實的項目,將增加時期數並使用所有樣本。


似乎該模型需要從其他時期進行正則化(即退出)。
最終ROC曲線
這是這3個模型的最終ROC曲線

給定更多的時間,最好嘗試優化超參數,看看是否可以使Dense或CNN更高。
局限性
由於這只是一個周末項目,因此存在一些限制:
- 沒有優化超參數或層數
- 沒有按照學習曲線的建議收集其他數據
- 沒有探索心律失常患病率的文獻,以查看該數據集是否可以代表一般人群(可能不是)
推薦閱讀