其他
【强基固本】机器学习常用评价指标总览
“强基固本,行稳致远”,科学研究离不开理论基础,人工智能学科更是需要数学、物理、神经科学等基础学科提供有力支撑,为了紧扣时代脉搏,我们推出“强基固本”专栏,讲解AI领域的基础知识,为你的科研学习提供助力,夯实理论基础,提升原始创新能力,敬请关注。
地址:https://www.zhihu.com/people/peissen
01
02
TP:True Positive,真实标签为正例,模型也预测为正例,即真阳性——还有得救; FN:False Negative,真实标签为正例,模型却预测为负例,即假阴性——不忍直视; FP:False Positive,真实标签为负例,模型却预测为正例,即假阳性——浪费资源; TN:True Negative,真实标签为负例,模型也预测为负例,即真阴性——皆大欢喜;
TPR(True Positive Rate),即真阳性率,常称为召回率(Recall)、查全率、命中率、或灵敏度(Sensitivity)。召回率针对的是原始的正样本,可以理解为有多少正样本被正确地预测。因此,原始的正样本要么被预测正确(TP),要么被预测错误(FN),则:
PPV(Positive Predictive Value),即阳性预测值,常称为精确度(Precision)或查准率。精确率针对的是预测的正样本,可以理解为被预测为阳性的样本中有多少是正确的。因此,被预测为阳性的样本要么原本就是正样本(TP),要么原本是负样本(FP),则:
F1-Score,即F1分数,也称为Dice系数或Dice相似度(Dice similarity coefficient)。F1分数可以定义为精确率和召回率的调和平均值,其值域为[0, 1],通常值越大越好:
TNR(True Negative Rate),即真阴性率,也称为特异度(Specificity)。特异度针对的是原始的负样本,可以理解为有多少负样本被正确地预测。同样地,原始的负样本中要么被正确地检测错误(TN),要么被错误的检测为正样本(FP),则:
FPR(False Positive Rate),即假阳性率,可作为ROC曲线的横轴,其计算公式为:
ACC(Accuracy),即准确率,这个应该是最常见且最容易理解的一个机器学习评价指标。准确率针对的是所有的样本被正确判断的概率?无非就两种情况是正确的,比如原来是正样本被模型判断为正样本(TP),或者原来是负样本被模型判断为负样本(TN),即:
BA(Balanced Accuracy),即平衡准确率,它是针对准确率指标在不平衡数据集的一种改进。BA指标是综合考虑TPR(真阳率)和TNR(真阴率)这两个指标,即检测到患病占实际所有病患人数的比例以及检测到没病占实际所有健康患者人数的比例,其公式如下:
P-R Curve,即精确率-召回率曲线,其中横轴是召回率(TPR),纵轴是精确率(PPV)。PR曲线实质上是通过设置不同的阈值,最终将一系列的点汇聚起来连成一条线。我们知道,通过设置不同的阈值我们所划分的正样本或负样本均有所不同,一般来说将大于阈值的样本划分为正样本,而小于当前阈值的样本划分为负样本。需要注意的是,PR曲线对正负样本的比例异常敏感,即当正负样本的分布发生变化时,PR曲线的形状会发生巨大的变化。 ROC(Receiver Operating Characteristic) Curve,即受试者工作特性曲线,其来源于医学领域,起源于军事领域。ROC曲线的横轴为FPR,纵轴为TPR。与MCC一样,ROC实质上也同时考虑了混淆矩阵中的4个基准指标,因此它对于正负样本不均衡的情况下具有很强的鲁棒性,不容易受样本分布的波动而影响。其实ROC曲线跟P-R曲线一样,也是通过不断调整阈值来逐步产生不同的点,最后再将这些点连接起来便形成ROC曲线。
03
准确率(Accuracy)
召回率(TPR)& 精确率(PPV)
import numpy as np
from sklearn import metrics
# 真实值
y_true = np.array(['a']*65 + ['b']*60 + ['c']*100)
# 预测值
y_pred = np.array(
['a']*35 + ['b']*10 + ['c']*20 +
['a']*15 + ['b']*5 + ['c']*40 +
['a']*25 + ['b']*30 + ['c']*45
)
# 生成混淆矩阵
con_mat = metrics.confusion_matrix(y_true=y_true, y_pred=y_pred)
# 计算ACC
sk_acc = metrics.accuracy_score(y_true=y_true, y_pred=y_pred)
my_acc = (con_mat[0][0] + con_mat[1][1] + con_mat[2][2]) / np.sum(con_mat)
assert sk_acc == my_acc
# 计算Macro下的Precision
apple_pr = 35 / (35 + 40)
banana_pr = 5 / (5 + 40)
cherry_pr = 45 / (45 + 60)
my_macro_pr = (apple_pr + banana_pr + cherry_pr) / 3
sk_macro_pr = metrics.precision_score(y_true=y_true, y_pred=y_pred, average='macro')
assert my_macro_pr == sk_macro_pr
# 计算Macro下的Recall
apple_re = 35 / (35 + 30)
banana_re = 5 / (5 + 55)
cherry_re = 45 / (45 + 55)
my_macro_re = (apple_re + banana_re + cherry_re) / 3
sk_macro_re = metrics.recall_score(y_true=y_true, y_pred=y_pred, average='macro')
assert sk_macro_re == my_macro_re
# 计算各个类别相应的Weight
total_true_samples = (35 + 30) + (5 + 55) + (45 + 55)
apple_weight = (35 + 30) / total_true_samples
banana_weight = (5 + 55) / total_true_samples
cherry_weight = (45 + 55) / total_true_samples
# 计算Weighted下的Precision
my_weighted_pr = apple_pr * apple_weight + banana_pr * banana_weight + cherry_pr * cherry_weight
sk_weighted_pr = metrics.precision_score(y_true=y_true, y_pred=y_pred, average='weighted')
assert my_weighted_pr == sk_weighted_pr
# 计算Weighted下的Recall
my_weighted_re = apple_re * apple_weight + banana_re * banana_weight + cherry_re * cherry_weight
sk_weighted_re = metrics.recall_score(y_true=y_true, y_pred=y_pred, average='weighted')
assert my_weighted_re == sk_weighted_re
Random Over-sampling Technique,即随机过采样法。这种方法非常便于理解,也易于操作,即对数据集中的少数样本,通过简单的复制促使数据集达到平衡的一种手段。显然,这类方法很容易造成机器学习模型产生过拟合现象,因为对同一类样本进行简单的复制,其分布是不变的,模型会过度关注这类分布的数据,从而导致泛化性能下降。 SMOTE(Synthetic Minority Over-sampling Technique)[1],即人工合成少样本的过采样技术,它是对随机过采样法的一种改进算法。SMOTE的基本思路是针对不平衡数据中存在的少数类样本继续特定的分析,然后采用某种方式生成新样本,最后再将新的人工合成样本添加至原始的数据集中。其算法也是非常简单,下面简单梳理一下:
...
“强基固本”历史文章
神经网络结构下理解Logistic Regression &TF框架下构造Logistic实现Mnist分类
信息量、熵、相对熵(KL散度)、交叉熵
神经网络常用求导
深度学习算法收敛性证明之拓展SGD
看了这篇文章你还不懂SVM你就来打我
卷积神经网络(CNN)反向传播算法
边框回归(Bounding Box Regression)详解
《CV中的多视图几何》——相机模型与标定
AI 框架基础技术之自动求导机制 (Autograd)
主成分分析(PCA)
深度学习算法收敛性证明
深度学习:数学知识基础
从Binary到Swish——激活函数深度详解
“卷积”其实没那么难以理解
DNN加速器性能分析
更多强基固本专栏文章,
请点击文章底部“阅读原文”查看
分享、点赞、在看,给个三连击呗!