ITPub博客

首页 > 数据库 > 数据库开发技术 > 土哥带你详解ROC/AUC计算过程

土哥带你详解ROC/AUC计算过程

原创 数据库开发技术 作者:3分钟秒懂大数据 时间:2021-09-02 16:58:12 0 删除 编辑

标注并标星 3分钟秒懂大数据

每天1次,打卡阅读

获取AI大数据技术、面经、内推信息

在通过Flink设计评估策略时,其中涉及到一个机器学习中的AUC计算问题,就百度搜了一下,发现概念还挺复杂,于是详细了解了一下,写了下面的这篇文章。


要想了解什么是AUC,首先得了解什么是混淆矩阵和ROC曲线。


1

混淆矩阵



那什么是混淆矩阵呢? 其实就是把所有类别的预测结果与真实结果按类别放置到了同一个表里,形成一个矩阵,在这个矩阵中我们可以清楚看到每个类别正确识别的数量和错误识别的数量。


混淆矩阵中包含几个二分类问题中常用的概念:True Positive, False Positive, True Negative, False Negative。它们是根据真实类别与预测类别的组合来区分的。


假设有一批test样本,这些样本只有两种类别:正例和反例。机器学习算法预测类别如下图(左半部分预测类别为正例,右半部分预测类别为反例),而样本中真实的正例类别在上半部分,下半部分为真实的反例。


预测值为正例,记为P(Positive),预测值为反例,记为N(Negative)
预测值与真实值相同,记为T(True)预测值与真实值相反,记为F(False)
最后生成如下图:


TP:真实类别为1,且预测结果为1的样本个数,预测正确
FP:真实类别为0,且预测结果为1的样本个数,预测错误
TN:真实类别为0,且预测结果为0的样本个数,预测正确
FN:预测类别是1,且预测结果为0的样本个数,预测错误



2

ROC曲线



有混淆矩阵可以计算得到 ROC曲线的关键参数:TPR(真正率)和 FPR(假正率)。


计算公式如下:


TPR表示:将正例预测为正例的比例,FPR表示:将负例预测成正例的比例

ROC曲线以 TPR为Y轴,FPR为X轴,画出如下曲线图:


当TPR越趋近于1,证明真的被预测成真的概率越高

当FPR越趋近于1,证明假的被预测成真的的概率越高

而AUC是计算ROC曲线下的面经,要想面积大,就得TPR越大,FPR越小。


还有一个概念叫”截断点”。机器学习算法对test样本进行预测后,可以输出各test样本对某个类别的相似度概率。比如t1是P类别的概率为0.3,一般我们认为概率低于0.5,t1就属于类别N。这里的0.5,就是”截断点”。
总结一下,对于计算ROC,最重要的三个概念就是 TPR, FPR, 截断点。


Sklearn给出了一个计算ROC的例子。

y = np.array([0, 0, 1, 1])scores = np.array([0.1, 0.4, 0.35, 0.8])fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)

通过计算,得到的结果(TPR, FPR, 截断点)为:

fpr = array([ 0. ,  0.5,  0.5,  1. ])tpr = array([ 0.5,  0.5,  1. ,  1. ])thresholds = array([ 0.8 ,  0.4 ,  0.35,  0.1 ])#截断点

3

TPR,FPR 详细计算过程



上例给出的数据如下:

y = np.array([0, 0, 1, 1])scores = np.array([0.1, 0.4, 0.35, 0.8])fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)

用这个数据,计算TPR,FPR的过程是怎么样的呢?

1. 分析数据


y 是一个一维数组(样本的真实分类)。数组值表示类别(一共有两类,0和1)y_true = [0, 0, 1, 1]

score 即各个样本属于正例的概率。


2. 针对score,将数据排序


样本    预测属于P的概率(score)    真实类别

 

3. 将截断点依次取为score值


将截断点依次取值为0.1,0.35,0.4,0.8时,计算TPR和FPR的结果。

3.1 截断点为 0.1

说明 只要 score>=0.1,它的预测类别就是正例。

此时,因为4个样本的 score都大于等于0.1,所以,所有样本的预测类别都为P。

scores = [0.1, 0.4, 0.35, 0.8]y_true = [0, 0, 1, 1] y_pred = [1, 1, 1, 1]

   TPR = TP/(TP+FN) = 1   , FPR = FP/(TN+FP) = 1

3.2 截断点为0.35

说明只要score>=0.35,它的预测类别就是P。

此时,因为4个样本的score有3个大于等于0.35。所以,所有样本的预测类有3个为P(2个预测正确,1一个预测错误);1个样本被预测为N(预测正确)。

scores = [0.1, 0.4, 0.35, 0.8]y_true = [0, 0, 1, 1] y_pred = [0, 1, 1, 1]

TPR = TP/(TP+FN) = 1   FPR = FP/(TN+FP) = 0.5

3.3 截断点为0.4

说明只要score>=0.4,它的预测类别就是P。

此时,因为4个样本的score有2个大于等于0.4。所以,所有样本的预测类有2个为P(1个预测正确,1一个预测错误);2个样本被预测为N(1个预测正确,1一个预测错误)。

scores = [0.1, 0.4, 0.35, 0.8]y_true = [0, 0, 1, 1] y_pred = [0, 1, 0, 1]

TPR = TP/(TP+FN) = 0.5,FPR = FP/(TN+FP) = 0.5

3.4 截断点为0.8

说明只要score>=0.8,它的预测类别就是P。所以,所有样本的预测类有1个为P(1个预测正确);3个样本被预测为N(2个预测正确,1一个预测错误)。

scores = [0.1, 0.4, 0.35, 0.8]y_true = [0, 0, 1, 1] y_pred = [0, 0, 0, 1]

TPR = TP/(TP+FN) = 0.5,FPR = FP/(TN+FP) = 0


最后y 和score 计算出来的 tpr 和 fpr 如下:

y = np.array([0, 0, 1, 1])scores = np.array([0.1, 0.4, 0.35, 0.8])tpr  = [0.5,0.5,1,1]fpr =  [0,0.5,0.5,1]

将结果中的 FPR 与 TPR 画到二维坐标中,得到的ROC曲线如下(蓝色线条表示),ROC曲线的面积用AUC表示(淡黄色阴影部分)。

知道AUC的详细计算结果后,然后使用Java代码设计出AUC的计算方式,最终土哥完美实现了Flink评估策略 。

往期推荐


1.最完整的Flink面试大全,全文6万字,110个知识点,160张原理图
2.192本程序员必备书单,免费领取
3.新一代面向人工智能与大数据融合的分布式计算引擎Ray


原文作者:3分钟秒懂大数据;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-06-15

  • 博文量
    98
  • 访问量
    42100