0

我嘗試計算f1_score,但是當我使用sklearn f1_score方法時,我得到了一些警告。如何計算多分數分類的F1分數?

我有一個預測多標籤5類問題。

import numpy as np 
from sklearn.metrics import f1_score 

y_true = np.zeros((1,5)) 
y_true[0,0] = 1 # => label = [[1, 0, 0, 0, 0]] 

y_pred = np.zeros((1,5)) 
y_pred[:] = 1 # => prediction = [[1, 1, 1, 1, 1]] 

result_1 = f1_score(y_true=y_true, y_pred=y_pred, labels=None, average="weighted") 

print(result_1) # prints 1.0 

result_2 = f1_score(y_true=y_ture, y_pred=y_pred, labels=None, average="weighted") 

print(result_2) # prints: (1.0, 1.0, 1.0, None) for precision/recall/fbeta_score/support 

當我使用的average="samples"代替"weighted"我得到(0.1,1.0,0.1818 ......,無)。 "weighted"選項對多標籤問題沒有用處,或者如何正確使用f1_score方法?

使用average="weighted"時,我也得到一個警告:

「UndefinedMetricWarning:召回和F-分數是不明確的和被設置爲0.0的標籤沒有真正樣本」

回答

1

它的工作原理,如果你稍加起來數據:

y_true = np.array([[1,0,0,0], [1,1,0,0], [1,1,1,1]]) 
y_pred = np.array([[1,0,0,0], [1,1,1,0], [1,1,1,1]]) 

recall_score(y_true=y_true, y_pred=y_pred, average='weighted') 
>>> 1.0 
precision_score(y_true=y_true, y_pred=y_pred, average='weighted') 
>>> 0.9285714285714286 

f1_score(y_true=y_true, y_pred=y_pred, average='weighted') 
>>> 0.95238095238095244 

數據表明我們沒有錯過任何真陽性,並沒有任何預測的假陰性(recall_score等於1)。然而,我們預測第二次觀察中的一個誤報導致precision_score等於0.93。

因爲precision_scorerecall_score都不爲零,所以weighted參數f1_score因此存在。我相信你的情況是無效的,因爲在這個例子中缺乏信息。

+0

嗨我的數組與np.zeros((1,5))有形狀(1,5)我剛剛寫了一個評論給一個例子如何一個樣本看起來像但它是實際的形式像這樣[[1 ,0,0,0,0] ...]。問題是f1_score與平均值=「微」/「宏」一起工作,但它不與「加權」。所以我的問題是「權重」選項不適用於多標籤,還是必須在f1_score函數中設置其他選項,如標籤/ pos_label。 –

+0

請閱讀答案。您無法使用形狀爲(1,5)的目標變量。在這種情況下,即使'微'或'宏'平均,你的'f1_score'也不起作用。 –

+0

當我使用ravel來獲得形狀(5,)時,它將一個值作爲一個樣本使用,因此它不適用於多標籤,例如當我嘗試使用平均值=「樣本」的形狀時,出現錯誤「基於樣本的精度,回憶,fscore在多標籤分類之外無效」。我得到了微觀和宏觀形狀(1,5)的工作結果(它們是正確的)唯一的問題是選項average =「weighted」 –