作者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://www.ptt.cc/bbs/DataScience/M.1558154603.A.C61.html
推 liton: 建議你倒出csv,自己在畫一遍,實際感受一下數據 05/18 13:37
→ sxy67230: Precision 分母為0,代表你的預測完全沒正例,這樣分母 05/18 15:05
→ sxy67230: 就是0,你可能要檢查你的testset或是模型。然後是的,沒 05/18 15:05
→ sxy67230: 錯,sklearn 簡化了一些方便計算,所以你用AP跟pr_auc 05/18 15:05
→ sxy67230: 的值不會完全相同,但是可以接受的近似解。一般來說,理 05/18 15:05
→ sxy67230: 想上,類別平衡的PR_curve會是跟ROC類似的圖形,只是左 05/18 15:05
→ sxy67230: 右相反。 05/18 15:05
→ disney82231: 但在畫pr curve時,總有個門檻值使得precision的分 05/19 02:06
→ disney82231: 母0,所以pr curve都是從左上角開始畫 05/19 02:06
→ sxy67230: 喔喔喔,我以為是你直接算Precision 問說是0的情形,PR_ 05/19 08:46
→ sxy67230: curve左邊會有一條凸起到1的算正常,只要整體形狀如我前 05/19 08:46
→ sxy67230: 面說的一樣跟ROC比較就可以知道是否是有類別不平衡的狀 05/19 08:46
→ sxy67230: 況。PR_curve越接近右上越接近F1_score等於1.0的情形 05/19 08:46
→ disney82231: 好,我了解了,非常謝謝你 05/19 12:22