基础知识
- 统计项
- TP:预测y‘=1,预测正确,即实际y=1
- FP:预测y‘=1,预测错误,即实际y=0
- FN:预测y‘=0,预测错确,即实际y=1
- TN:预测y‘=0,预测正确,即实际y=0
- P代表预测结果为1,N代表预测结果为0,T代表预测正确,F代表预测错误
- 1代表正样本,0代表负样本,本文后续不做说明
- sklearn.metrics.confusion_matrix可以直接输出上述统计项,输出格式是:
预测0 | 预测1 | |
---|---|---|
实际0 | TN | FP |
实际1 | FN | TP |
-
统计指标
指标 名称 统计方式 概率表示 python acc 准确率 (TP+TN)/(TP+FP+FN+TN) sklearn.metrics.accuracy_score precision 精准率,精确率,查准率 TP/(TP+FP) p(y=1|y’=1) sklearn.metrics.precision_score TPR(recall) 召回率,真阳率,真正率,查全率,灵敏度 TP/(TP+FN) p(y’=1|y=1) sklearn.metrics.recall_score FPR 假阳率,假正率,1-特异度 FP/(FP+TN) p(y’=1|y=0) TNR 特异度,真负率 TN/(FP+TN) p(y’=0|y=0) FNR 假负率 FN/(TP+FN) p(y’=0|y=1) - 要注意准确率(acc)和精确率(precision)的差别,只一字之差,但含义完全不一样,前者是所有样本的预测准确率,而后者只是看正样本的预测精确率
- sklearn.metrics.classification_report,可以直接输出precision,recall,F1(下面说明),以及support(相应类别的样本数)
综合评价指标
-
F1值
- F 1 = 2 ∗ p r e c i s i o n ∗ r e c a l l / ( p r e c i s i o n + r e c a l l ) F1=2 * precision * recall/(precision+recall) F1=2∗precision∗recall/(precision+recall),查全率和查准率的调和平均值,两个值同时大的时候,F1才会值比较大
- 业务解释
- 高精度(查准率)+高召回率(查全率):模型能够很好地检测该类;
- 高精度(查准率)+低召回率(查全率):模型不能很好地检测该类,但是在它检测到这个类时,判断结果是高度可信的;
- 低精度(查准率)+高召回率(查全率):模型能够很好地检测该类,但检测结果中也包含其他类的点;
- 低精度(查准率)+低召回率(查全率):模型不能很好地检测该类。
- sklearn.metrics.f1_score
from sklearn.metrics import f1_score print(f1_score(y_true, y_pred))
-
ROC曲线
- 横坐标:FPR(假阳率);纵坐标:TPR(recall,真阳率)
- 计算方式:先将样本按照模型输出的概率进行降序排序,然后从大到小选择阈值(根据样本的输出概率值,大于阈值的为正样本,小于的则为负样本),每次选择一个阈值就可以根据该阈值计算当前的TPR和FPR,于是得到了一个ROC曲线的点。
- ROC-AUC(一般简称AUC):ROC曲线下面的面积,可用于表达该模型在不同阈值的情况下的综合效果。ROC曲线的对角线(此时AUC=0.5)代表的是随机猜测的效果,此时正负样本在每个阈值分段范围内都是均匀分布的,即数量相同)。ROC-AUC代表着分别随机从正负样本集中抽取一个正样本,一个负样本,正样本的预测值大于负样本的概率。具体计算ROC-AUC值有更简洁的办法,参考AUC计算方法总结
from sklearn.metrics import roc_curve from sklearn.metrics import roc_auc_score import matplotlib.pyplot as plt fpr, tpr, thresholds = roc_curve(y, scores, pos_label=1) # pos_label可用于指定正样本 plt.plot(tpr,fpr) # 画ROC曲线 print(roc_auc_score(y, scores, pos_label=1)) # 计算ROC-AUC值
-
PRC曲线(或者叫PR曲线)
- 横坐标:TPR(recall);纵坐标:precision
- PRC-AUC(可简称PR值):PRC曲线下方的面积也可以用来代表模型效果,实际sklearn中的实现并不是计算的真的面积。
- average_precision_score
from sklearn.metrics import average_precision_score from sklearn.metrics import precision_recall_curve import matplotlib.pyplot as plt precisions,recalls,thresholds=precision_recall_curve(y_true,y_score, pos_label=1) plt.plot(precisions,recalls) # 画PR曲线 print(average_precision_score(y_true,y_score, pos_label=1)) # 计算PRC-AUC,实际上计算的是AP(average precision)值
-
PRC-AUC VS ROC-AUC
- PRC-AUC会受到正负比例的影响,即模型不变的情况下,测试样本的正负比例会影响其值,而ROC-AUC不会。
- 在正负比例不平衡的情况下,ROC-AUC会给出相对乐观的估计,而PRC-AUC不会。此时ROC-AUC也可以用于模型对比
- PRC-AUC比ROC-AUC更好,本质上不是因为样本数量不平衡,而是损失函数L(y,y’)中L(y=0,y’=0)=0 ,也就是true negative是没有价值的(曲线不同位置的面积并不能简单等价)。这种情况你需要做的是明确你需要的recall/precision的 tradeoff应该是多少,这种情况下当然PRC更好用。
- 直观理解:ROC曲线的横轴采用FPR,纵轴采用TPR,在类别不平衡的背景下,当负例N的数量远超正例P时,FP的大幅增长只能换来FPR的微小改变,而TPR跟负样本无关。结果是虽然大量负例被错判成正例,在ROC曲线上却无法直观地看出来,因此给出了一个非常乐观的估计。(当然也可以只分析ROC曲线左边一小段)
-
多分类中average参数的使用
- 二分类中该参数会被忽略
- 宏平均(macro):先对每个类别单独计算目标值(如F1),再取这些值的算术平均值作为全局指标。
- 微平均(micro):先累加计算各个类别的TP、TN、FP、FN的值,再由这些值求出目标值(如F1)
- 由两种平均的计算方式不难看出,宏平均平等对待每一个类别,所以它的值主要受到稀有类别的影响,而微平均平等考虑每个样本,所以它的值受到常见类别的影响比较大
指标选择
一切都要以业务优化方向为指导目标,脱离业务谈指标基本上都是耍无赖
- 所有样本都要求准确,重要性完全一样:用准确率acc
- 更看重正样本的召回率,那么召回率大于精确率(查全率)(或大于指定业务阈值)作为限制条件,再比较F1(模型筛选阶段使用PR值作为参考)。比如欺诈检测
- 更看重正样本的精确率(查全率),那么精确率(查全率)大于召回率(或大于指定业务阈值)作为限制条件,再比较F1(模型筛选阶段使用PR值作为参考)。比如垃圾邮件过滤
- 如果最终业务目标是排序,那么选择ROC-AUC。比如点击率预估
- 如果最终的业务出现正负比例随着时间(或其他因素)变化,那么选择ROC-AUC。比如点击率预估
参考文献
精确率、召回率、F1 值、ROC、AUC 各自的优缺点是什么?
pr-curve
机器学习之类别不平衡问题 (2) —— ROC和PR曲线
分类问题模型的评估
如何理解机器学习和统计中的AUC?
评估分类模型
AUC计算方法总结