DNN 是一種模仿生物神經系統的數學模型,能夠讓演算法具有自我學習的功能;讓我們用 python 看看怎麼將 DNN 延伸到醫療場域,輔助乳癌的診斷吧!
DNN 神經網路深度學習演算法:以乳癌判別為例
在人工智慧領域中,應用最廣且效果最好的就是深度學習模型的應用。目前深度神經網路(Deep Neural Network,DNN)模型主要應用於非線性分類問題,卷積神經網路(Convolutional Neural Network,CNN)主要用於圖像分類及人臉識別等領域,遞歸神經網路(Recurrent Neural Network,RNN)主要應用與語音辨識以及自然語言處理等領域。若能運用病人特徵、過去病史、用藥處方、檢驗數據等重要變項演算出各疾病預測模型,輔以決策支援系統開發,便能協助臨床醫師診斷評估。
DNN 是一種模仿生物神經系統的數學模型,能夠讓演算法具有自我學習的功能;今天,就讓我們來用 python 看看怎麼將 DNN 延伸到醫療場域,輔助乳癌的診斷吧!
我們的任務是利用 569 個病人的資料,來建立判斷腫瘤是良性或是惡性的模型;資料庫是從 sklearn 中把乳癌的資料模組中撈出來。
import tensorflow as tf
# 從 sklearn 載入乳癌數據
from sklearn.datasets import load_breast_cancer
# 載入乳癌數據
data = load_breast_cancer()
把資料載好之後,從 data.data.shape 的結果 (569, 30) 可知,我們有 569 個樣本、30 個特徵;data.target 中 0 和 1 則分別代表實際 Ground Truth 病人究竟有沒有乳癌,0 是良性 Benign、1 是惡性 Malignant。
30 個特徵包含哪些面向呢?
data.feature_names

原來這些特徵包含了:腫瘤的平均半徑(Radius)、質地(Texture)、周長(Perimeter)、面積(Area)… 等,平時放射科、乳房外科自己看片時也會根據這些特徵中的數項來做腫瘤良惡性的判斷。
再來要把數據分成訓練(Train)和驗證(Val)兩組,test_size = 0.33 是指我們把 2/3 的資料拿來訓練、1/3 的資料拿來做驗證。
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(data.data, data.target, test_size = 0.33)
N, D = X_train.shape
接著要把資料進行標準化,為什麼呢?因為每種類型的數據有大有小,有的數值介於 0 – 1、有的是 -1 到 1、有的是 1 到 10,000… 如果數據規模相差太大,會造成模型預測結果不準確,所以建議要把數據做常態分佈標準化(Scaling),我們先用 sklearn 的套件來處理。
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_val = scaler.transform(X_val)
把資料做完基本前處理後,就來建模吧!Input Layer 有 D(特徵的數量)個輸入參數,因為我們是在做二元分類(良惡性),Dense Layer 的激活函數就用和 Logistic Regression 一樣的 sigmoid、神經元只有 1 個。編譯的優化器選 adam,損失函數用 binary crossentropy,用準確度 Accuracy 來做評估,設定訓練 100 次(Epochs)就讓他跑一下啦~
# 建立模型
model = tf.keras.models.Sequential([
tf.keras.layers.Input(shape = (D,)),
tf.keras.layers.Dense(1, activation='sigmoid')
])
# 編譯模型
model.compile(optimizer = 'adam',
loss = 'binary_crossentropy',
metrics = ['accuracy'])
# 訓練模型
r = model.fit(X_train, y_train, validation_data = (X_val, y_val), epochs = 100)
# 評估模型
print("Train score:", model.evaluate(X_train, y_train))
print("Validation score:", model.evaluate(X_val, y_val))
Alright!倒數第一和第三行顯示出 Train 和 Validation 的 Loss 和 Accuracy,看起來還不錯,等等我們把它視覺化吧!

藍色是訓練 Training Set、橘色是 Validation Set,我們用 Epochs 為橫軸、Loss 和 Validation 為縱軸,分別畫出它們隨著迭代次數增加的變化:
import matplotlib.pyplot as plt
plt.plot(r.history['loss'], label = 'loss')
plt.plot(r.history['val_loss'], label = 'val_loss')
plt.legend()

plt.plot(r.history['accuracy'], label = 'acc')
plt.plot(r.history['val_accuracy'], label = 'val_acc')
plt.legend()

之後如果我們手上有新的資料,像是一個新病人做完檢查後的腫瘤平均半徑、質地、周長、面積等 30 個特徵,我們就能用 model.predict() 就可以來預測看看,新病人的腫瘤是良性還是惡性的。
#CC
I’ve been using it for a month for checking analytics, and the fast transactions stands out.