作者disney82231 (小刀会序曲)
看板DataScience
标题Re: [问题] Precision-Recall curve
时间Sat May 18 12:43:19 2019
※ 引述《sxy67230 (charlesgg)》之铭言:
: ※ 引述《disney82231 (小刀会序曲)》之铭言:
: : 一般在二元分类下,我们可以用ROC下面积(即AUC)来判断模型好坏
: : 但当资料不平衡情况下时,通常是画Precision-Recall curve
: : 但是Precision-Recall curve有办法计算出类似AUC的东西吗?
: : 如果没有办法,单纯用PR curve是不是无法比较模型好坏?
: : 我的认知是PR curve会根据不同的指标分数跟资料而有不同的形状
: : 所以没有办法计算出曲面下面积
: : 这样的想法是对的吗?
: : 谢谢
: 工程上的解释:
: ROC在不平衡类上,TPR主要的影响就是正例,FPR则是负例,所以ROC本质上就是一个相对
: 曲线的评估方法,所以其实正负例增加的分布下,0.5的threshold在座标上也是相对移动
: ,所以ROC很好判断模型好坏标准,高於0.5就可以说他不错。那我们求取他的AUC呢?其
: 实物理意义就是我随机抽取一个正负例,正确判断出正例的机率。
: PR在Recall跟Precision都是受到正例影响,所以本身就很容易受到不平衡的影响,如果
: 今天不平衡类有变动,那你的评估threshold在PR上就会不同。那如果求取PR的AUC意义又
: 跟ROC不太相同了,因为Recall跟Percision都是正例,所以意义就是你每次取正例正确被
: 分类的机率,就是平均精确度(AP)。
: 数学上AP的公式就是
: https://i.imgur.com/d2kytp9.jpg
: P就是Precision,r就是Recall,所以本质意义就是你对所有Recall的Percision做积分,
: 那不就是你PR curve求AUC吗?
: 当然,你实作sklearn的时候会发现你直接求AP跟你做PR在做AUC结果有点不同,是因为sk
: learn官方文件公式是长这样
: https://i.imgur.com/IrK7HTk.jpg
: delta r是Recall的变化率
: 画成图做比较就是
: https://i.imgur.com/eXFMug3.jpg
: 蓝色是sklearn 求取的面积,红色是PR curve,看得出来其实就是在求approximately 而
: 已,这样的好处就是避免PR曲线扰动太大的近似算法而已。
: 以上是小弟理解的物理意义有错还请纠正
大大你好,非常感谢你的回覆,讲解的很清楚,
但对於python sklearn的average percision我还是有些疑问
在average percision documentation.中有一个例子为
import numpy as np
from sklearn.metrics import average_precision_score
y_true = np.array([0, 0, 1, 1])
y_scores = np.array([0.1, 0.4, 0.35, 0.8])
average_precision_score(y_true, y_scores)
0.83
但用precision_recall_curve去画图
precision, recall, _ = precision_recall_curve(y_true, y_scores)
plt.plot( recall,precision)
https://imgur.com/a/XK2IPej
从图来看曲线下面积不是0.83,这是因为python 是用近似算法算出来的所以跟实际上会有落差吗?
另外PR curve会有固定的pattern或者形状吗?
以下是我用另外两笔笔资料画出来的
https://imgur.com/a/mMNVtot
https://imgur.com/a/MGUO4zi
这形状真的是..
最後,我发现当precision为 0/0时 python 会计算成1,是因为分类正确才当成1吗?
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.185.36.210
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/DataScience/M.1558154603.A.C61.html
1F:推 liton: 建议你倒出csv,自己在画一遍,实际感受一下数据 05/18 13:37
2F:→ sxy67230: Precision 分母为0,代表你的预测完全没正例,这样分母 05/18 15:05
3F:→ sxy67230: 就是0,你可能要检查你的testset或是模型。然後是的,没 05/18 15:05
4F:→ sxy67230: 错,sklearn 简化了一些方便计算,所以你用AP跟pr_auc 05/18 15:05
5F:→ sxy67230: 的值不会完全相同,但是可以接受的近似解。一般来说,理 05/18 15:05
6F:→ sxy67230: 想上,类别平衡的PR_curve会是跟ROC类似的图形,只是左 05/18 15:05
7F:→ sxy67230: 右相反。 05/18 15:05
8F:→ disney82231: 但在画pr curve时,总有个门槛值使得precision的分 05/19 02:06
9F:→ disney82231: 母0,所以pr curve都是从左上角开始画 05/19 02:06
10F:→ sxy67230: 喔喔喔,我以为是你直接算Precision 问说是0的情形,PR_ 05/19 08:46
11F:→ sxy67230: curve左边会有一条凸起到1的算正常,只要整体形状如我前 05/19 08:46
12F:→ sxy67230: 面说的一样跟ROC比较就可以知道是否是有类别不平衡的状 05/19 08:46
13F:→ sxy67230: 况。PR_curve越接近右上越接近F1_score等於1.0的情形 05/19 08:46
14F:→ disney82231: 好,我了解了,非常谢谢你 05/19 12:22