醫學假陰性?看看在機器學習中如何用來衡量分類模型的效果(附程式碼)
- 2020 年 2 月 20 日
- 筆記
來源:數據鴿
本文約1500字,建議閱讀5分鐘。
本篇我們來看下醫學假陰性在機器學習中是如何用來衡量預測結果好壞的。
近日來,新冠肺炎核酸檢測「假陰性」引起了關注。所謂的假陰性,就是患者是新型冠狀病毒感染者,但是核酸沒檢測出來,報告陰性。有專家分析,任何核酸檢測的檢出率都不可能達到100%,出現假陰性具有不可避免性,這是技術本身存在的局限性。
對於熟悉機器學習(Machine Learning)的各位鴿友來說,假陰性(False Negative, FN)是患者本身是染病了,但是由於預測錯誤,預測結果是無病,或者非感染者。本篇我們來看下假陰性在機器學習中是如何用來衡量預測結果好壞的。
這裡的「真或假」其實就是指(醫學上)檢測正確或錯誤,(機器學習中)預測正確或錯誤。
好了,如果有點暈,看下面一張表總結就夠了:
TP(真陽性):本身有病,並且檢測/預測正確 |
FN(假陰性):本身有病,但是由於檢測/預測錯誤,導致誤判為無病 |
---|---|
FP(假陽性):本身無病,但是由於檢測/預測錯誤,導致誤判為有病 |
TN(真陰性): 本身無病,並且檢測/預測正確 |
那麼像這種在機器學習中來判斷預測值為陽性(1),陰性(0)的問題是典型的二元分類問題。我們可以用很多機器學習演算法來解決。這裡僅用樸素貝葉斯舉個例子。
樸素貝葉斯是一種利用貝葉斯概率定理對未知類進行預測的分類演算法。它使用概率來決定一個測試點屬於哪個類。樸素貝葉斯是一個純粹的統計模型。由於假設數據集中的特徵/屬性是相互獨立的,因此此演算法稱為樸素演算法。
在本文中,我們將使用樸素貝葉斯分類器來預測數據集中的患者是否患有糖尿病。數據集為UCI Pima Indians Diabetes Database (加州大學爾灣分校糖尿病公開數據集),可以在UCI Machine Learning網站或Kaggle網站下載。
下面我們用Python來實操一下。
首先引入相關包:
import numpy as np import pandas as pd from sklearn import model_selection from sklearn import metrics from sklearn.naive_bayes import GaussianNB
讀入數據,顯示前五行:
df_input = pd.read_csv("./data/diabetes.csv") df_input.head()

可以看到該數據集共有九列:懷孕次數,血糖,血壓,皮脂厚度,胰島素,BMI身體品質指數,糖尿病遺傳函數,年齡和結果。前八個是特徵,最後一個(結果)是標籤。結果有兩種標籤:0(陰性,非糖尿病)和1(陽性,糖尿病)。
看一下數據類型:
df_input.dtypes

顯示數據摘要(基本統計資訊):
df_input.describe()

我們需要將所有列分為因變數(結果或標籤數據)和自變數(八個特徵)。X包含自變數,y包含因變數。然後,我們將這些變數分為訓練和測試集:
array = df_input.values X = array[:,0:8] # select all rows and first 7 columns which are the attributes Y = array[:,8] # select all rows and the 8th column which is the classification "Yes", "No" for diabeties test_size = 0.3 # taking 70:30 training and test set seed = 1 # Random numbmer seeding for reapeatability of the code X_train, X_test, Y_train, Y_test = model_selection.train_test_split(X, Y, test_size=test_size, random_state=seed)
將數據分為訓練和測試後,我們將在訓練集上生成Naive Bayes模型,並對測試數據集進行預測:
model = GaussianNB() model.fit(X_train, Y_train) print(model) # make predictions expected = Y_test predicted = model.predict(X_test) # summarize the fit of the model print(metrics.classification_report(expected, predicted)) print(metrics.confusion_matrix(expected, predicted))
生成了一個分類報告,來度量樸素貝葉斯模型預測的效果:

可以看到,這些指標是使用真陽性/TP(人有糖尿病,預測為糖尿病)、真陰性/TN(人沒有糖尿病,預測不是糖尿病)、假陽性/FP(人沒有糖尿病但預測為糖尿病)和假陰性/FN(人有糖尿病但預測不是糖尿病)來計算的。
準確率:預測對的樣本數占樣本總數的比例:
Accuracy = (TP+TN)/(TP+TN+FP+FN)
精確率:預測為正的樣本中有多少是真正的正樣本:
Precision= TP /(TP + FP)
召回率:我們發現了多少陽性病例,即樣本中的正例有多少被預測正確了:
Recall= TP /(TP + FN)
F1分數:又稱平衡F分數(balanced F Score),它被定義為精確率和召回率的調和平均數。是統計學中用來衡量二分類模型精確度的一種指標。它同時兼顧了分類模型的精確率和召回率。它的最大值是1,最小值是0。
F1 score = 2*(Recall*Precision)/(Recall+Precision)
以上,各位保重。