当前位置: 刻度器 >> 刻度器资源 >> ROC都不会,回去等通知吧
上面的对应关系其实就是混淆矩阵了,现在引出(Truepositive)和(Falsepositive):
前者TPRate(也叫Sensitivity)即将TP除以TP所在列之和,表示在所有真实类别为1的样本(正样本)中,预测为真(1)的比例:后者FPRate(也叫Specificity)即将FP除以FP所在列之和,表示在所有真实类别为0的样本中(负样本),预测为真(1)的比例:
Part2ROC曲线登场
首先来看ROC曲线的定义,横轴为刚才的FPRate(伪阳率),纵坐标为TPRate(真阳率)。有一种特殊情况,横纵坐标这两个概率相等,即无论真实类别是1还是0,两者预测为1的概率相同(即对正负样本没啥区分能力),即如下直线:显然上面这种情况不是我们想要的,对正负样本还没啥区分能力,我们希望将真实类别为1的样本,正确预测为1的概率即TPRate,大于将真实类别为0的样本,预测为1的概率即FPRate,对应的ROC曲线就是往上拱的样子(而且越拱越好):
注意我们在画ROC曲线时是根据某个特定阈值下的TP率和FP率描点(坐标)的,和P-R曲线一样,ROC曲线也是通过遍历所有的阈值来绘制整条ROC曲线,如下图:
Part3几个栗子分析如果我们的模型分类结果如下:
样本的真实值预测值混淆矩阵如下:TPRate=3/4,FPRate=2/4,根据这个点画出对应ROC曲线如下,并且计算AUC面积为0.。而如果是利用逻辑回归预测结果如下(通过sigmoid函数输出对应的概率值):需要设置阈值,比如阈值取为0.5,小于0.5为0,否则为1的label,这样得到的混淆矩阵和栗子1的情况是一样的,当然也可以设置阈值为其他数。然后依次使用所有预测值作为阈值,得到一系列的TPRate、FPRate,在坐标上描点、连线得到ROC曲线。
Part4四、代码实现fromsklearnimportmetricsfromsklearn.metricsimportaucimportnumpyasnpy=np.array([1,1,2,2])scores=np.array([0.1,0.4,0.35,0.8])fpr,tpr,thresholds=metrics.roc_curve(y,scores,pos_label=2)metrics.auc(fpr,tpr)#0.75Part5ML常用评估指标准确率:分类正确的样本数占总样本的比例,即:.精度(精确率,Precision):预测为正且分类正确的样本占预测值为正的比例,即:
.召回率(Recall):预测为正且分类正确的样本占类别为正的比例,即:
.F1值:综合衡量精度和召回率,即:.ROC曲线:以假阳率为横轴,真阳率为纵轴画出来的曲线,曲线下方面积越大越好。
在推荐列表中,通常没有一个确定的阈值来把预测结果直接判定为正样本或负样本,而是采用TopN排序结果的精确率(Precision
N)和召回率(RecallN)来衡量排序模型的性能。具体操作,就是认为模型排序的前N个结果就是模型判定的正样本,然后分别计算PrecisionN和RecallN。(1)精确率和召回率其实是矛盾统一的一对指标:为了提高精确率,模型需要尽量在“更有把握”时把样本预测为正样本,但此时,我们往往会因为过于保守而漏掉很多“没有把握”的正样本,导致召回率降低。
(2)综合地反映精确率和召回率的高低的指标:F1-score。F1-score的定义是精确率和召回率的调和平均值,具体定义如下。F1-score的值越高,就证明模型在精确率和召回率的整体表现上越好。
Part6ML高阶评估指标1ROC曲线第二个高阶指标,ROC曲线,它也是一个非常常用的衡量模型综合性能的指标。
ROC曲线的全称是theReceiverOperatingCharacteristic曲线,中文名为“受试者工作特征曲线”。ROC曲线最早诞生于军事领域,而后在医学领域应用甚广,“受试者工作特征曲线”这一名称也正是来源于医学领域。
ROC曲线的横坐标是FalsePositiveRate(FPR,假阳性率),纵坐标是TruePositiveRate(TPR,真阳性率)。
和上面介绍精确度的介绍一样,这里的P指的是真实的正样本数量,N是真实的负样本数量;TP指的是P个正样本中被分类器预测为正样本的个数,FP指的是N个负样本中被分类器预测为正样本的个数。和P-R曲线一样,ROC曲线也是通过不断移动模型正样本阈值生成的。如上面的动图,垂线其实就是我们的阈值,当垂线从右到左移动时,右边ROC曲线上的点,从下往上移动。如果来固定阈值,我们也可以看到左图中,其实和混淆矩阵中四个值是对应的:
(1)栗子1ROC曲线的横轴是FPRate,纵轴是TPRate,当二者相等时,即y=x,如下图,这时候ROC曲线表示:对于不论真实类别是1还是0的样本,分类器预测为1的概率是相等的。
分类器对于正例和负例毫无区分能力,和抛硬币没什么区别,一个抛硬币的分类器是我们能想象的最差的情况,因此一般来说我们认为AUC的最小值为0.5(当然也存在预测相反这种极端的情况,AUC小于0.5,这种情况相当于分类器总是把对的说成错的,错的认为是对的,那么只要把预测类别取反,便得到了一个AUC大于0.5的分类器)。
在这里插入图片描述(2)栗子2假设测试集中一共有20个样本,模型的输出如下表所示,表中第一列为样本序号,Class为样本的真实标签,Score为模型输出的样本为正的概率,样本按照预测概率从高到低排序。在输出最终的正例、负例之前,我们需要指定一个阈值,并且设定预测概率大于该阈值的样本会被判为正例,小于该阈值的会被判为负例。
比如,我们指定0.9为阈值(又称为截断点),那么只有第一个样本会被预测为正例,其他全部都是负例。
接下来要做的就是动态地调整截断点,从最高的得分开始(实际上是从正无穷开始,对应着ROC曲线的零点),逐渐调整到最低得分。每一个截断点都会对应一个FPR和TPR的值,在ROC图上绘制出每个截断点对应的位置,再连接每个点之后,我们就能得到最终的ROC曲线了。
确定ROC曲线上的几个具体点:
(1)当截断点选择为正无穷的时候,模型会把全部样本预测为负例,那FP和TP必然都为0,FPRate和TPRate也都为0,因此曲线的第一个点就是(0,0)。
(2)当把截断点调整为0.9的时候,模型预测1号样本为正样本,并且这个样本也确实是正样本。因此,在20个样本中,当TP=1,所有正例数量P=10的时候,TPR=TP/P=1/10。
在表中观察,没有预测错的正样本,也就是说当FP=0,负样本总数N=10的时候,FPR=FP/N=0/10=0,对应着ROC图上的点(0,0.1)。
(3)更直观的绘制ROC曲线的方法(1)根据样本标签统计出正负样本的数量,假设正样本数量为P,负样本数量为N。然后,我们把横轴的刻度间隔设置为1/N,纵轴的刻度间隔设置为1/P。
(2)再根据模型输出的预测概率对样本进行从高到低的排序。
(3)依次遍历样本。
同时,从零点开始绘制ROC曲线,每遇到一个正样本就沿纵轴方向绘制一个刻度间隔的曲线,每遇到一个负样本就沿横轴方向绘制一个刻度间隔的曲线,直到遍历完所有样本,曲线最终停在(1,1)这个点,整个ROC曲线就绘制完成了。
在绘制完ROC曲线后,我们也可以像P-R曲线一样,计算出ROC曲线的AUC,AUC越高,推荐模型的效果就越好。
Part7思考题(1)P-R曲线和ROC曲线,它们的优缺点分别是什么呢?在正负样本分布极不均衡的情况下,你觉得哪个曲线的表现会更稳定、更权威一点?
ROC曲线。FPR=FP/N,TPR=TP/P,当我们将负样本复制10倍时,TPR显然不会变,FPR是负样本中被预测为正样本的比例,这其实也是不变的,那整个ROC曲线也就没有变。PR曲线,精确率P=TP/(TP+FP),TP不变,FP增大,而召回率R没有变,显然ROC曲线更稳定一些。
(2)在推荐系统中(如工业界用指标评估排序列表结果),有哪些常用指标呢?
CMU搜索引擎课程中教授提到MAP和NDCG最常用,后者效果也最好,因为它考虑到了每个数的实际相关性和模型预测出的排序顺序。具体的NDCG及栗子在下次文章讲解~
Part8Reference[1]ThephilosophicalargumentforusingROCcurves[2]西瓜书周志华[3]深度学习王喆
野猪佩琪