作者|Rishiraj Acharya
編譯|VK
來源|Medium

在醫學資料集的訓練演算法期間面臨的許多問題中,這三個最常見:
- 類別不均衡
- 多任務
- 資料集大小
對于這些問題,我將分享一些解決問題的技術,
類別不均衡挑戰
在現實世界中,我們看到的健康人比患病的人要多得多,這也反映在醫學資料集中,健康和患病類別的例子數量并不平均,這反映了疾病在現實世界中的頻率,在醫療資料集和信用卡欺詐資料集中,你可能會看到正常樣本的數量是例外樣本的一百倍,
結果,很容易被誤認為是模型表現出色,而實際上卻并非如此,如果使用accuracy_score準確度這樣的簡單度量,就會發生這種情況,準確度對于這類資料集來說不是一個很好的度量標準,因為標簽嚴重傾斜,所以一個只輸出正常標簽的神經網路的準確率甚至還能略高于90%,
解決方案:
我們可以定義更有用的指標,例如F1度量或"精確度/召回率",精度定義為"真正例個數/(真正例個數+假正例個數)",假正例很多時這是一個很好的度量,另一方面,召回率定義為"真正例個數/(真正例個數+假反例個數)",當假反例本很多時這是一個很好的度量,醫療領域的大多數模型就是這種情況,但是,我們經常需要同時考慮假正例個數和假反例個數,這就是F1度量的功能,它在精確度(Precision)和召回率(Recall)之間取得均衡,由公式2 * ((Precision*Recall) / (Precision+Recall))給出,
處理類不均衡的另一種流行技術是"重采樣",這是從多數類(樣本過多的那一類)中洗掉示例(稱為欠采樣)或在少數類中添加示例(稱為過采樣)以在這兩個類之間取得均衡的行為,盡管它們可以通過使用復雜的重采樣技術來解決,但它們具有自己的缺點,如資訊丟失和過擬合,
多任務挑戰
在現實世界中,通常僅預測健康或患病是不夠的,我們經常需要將醫療資料分為多個類別或標簽,例如,僅從心律中檢測出心律失常并沒有那么有市場,對患者進行分析判斷得到哪種心律失常更有價值,例如病狀可能是房顫,室上性心動過速或任何其他型別,
從理論上講,可以為需要分類的每個標簽訓練單獨的神經網路模型,但是這對于寫代碼來說非常不切實際,如果我們可以將所有這些分類模型組合到一個回傳多個預測的單個深度神經網路中,就比較有價值,
解決方案:
我們使用一種稱為"多類別分類"或"多標簽分類"的方法來應對這一挑戰,它們之間略有不同,在多類別中,資料樣本的類別是互斥的,而在多標簽中,資料樣本可以屬于多個類別,在醫學領域,我們通常使用多標簽分類,因為如果患者被診斷為肺不張(肺的膨脹不全),則并不意味著他/她就不會有心臟肥大,我們將模型最后一層的分數再傳遞給Sigmoid激活函式,這會把最后一層的每個分數轉換為0到1之間的值,而與其他分數無關,
對于多標簽分類,我們選擇的損失函式變為binary_crossentropy,其中由于我們使用了Sigmoid激活函式,因此每個標簽都被視為獨立的伯努利分布,在需要多類的情況下,可以用損失函式設定為categorical_crossentropy的softmax激活函式來替換Sigmoid激活函式,
資料集大小挑戰
處理醫學資料集的主要挑戰是這些資料集的大小,大型訓練資料除了具有良好的體系結構外,還對模型的性能起著重要的作用,并且可用于疾病的患者資料數量往往不夠,低資料集大小是導致高偏差和高方差的主要原因,這導致模型的推廣和優化困難,
解決方案:
為了解決模型優化的困難,我們使用一種稱為"遷移學習"的方法,其中我們使用從相關網路較低層中學習來訓練較高層,而無需它們從頭開始學習,由于先前的訓練,較低的圖層可以用作良好的特征提取器,因此我們可以根據資料集對其進行微調,該技術優化速度更快,并減少了訓練新模型所需的資料量,
為了解決模型泛化的困難,我們使用一種稱為"資料增強"的技術,將資料提供給模型之前,不是復制相同的示例,而是對示例進行一些隨機轉換,這樣,我們可以使模型對于大小或亮度等微小變化保持不變,諸如水平或垂直翻轉影像,更改影像的亮度或對比度,將影像旋轉或縮放到一定程度之類的做法都有助于資料擴充,此技術在小型資料集中避免過度擬合非常有用,
原文鏈接:https://medium.com/aiformedicine/challenges-of-training-models-on-medical-data-7ecc03db2d65
歡迎關注磐創AI博客站:
http://panchuang.net/
sklearn機器學習中文官方檔案:
http://sklearn123.com/
歡迎關注磐創博客資源匯總站:
http://docs.panchuang.net/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/21487.html
標籤:其他
下一篇:在用celery異步發郵件是,worker端出現gaierror(11002, 'Lookup timed out')
