深度學習檢測心臟心律不齊

  • 2019 年 11 月 30 日
  • 筆記

作者 | Andrew Long 來源 | Medium

編輯 | 程式碼醫生團隊

介紹

最近正在審查Andrew Ng的團隊在使用卷積神經網路(CNN)的心律不齊檢測器上的工作。發現這尤其令人著迷,尤其是隨著可穿戴產品(例如Apple Watch和攜帶型EKG機器)的出現,它們能夠在家中監測心臟。因此很好奇如何構建可以檢測異常心跳的機器學習演算法。在這裡,將使用ECG訊號(對心臟進行連續電測量)並訓練3個神經網路來預測心臟心律不齊:密集神經網路,CNN和LSTM。

在本文中,將探討3個課程:

  1. 將數據集拆分為患者而不是樣本
  2. 學習曲線可以告訴您獲得更多數據
  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更高。

局限性

由於這只是一個周末項目,因此存在一些限制:

  • 沒有優化超參數或層數
  • 沒有按照學習曲線的建議收集其他數據
  • 沒有探索心律失常患病率的文獻,以查看該數據集是否可以代表一般人群(可能不是)

推薦閱讀

機器學習中四種演算法預測潛在的心臟病