【机器学习】AUC计算

参考:https://blog.csdn.net/u013385925/article/details/80385873

AUC是ROC曲线下的面积

首先,介绍一下ROC曲线的绘制

ROC曲线

ROC曲线的横轴表示真正例率TPR,纵轴表示假正例率FPR
T P R = T P T P + F N TPR = \frac{TP} {TP + FN} TPR=TP+FNTP F P R = F P F P + T N FPR = \frac{FP} {FP + TN} FPR=FP+TNFP

可以简化为如下形式:
T P R = T P P TPR = \frac{TP} {P} TPR=PTP F P R = F P N FPR = \frac{FP} {N} FPR=NFP
P表示所有样本中正例总数
N表示所有样本中负例总数
TP判断为正例的样本中判断正确的总数
FP判断为正例的样本中判断错误的总数


ROC曲线根据不同阈值下的TPR和FPR绘制,每个阈值对应一组TPR和FPR,即对应ROC曲线上的一点
在这里插入图片描述
阈值如何选取呢?

阈值依次取每个样本的score,即依次将每个样本判断为正例,计算TPR和FPR,绘制ROC曲线(具体步骤在下面)

AUC

AUC:随机选取一个正例和一个负例,正样本的预测值大于负样本的概率.

在这里插入图片描述
在这里插入图片描述
AUC是ROC曲线下的面积,可以通过计算曲线下面积估算,但算法麻烦,不可取。

AUC计算

在有限样本中我们常用的得到概率的办法就是通过频率来估计之。

取m个正例和n个负例,可以组成m * n个正负例对。考虑每一对正负例,若正例的预测值大于负例,加1;若相等,加0.5。
A U C = 1 m n ∑ x + ∈ D + ∑ x − ∈ D − ( I ( f ( x + ) > f ( x − ) ) + 1 2 I ( f ( x + ) = f ( x − ) ) ) \mathrm{AUC}=\frac{1}{m n} \sum_{\boldsymbol{x}^{+} \in D^{+}} \sum_{\boldsymbol{x}^{-} \in D^{-}}\left(\mathbb{I}\left(f\left(\boldsymbol{x}^{+}\right)>f\left(\boldsymbol{x}^{-}\right)\right)+\frac{1}{2} \mathbb{I}\left(f\left(\boldsymbol{x}^{+}\right)=f\left(\boldsymbol{x}^{-}\right)\right)\right) AUC=mn1x+D+xD(I(f(x+)>f(x))+21I(f(x+)=f(x)))

其他变形可参考:AUC计算方法

实现

def roc_auc_score(true, scores):
    count = 0
    data = list(zip(true, scores))
    positives = list(filter(lambda x: x[0] == 1, data))
    negatives = list(filter(lambda x: x[0] == 0, data))

    for positive in positives:
        for negative in negatives:
            if positive[1] > negative[1]:
                count += 1
            elif positive[1] == negative[1]:
                count += 0.5
    return count / (len(positives) * len(negatives))

# for test
import numpy as np
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print(roc_auc_score(y_true, y_scores))

sklearn库中提供了计算工具,只需提供真实值和预测值即可

import numpy as np
from sklearn.metrics import roc_auc_score

y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
print(roc_auc_score(y_true, y_scores))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值