前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习入门 10-6 精确率-召回率曲线

机器学习入门 10-6 精确率-召回率曲线

作者头像
触摸壹缕阳光
发布2020-05-13 14:11:07
3.1K0
发布2020-05-13 14:11:07
举报

即使慢,驰而不息,纵令落后,纵令失败,但一定可以达到他所向往的目标。

——鲁迅

全文字数:3200字

阅读时间:12分钟

前言

本系列是《玩转机器学习教程》一个整理的视频笔记。本小节主要介绍两个精准率-召回率曲线,其中一个是横坐标为选定的阈值,里面的两根曲线分别为对应阈值下的精准率和召回率,通过这个图可以帮助我们非常好的来选取我们想要的那个阈值。另外一个是横坐标为精准率,纵坐标为召回率,用于查看精准率和召回率的平衡点。

a

绘制Precision-Recall曲线

使用手写数字识别制作有偏的二分类数据集的过程和前几个小节一样,选择样本标签是否为9作为二分类是否为1的标准,接下来使用train_test_split将数据集划分为训练集和测试集,之后在训练集上训练逻辑回归算法,最后通过将X_test传入decision_function函数获得所有测试样本的分数值score(对于逻辑回归算法score = θT · xb) 。

通过上一小节的学习,我们知道decision_function(X_test)函数得到的是每一个测试样本在分类算法上计算的分数值score。在逻辑回归算法中默认分数值score是以0为判断标准的(threshold阈值 = 0):

  • 如果计算样本的score值 ≥ 0,就将这个样本分类为1;
  • 如果计算样本的score值 < 0,就将这个样本分类为0;

因此可以根据score值来调整threshold阈值进而影响精准率和召回率。在上一小节中,通过观察调整阈值与精准率和召回率的变化关系,可以看出精准率和召回率是相互牵制相互平衡的两个指标:

  • 当精准率升高的时候,召回率就会不可避免的降低;
  • 当召回率升高的时候,精准率也会不可避免的降低;

在这一小节使用可视化的方式更加形象的来看精准率和召回率这两个指标平衡制约的关系。

  • 定义两个命名为precisions和recalls的list空列表,其中precisions列表中用于存放在不同阈值上计算的精准率,recalls列表中用于存放在不同阈值上计算的召回率;
  • decision_function(X_test)函数计算测试集中每个样本的score值并存放到命名为decision_scores的数组中,找到decision_scores数组中的最大值和最小值,通过np.arange函数产生一个起点为np.min(decision_scores)终点为np.max(decision_scores)且固定步长为0.1的等差数列,命名为thresholds,thresholds数组中存放着所有选取的阈值;
  • 接下来就可以调用for循环,计算每个阈值下的精准率和召回率,然后将计算出来的精准率和召回率对应的添加到precisions和recalls列表中。

现在有了存放所有选取阈值的thresholds数组,以及thresholds数组中每一个阈值所对应的精准率和召回率的值 。有了这些准备,接下来就可以非常容易的绘制出两根曲线。

  • 绘制对应不同阈值时精准率和召回率的变化曲线。

其中蓝颜色的曲线代表的是精准率,精准率随着阈值的增大而逐渐增大。橙颜色的曲线代表的是召回率,召回率随着阈值的增大而逐渐的减小。

有了上面的曲线图,如果我们希望精准率保持90%以上,只需要找到蓝颜色的这根曲线横坐标为0.9时的纵坐标的位置,此时纵坐标的值对应的就是使精准率为90%时的阈值。类似的也可以找到指定召回率值时的阈值是多少。当我们希望分类结果的精准率、召回率或者精准率和召回率两个指标在某些指定值上时,就可以通过这种方式来找到对应横坐标上的阈值。

  • 绘制Precision-Recall曲线。

Precision-Recall曲线的绘制非常简单,横坐标轴表示精准率的值,纵坐标轴表示召回率的值。通过上面的绘制结果可以看出,这根曲线下降的趋势非常明显。换句话说,随着精准率逐渐增大召回率会逐渐的减小,这也再次印证了精准率和召回率是两个相互制约相互平衡的指标。

上图中红色标示的位置之前这根曲线都是缓缓下降的,然后在红色标示位置之后突然急剧的下降。这个急剧下降开始的位置点(红色标示的位置)可能就是相较于精准率和召回率一个最好的平衡位置。在这个位置之前,召回率下降的幅度并不大,而在这个位置之后,召回率将急剧的下降。

b

通过sklearn绘制曲线

在sklearn中可以直接调用precision_recall_curve函数来获取绘制曲线的数组。

首先从sklearn.metrics中import导入名为precision_recall_curve的函数,通过函数名也可以看出来这是一个用于绘制精准率和召回率曲线的函数。函数需要传入两个参数:

  • 第一个参数就是分类的真值y_test;
  • 第二个参数就是decision_function(X_test)函数计算出的所有测试样本的score值,即前面的decision_scores数组;

函数返回的三个值分别是precisions、recalls以及thresholds,返回的这三个值就是前面我们自己实现代码中的precisions、recalls以及thresholds。下面是就是前面我们自己实现的代码。

通过shape属性查看通过precision_recall_curve函数获得的三个数组的shape值。

通过precision_recall_curve函数返回的precisions数组的shape为(145, ),这里得到的145个元素是由sklearn中的precision_recall_curve函数自动定义的步长所决定的,precision_recall_curve函数会自动根据我们传入的参数值来选择最合适的步长,相对应的recalls数组也有145个元素。不过这里需要注意,thresholds数组中一共有144个元素,显然thresholds数组的元素个数要比precisions和recalls数组要少一个元素。

这里通过查看Sklearn官方文档来查明原因:

在最后精准率和召回率的值分别为1和0的时候,是没有对应的阈值的。这是precision_recall_surve函数定义的方式,需要注意一下。

同样的有了这三个数组就可以非常容易的绘制出之前绘制的两根曲线了。

  • 绘制对应不同的阈值时精准率和召回率的变化曲线。

这里由于thresholds数组中的元素比precisions和recalls数组少一个,因此在绘制的时候,需要把precisions和recalls数组中的最后一个元素值去掉。

对于通过precision_recall_curve函数绘制的曲线可以看出,在取threshold的时候,没有从decision_score中的最小值开始取,所以会和我们前面绘制的曲线有一些区别,这是因为在sklearn中封装的precision_recall_curve函数会自动寻找它认为最重要的那部分数据,也就是上图所绘制的部分。通过上面的图,依然可以看出精准率和召回率相互制约相互平衡的关系。

  • 绘制Precision-Recall曲线。

c

本节小结

最后来简单总结一下,首先绘制了横轴代表取不同的阈值,而相应的两根不同颜色的曲线分别是随着阈值的改变精确率和召回率两个指标的变化趋势。

通过上面的图可以找到合适的阈值,比如说希望精准率在95%以上,那么找到表示精准率的那根曲线的y值取0.95时候的x值,即是满足精准率为95%的阈值。或者如果希望召回率在95%以上,我们就可以找到表示召回率的那根曲线对应的y值取0.95时候的x值,即是满足召回率为95%的阈值。通过这个图可以帮助我们非常好的来选取我们想要的那个阈值。

另外一个图就是x轴是精准率而y轴是召回率。

这个图反映了精准率和召回率之间平衡的变化关系,那么对于这样的一个图,通常都会有一个曲线急剧下降的点,那么急剧下降的点通常很有可能就是我们精准率和召回率达到一个非常好的平衡点。通过上面的图可以看到这个最好的平衡点对应的精准率和召回率是多少,进一步可以来选择精准率和召回率达到平衡时的阈值。

最后值得一提的是,对于Precision-Recall曲线来说,整体是呈现下降趋势的,也就是y轴的recall值随着x轴的precision值的逐渐增大而减少。现在假设我们有两个算法或者对于同一个算法有两组超参数,每一个算法或者每一组超参数都对应一个Precision-Recall曲线。下图中的两根曲线分别表示两个算法。

"算法2"的Precision-Recall曲线包裹着"算法1"上的Precision-Recall曲线,很明显"算法2"要优于"算法1"。道理非常简单,因为在外面的这根曲线上对应的算法模型的每一个点的精准率和召回率的值都要比里面的这根曲线相应的精准率和召回率值要大。因此一个算法模型的Precision-Recall曲线越靠外的话,这个算法模型就越好,因此这中Precision-Recall曲线可以作为模型选择、算法选择、超参数选择的指标。对于这个指标,如果说里和外相对有些抽象,有的时候会用这根曲线和xy轴所围成的面积来看模型的好坏,围成的面积越大这个模型就越好。

虽然Precision-Recall曲线非常好理解,但是在大多数情况下我们不用Precision-Recall曲线的面积来衡量模型算法的优劣。我们会用一根非常著名的ROC曲线与xy轴所围成的面积来衡量模型算法的优劣。下一小节将会介绍ROC曲线。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-04-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI机器学习与深度学习算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档