天天看点

Python 数据分析实例——RoC分析

作者:昌华量化
Python 数据分析实例——RoC分析

在机器学习的算法评估中,尤其是分类算法评估中,经常听到精确率(Precision)与召回率(Recall)、RoC曲线与PR曲线这些概念,这些概念到底有什么用处呢?首先,需要理解几个拗口的概念。

1.TP、FP、TN和FN

· True Positives(TP):预测为正样本,实际也为正样本的特征数。

· False Positives(FP):预测为正样本,实际为负样本的特征数。

· True Negatives(TN):预测为负样本,实际也为负样本的特征数。

· False Negatives(FN):预测为负样本,实际为正样本的特征数。

听起来还是很费劲,不过我们用一幅图就很容易理解了。如图1所示(参看下载资源中给出的图),左侧的半圆就是TP,右侧的半圆就是FP,左侧的灰色长方形(不包括左侧的半圆)就是FN。右侧的浅灰色长方形(不包括右侧的半圆)就是TN。两个半圆组成的圆内代表我们分类得到模型结果,右侧的是正值的样本。

Python 数据分析实例——RoC分析

图1 TP、FP、TN和FN示意图

2.精确率、召回率与特异性

精确率的定义从图1可以看出,是左侧的半圆除以两个半圆组成的圆。严格的数学定义如下:

Python 数据分析实例——RoC分析

召回率的定义也可以从图1看出,是左边半圆除以左边的长方形。严格的数学定义如下:

Python 数据分析实例——RoC分析

特异性(Specificity)的定义不能从图1看出,这里给出,是右边长方形去掉右边红色半圆部分后除以右边的长方形。严格的数学定义如下:

Python 数据分析实例——RoC分析

有时用一个F1值来综合评估精确率和召回率,它是精确率和召回率的调和均值。当精确率和召回率都高时,F1值也会高。严格的数学定义如下:

Python 数据分析实例——RoC分析

有时我们对精确率和召回率并不是一视同仁,比如有时更加重视精确率。我们用一个参数β来度量两者之间的关系。如果β>1,召回率就有更大影响;如果β<1,精确率就有更大影响。自然,当β=1的时候,精确率和召回率的影响力相同,和F1的形式一样。含有度量参数β的F1记为Fβ,严格的数学定义如下:

Python 数据分析实例——RoC分析

此外,还有灵敏度(True Positive Rate,TPR),它是所有实际正例中正确识别的正例比例,和召回率的表达式没有区别。严格的数学定义如下:

Python 数据分析实例——RoC分析

特异度(False Positive Rate,FPR)是实际负例中错误地识别为正例的负例比例。严格的数学定义如下:

Python 数据分析实例——RoC分析

熟悉了精确率、召回率和特异性,以及TPR和FPR,后面的RoC曲线和PR曲线就好理解了。

3.ROC曲线

ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(Binary Classifier)的优劣。

需要提前说明的是,我们这里只讨论二值分类器。对于分类器,或者说分类算法,评价指标主要有Precision、Recall、F-score以及ROC和AUC。图2所示是一个ROC曲线的示例。

Python 数据分析实例——RoC分析

图2 ROC曲线示例

正如上面ROC曲线的示例图中看到的那样,ROC曲线的横坐标为FPR(False Positive Rate),纵坐标为TPR(True Positive Rate)。以TPR为y轴,以FPR为x轴,就直接得到了ROC曲线。从FPR和TPR的定义可以理解,TPR越高,FPR越小,模型和算法就越高效。也就是画出来的ROC曲线越靠近左上越好。图3详细说明了FPR和TPR是如何定义的。

Python 数据分析实例——RoC分析

图3 混淆矩阵和通用性能指标

接下来考虑ROC曲线图中的4个点和一条线。第一个点:(0,1),即FPR=0,TPR=1,这意味着FN=0,并且FP=0。这是一个完美的分类器,它将所有的样本都正确分类。第二个点:(1,0),即FPR=1,TPR=0,分析发现这是一个最糟糕的分类器,因为它成功避开了所有的正确答案。第三个点:(0,0),即FPR=TPR=0,也就是FP=TP=0,可以发现该分类器预测所有的样本都为负样本(Negative)。类似的,第四个点:(1,1),分类器实际上预测所有的样本都为正样本。经过以上分析,我们可以断言,ROC曲线越接近左上角,该分类器的性能越好。考虑ROC曲线图中的虚线y=x上的点,这条对角线上的点其实表示的是一个采用随机猜测策略的分类器的结果,例如(0.5,0.5),表示该分类器随机对于一半的样本猜测其为正样本,另一半的样本为负样本。

对于一个特定的分类器和测试数据集,显然只能得到一个分类结果,即一组FPR和TPR结果,而要得到一个曲线,实际上需要一系列FPR和TPR的值。

既然已经有这么多评价标准,为什么还要使用ROC和AUC呢?因为ROC曲线有一个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(Class Imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间发生变化。

【例1】二分类问题中的ROC曲线。

Python 数据分析实例——RoC分析

输出结果如图4所示。

Python 数据分析实例——RoC分析

图4 鸢尾花(iris)数据二分类问题中的ROC曲线

实验环境是Anaconda 3 Spyder(Python 3.6)。