医学假阴性?看看在机器学习中如何用来衡量分类模型的效果(附代码)
- 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)
以上,各位保重。