分类模型评估之ROC-AUC曲线和PRC曲线

http://blog.csdn.net/pipisorry/article/details/51788927

ROC曲线和AUC

ROC(Receiver Operating Characteristic,接受者工作特征曲线)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣。博文介绍ROC和AUC的特点,讨论如何作出ROC曲线图以及计算AUC。

AUC是现在分类模型,特别是二分类模型使用的主要离线评测指标之一。相比于准确率、召回率、F1等指标,AUC有一个独特的优势,就是不关注具体得分,只关注排序结果,这使得它特别适用于排序问题的效果评估,例如推荐排序的评估。AUC这个指标有两种解释方法,一种是传统的“曲线下面积”解释,另一种是关于排序能力的解释。例如0.7的AUC,其含义可以大概理解为:给定一个正样本和一个负样本,在70%的情况下,模型对正样本的打分高于对负样本的打分(纵轴真阳率对于横轴假阳率)。可以看出在这个解释下,我们关心的只有正负样本之间的分数高低,而具体的分值则无关紧要。

用公式写就是:

其中P正指将该正样本预测为1的概率;P负指将该负样本预测为1的概率;

一个ROC曲线的示例

正如我们在这个ROC曲线的示例图中看到的那样,ROC曲线的纵坐标为真阳率true positive rate(TPR)(也就是recall),横坐标为假阳率false positive rate(FPR),这两个指标的分母都是相对真实label说的,TPR即真实正例中对的比例,FPR即真实负例中的错的比例。

接下来我们考虑ROC曲线图中的四个点和一条线

第一个点,(0,1),即FPR=0, TPR=1,这意味着FN(false negative)=0,并且FP(false positive)=0。Wow,这是一个完美的分类器,它将所有的样本都正确分类。

第二个点,(1,0),即FPR=1,TPR=0,类似地分析可以发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。

第三个点,(0,0),即FPR=TPR=0,即FP(false positive)=TP(true positive)=0,可以发现该分类器预测所有的样本都为负样本(negative)。

第四个点(1,1),分类器实际上预测所有的样本都为正样本。经过以上的分析,我们可以断言,ROC曲线越接近左上角,该分类器的性能越好。

下面考虑ROC曲线图中的虚线y=x上的点。这条对角线上的点其实表示的是一个采用随机猜测策略的分类器的结果(FP = TN, TP = FN,这样FP+TP = TN + FN,即Y = N,也就是随机猜测了),例如(0.5,0.5),表示该分类器随机对于一半的样本猜测其为正样本,另外一半的样本为负样本。

如何画ROC曲线

通过调整模型预测的阈值可以得到不同的点,将这些点可以连成一条曲线,这条曲线叫做接受者工作特征曲线(Receiver Operating Characteristic Curve,简称ROC曲线)。

对于一个特定的分类器和测试数据集,显然只能得到一个分类结果,即一组FPR和TPR结果,而要得到一个曲线,我们实际上需要一系列FPR和TPR的值,这又是如何得到的呢?我们先来看一下Wikipedia上对ROC曲线的定义:

In signal detection theory, a receiver operating characteristic (ROC), or simply ROC curve, is a graphical plot which illustrates the performance of a binary classifier system as its discrimination threshold is varied.

问题在于“as its discrimination threashold is varied”。如何理解这里的“discrimination threashold”呢?我们忽略了分类器的一个重要功能“概率输出”,即表示分类器认为某个样本具有多大的概率属于正样本(或负样本)。通过更深入地了解各个分类器的内部机理,我们总能想办法得到一种概率输出。通常来说,是将一个实数范围通过某个变换映射到(0,1)区间3

假如我们已经得到了所有样本的概率输出(属于正样本的概率),现在的问题是如何改变“discrimination threashold”?我们根据每个测试样本属于正样本的概率值从大到小排序。下图是一个示例,图中共有20个测试样本,“Class”一栏表示每个测试样本真正的标签(p表示正样本,n表示负样本),“Score”表示每个测试样本属于正样本的概率4

接下来,我们从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于图中的第4个样本,其“Score”值为0.6,那么样本1,2,3,4都被认为是正样本,因为它们的“Score”值都大于等于0.6,而其他样本则都认为是负样本。每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。这样一来,我们一共得到了20组FPR和TPR的值,将它们画在ROC曲线的结果如下图:

当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。

其实,我们并不一定要得到每个测试样本是正样本的概率值,只要得到这个分类器对该测试样本的“评分值”即可(评分值并不一定在(0,1)区间)。评分越高,表示分类器越肯定地认为这个测试样本是正样本,而且同时使用各个评分值作为threshold。我认为将评分值转化为概率更易于理解一些。

AUC值的计算

AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器的效果更好,而作为一个数值,对应AUC更大的分类器效果更好。

AUC的计算方法

        从上可知,计算的AUC也就是这些阶梯 下面的面积之和。我们先把score排序(假设score越大,此样本属于正类的概率越大),然后一遍扫描就可以得到我们想要的AUC。但是,这么 做有个缺点,就是当多个测试样本的score相等的时候,我们调整一下阈值,得到的不是曲线一个阶梯往上或者往右的延展,而是斜着向上形成一个梯形(比如0.6阈值对应的真实label有PPN,那么TPR和FPR都会变,形成梯形)。这样就需要计算这个梯形的面积,实际上是比较麻烦的。 

方法一:

AUC很有趣的性质是,它和Wilcoxon-Mann-Witney Test是等价的。Wilcoxon-Mann-Witney Test就是测试任意给一个正类样本和一个负类样本,正类样本的score有多大的概率大于负类样本的score。有了这个定义,我们就得到了另外一种计算AUC的办法:

在有M个正样本,N个负样本的数据集里。一共有M*N对样本(一对样本即,一个正样本与一个负样本)。统计这M*N对样本里,正样本的预测概率大于负样本的预测概率的个数。

其中 

方法二:

和上述方法是一样的,但是复杂度减小了。它也是

### 绘制ROC-AUC曲线 为了展示如何在Python中绘制ROC-AUC曲线,下面提供了一个完整的流程说明以及相应的代码示例。 #### 导入库准备数据 首先需要导入必要的库,并创建或加载一个二分类的数据集作为示例[^1]: ```python import numpy as np from sklearn.model_selection import train_test_split from sklearn.datasets import make_classification X, y = make_classification(n_samples=1000, n_features=20, n_classes=2, weights=[1, 1], random_state=1) train_x, test_x, train_y, test_y = train_test_split(X, y, test_size=0.3, random_state=2) ``` #### 构建模型与获取预测概率 接着构建逻辑回归模型来进行训练,并获得测试样本属于正类别的条件概率估计值: ```python from sklearn.linear_model import LogisticRegression lr = LogisticRegression() lr.fit(train_x, train_y) y_score = lr.predict_proba(test_x)[:, 1] ``` #### 计算FPR、TPR并绘图 之后计算假阳性率False Positive Rate (FPR),真阳性率True Positive Rate (TPR), 并使用`matplotlib`来绘制ROC曲线: ```python from sklearn.metrics import roc_curve fpr, tpr, threshold = roc_curve(test_y, y_score) import matplotlib.pyplot as plt plt.figure(figsize=(8,6)) plt.plot(fpr, tpr, lw=2, label='Logistic Regression') plt.plot([0, 1], [0, 1], color='navy', linestyle='--') # 对角线代表随机猜测的情况 plt.xlim([-0.05, 1.05]) plt.ylim([-0.05, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver Operating Characteristic Curve') plt.legend(loc="lower right") plt.show() ``` #### 计算AUC得分 最后一步是调用`roc_auc_score()`函数来得到AUC的具体数值,这反映了ROC曲线下方的总面积大小,其取值区间为[0,1],通常情况下大于0.5即认为具有一定的区分能力: ```python from sklearn.metrics import roc_auc_score auc_value = roc_auc_score(test_y, y_score) print("The AUC score is:", auc_value) ``` 上述过程展示了怎样基于给定的数据集,在Python环境中完成从建立模型到最终呈现ROC-AUC图形化结果的整体工作流。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值