1、精确率(precision):
精确率表示的是预测为正的样本中有多少是真正的正样本,包括把正类预测为正类(TP),和把负类预测为正类(FP),即,
精确率=TPTP+FP精确率=\frac{TP}{TP+FP}精确率=TP+FPTP
2、召回率(Recall):
召回率表示的是正样本中被预测正确的概率,包括把正类预测成正类(TP),和把正类预测为负类(FN),即,
召回率=TPTP+FN召回率=\frac{TP}{TP+FN}召回率=TP+FNTP
3、准确率(accuracy):
ACC=(TP+TN)/(TP+TN+FP+FN)
准确率=TP+TNTP+TN+FP+FN准确率=\frac{TP+TN}{TP+TN+FP+FN}准确率=TP+TN+FP+FNTP+TN
4、F1-Score:精确率和召回率的调和均值
5、ROC曲线
ROC曲线:接收者操作特征(receiver operating characteristic),ROC曲线上每个点反映着对同一信号刺激的感受性。
横轴: 负正类率(False Postive Rate)
FPR=FPFP+TNFPR=\frac{FP}{FP+TN}FPR=FP+TNFP
FPR就是在所有反例中被模型误判为正例的样本所占比率
纵轴: 真正类率(True Postive Rate)
TPR=TPTP+FNTPR=\frac{TP}{TP+FN}TPR=TP+FNTP
TPR的直观理解就是在所有正例中被模型预测为正例的样本所占比率。TPR其实就是召回率。
设置阈值之后根据阈值可以画出ROC曲线
6、AUC计算
AUC是ROC曲线与x轴围成的面积,越大说明分类器的效果越好。
这个指标想表达的含义,简单来说其实就是随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。
计算AUC时,推荐2个方法。
方法一:
在有M个正样本,N个负样本的数据集里。一共有MN对样本(一对样本即,一个正样本与一个负样本)。统计这MN对样本里,正样本的预测概率大于负样本的预测概率的个数。
方法二:
另外一个方法就是利用下面的公式:
这里参考博客:https://blog.youkuaiyun.com/qq_22238533/article/details/78666436
(写的非常清楚)
例题:(58同城2020秋招笔试原题)
预测实验里,测试集合的lable是[0,0,0,1,1,1],模型的输出值是[0.2,0.8,0.65,0.7,0.9,0.6],那么这个模型在该测试集合上的AUC是(?)
answer:2/3约等于0.67
之前做笔试题遇到写AUC程序实现的,这里写了一个python版本的,供大家参考以下 :
import sys
import numpy as np
def roc_auc(lables, preds):
n_pos = sum(lables)
n_neg = len(lables) - n_pos
total_pair = n_pos * n_neg
lables_preds = zip(lables, preds)
lables_preds = sorted(lables_preds, key=lambda x: x[1])
neg = 0
pair = 0
for i in range(len(lables_preds)):
if lables_preds[i][0] == 1:
pair += neg
else:
neg += 1
return pair / float(total_pair)
if __name__ == "__main__":
n = int(input()) #先输入共几对数据
y = []
y_proba = []
for i in range(n):
line2 = sys.stdin.readline().strip()
a, b = line2.split() # 每一行输入两个数,第一个数为标签值,第二个数为概率值
y.append(int(a))
y_proba.append(float(b))
# y = np.array([1, 0, 1, 1, 0, 1, 0, 0, 1, 0])
# y_proba = np.array([0.9, 0.7, 0.6, 0.55, 0.52, 0.4, 0.38, 0.35, 0.31, 0.10])
print(roc_auc(y, y_proba))