通俗講解P(查准率),R(查全率),F1值

作者zenRRan 來源:公眾號深度學習自然語言處理

一、怎麼來的?

我們平時用的精度accuracy,也就是整體的正確率

acc=predict_right_num/predict_num

這個雖然常用,但不能滿足所有任務的需求。比如,因為香蕉太多了,也不能撥開人工的一個一個的看它的好壞(我愛吃啊,想想就心疼),此時我們就需要有一種方法,代替撥開香蕉這種粗魯的手段。這時我們需要通過一些測試,看看哪種方法能更加準確的預測。我們可以通過

「准」:預測的準確度,就是我預測的結果中真正好的香蕉要越多越好;

「全」:就是所有的好的香蕉預測出來的越多越好,雖然把有些壞的也預測是好的了,那也不管,「全」就行。

其實這兩者都想要達到就好了,但是不行的:

比如"准",我就預測一個算了,好的香蕉肯定比壞的比例高,也就是我只預測一個,100%比例幾率最大了,這時就不「全」了,海域好多好的不能都當成壞的扔了吧。。

再比如"全",我去全部預測成好的這真正好的都在我的預測里,也就是100%。可是這時的"准"就賊不準了。。

所以就必須來平衡這倆同志的關係了,怎麼平衡呢?肯定是通過權重來的呀,此時,F值登上歷史舞台!

二、啥意思捏?

實例化講解吧。比如我們的香蕉中 1 表示好的,0表示壞的,有10個香蕉:

gold : [ 1,1,1,1,1,0,0,0,0,0 ]

pred: [ 1,0,1,1,1,1,1,0,0,0 ]

注釋:gold是現實的好壞;pred是預測的好壞。

P(Precision) 查准率:就是上面說的"准"。字面意思好理解呀,就是在預測當中查找準確個數的比例。公式為:

P=真正預測準確的數量/預測是準確的數量 = 4 / 6

R(Recall) 查全率:就是上面的"全"。根據字面理解,在預測中看看真正預測對的佔全有對的比率。公式為:

R=真正預測準確的數量/所有真正好的數量 = 4 / 5

F值是:

F(k)=(1+k)*P*R/((k*k)*P+R)

注釋:k>0 度量了 查全率 對 查准率 的相對重要性。k>1查全率有更大影響;k<1查准率有更大影響。

在這個實例中可以表示為:k>1就是查全率有更大影響,就是好的香蕉最好都預測出來,因為你覺得不想把好的當成壞的扔點( 真可惜,我愛吃啊 ) ;

k<1查准率有更大影響,就是一定要準確,省時間,省力更重要,不在乎好的香蕉當壞的扔點。

而我們常用的是F1,就是F(1)的意思,k=1,比如我們做一個分類任務,這幾個類覺得都一樣重要。此時:

F(1)=2*P*R/(P+R)=(2*4/6*5/6)/(4/6+5/6)=40/54

三、代碼實現

這裡用核心的代碼幫助上述理解!

我還是用上面的例子:

gold : [ 1,1,1,1,1,0,0,0,0,0 ]

pred: [ 1,0,1,1,1,1,1,0,0,0 ]

我們以數組中為1的index下標作為標籤,那麼gold的是[0,1,2,3,4]裡面的數值代表原始數據為1對應的下標值。

predict的是[0,2,3,4,5,6]

我們來編程求解它的F值!代碼如下:

def cal_f(gold, predict): p_numerator, r_numerator = 0., 0. for entity in predict: if entity in gold: p_numerator += 1 for entity in gold: if entity in predict: r_numerator += 1 return p_numerator, r_numeratorgold = [0,1,2,3,4]predict = [0,2,3,4,5,6]p_denominator = len(predict)r_denominator = len(gold)p_numerator, r_numerator = cal_f(gold, predict)precision = p_numerator / p_denominatorrecall = r_numerator / r_denominatorf1 = 2 * precision * recall / (precision + recall)print("f value:{0}".format(f1))

結果如下:

講解到這,應該講的很詳細了!


推薦閱讀:

技術站搬運工:來自BrianWang的技術站:PCA的一大數學基礎:求矩陣的特徵值特徵向量
python3機器學習經典實例-第三章預測模型11
關鍵詞提取Part1(A Quick Review)
機器學習入門筆記3
為什麼我們需要傳統方法?

TAG:自然語言處理 | 機器學習 |