機器學習 Fbeta-Measure 指標詳解

在江西VTE風險預測和山東案件自動分發比賽中,筆者見到了F2-Score評估指標,此類指標與以往F1-Score不同,出題方選擇使用不同的beta權重來更加側重Precision或者Recall某一指標,所以在實際中常常需要根據具體情況做出取捨,例如一般的搜索情況,在保證召回率的條件下,儘量提升精確率。而像癌症檢測、地震檢測、金融欺詐等,則在保證精確率的條件下,儘量提升召回率。

爲了讓加深我們印象,這裏我們把直接放上關於精確率和召回率的解釋,如果大家忘記的話,以後不妨來多看看

  • 精確率是針對我們預測結果而言的,它表示的是預測爲正的樣本中有多少是真正的正樣本。
  • 召回率是針對我們原來的樣本而言的,它表示的是樣本中的正例有多少被預測正確了。

Fbeta指標簡介

Fbeta-measure 是一種可配置的單分指標,用於根據對正類的預測來評估二元分類模型。

Fbeta-measure 是使用精度和召回率計算的。

精度是計算正類的正確預測百分比的指標。Recall計算所有可能做出的正面預測中正面類別的正確預測的百分比。最大化精度將最小化假陽性錯誤,而最大化召回將最小化假陰性錯誤。

的F值被計算爲的精確度和召回的調和平均,每一種有相同的加權。它允許使用單個分數同時考慮精度和召回來評估模型,這在描述模型的性能和比較模型時很有幫助。

所述Fbeta是F值增加了β的配置參數的概括。默認的 beta 值爲 1.0,這與 F-measure 相同,也就是我們常見的F1-Score。較小的 Beta 值,例如 0.5,在計算分數時賦予精度更高的權重而較少召回率,而較大的 Beta 值(例如 2.0)賦予精度較低的權重和較高的召回率權重。
F-Score=(1+\beta ^2)\cdot \frac {Precision\cdot Recall} {\beta^2\cdot Precision + Recall}
當準確率和召回率都很重要,但需要側重其中一個時,例如當假陰性比假陽性更重要時,或者相反時,Fbtea將會是一個很有用的指標。

精確率和召回率

在我們深入研究 Fbeta指標之前,我們還是要回顧用於評估分類模型所做預測的精確率和召回率度量的基礎知識。

混淆矩陣

【混淆矩陣】總結了通過爲每個類的模型進行的預測,和到這些預測實際上屬於的類的數量,它有助於瞭解模型產生的預測錯誤的類型。

最簡單的混淆矩陣是針對二類分類問題,具有負(0 類)和正(1 類)類。在這種類型的混淆矩陣中,表格中的每個單元格都有一個特定且易於理解的名稱,總結如下:

               | Positive Prediction | Negative Prediction
Positive Class | True Positive (TP)  | False Negative (FN)
Negative Class | False Positive (FP) | True Negative (TN)

精確率和召回率指標是根據混淆矩陣中的單元格定義的,特別是像真陽性和假陰性這樣的術語。

精確率

精確率是一種量化正確預測數量的指標。它的計算方法是正確預測的正例的個數除以預測的正例總數。
precision= TruePositives / (TruePositives + FalsePositives)
結果是一個介於 0.0(無精度)和 1.0(完全或完美精度)之間的值。精確率的直覺是它不關心假陰性,它最大限度地減少了假陽性。我們可以用下面的一個小例子來證明這一點。

# 導入
from sklearn.metrics import precision_score
# no precision
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
score = precision_score(y_true, y_pred)
print('No Precision: %.3f' % score)
# 一些假陽性
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
score = precision_score(y_true, y_pred)
print('Some False Positives: %.3f' % score)
# 一些假陰性
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1]
score = precision_score(y_true, y_pred)
print('Some False Negatives: %.3f' % score)
# 完美精確率
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
score = precision_score(y_true, y_pred)
print('Perfect Precision: %.3f' % score)

運行示例演示了計算所有不正確和所有正確預測類標籤的精度,分別顯示無精度(精確率爲0)和完美精度(精確率爲1)。預測某些錯誤正樣本的示例顯示精確率會顯著下降,突出表明該指標與最小化false positives有關。預測一些假陰性的示例顯示出100%的精確率,突出表明該度量與假陰性無關

No Precision: 0.000
Some False Positives: 0.714
Some False Negatives: 1.000
Perfect Precision: 1.000

召回率

Recall 是一個度量從可能做出的所有正面預測中做出的正確正樣本預測的數量。

它的計算方法是正確預測的正例的比率除以可預測的正例總數。
Recall= TruePositives / (TruePositives + FalseNegatives)
結果是一個介於 0.0(無召回)和 1.0(完全或完美召回)之間的值。

召回的直覺是它不關心 false positives,它最大限度地減少了false negatives。我們可以用下面的一個小例子來證明這一點。

# intuition for recall
from sklearn.metrics import recall_score
# 沒有召回
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
score = recall_score(y_true, y_pred)
print('No Recall: %.3f' % score)
# 一些假陽性
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
score = recall_score(y_true, y_pred)
print('Some False Positives: %.3f' % score)
# 一些假陰性
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1]
score = recall_score(y_true, y_pred)
print('Some False Negatives: %.3f' % score)
# 完美召回
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
score = recall_score(y_true, y_pred)
print('Perfect Recall: %.3f' % score)

運行該示例演示了計算所有不正確和所有正確預測類別標籤的召回率,分別顯示無召回率和完美召回率。預測某些誤報的正樣本示例顯示了完美的召回率,突出表明該度量與假陽性無關。預測一些假陰性的示例顯示召回率下降,突出表明該措施與最小化假陰性有關。

No Recall: 0.000
Some False Positives: 1.000
Some False Negatives: 0.600
Perfect Recall: 1.000

現在我們熟悉了精確率和召回率,讓我們回顧一下 F-measure。

F-measure

準確率和召回率衡量了正類可能出現的兩種錯誤類型。
最大限度地提高精確率可以最大限度地減少假陽性,最大限度地提高召回率可以最大限度地減少假陰性。
F-Measure 或 F-Score 提供了一種將精度和召回率結合到一個能夠同時捕獲這兩個屬性的度量中的方法。

F-Measure = (2 * Precision * Recall) / (Precision + Recall)

這是兩個精確率和召回率的調和平均值

結果是一個介於最差 F 測量的 0.0 和完美 F 測量的 1.0 之間的值。

F-measure 的直覺是這兩個度量在重要性上是平衡的,只有良好的精度和良好的召回率共同導致良好的 F-measure。

最差情況

首先,如果所有樣本都被剛好錯誤預測,我們的精度和召回率將爲零,從而導致 F-measure 爲零;例如:

# worst case f-measure
from sklearn.metrics import f1_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
# no precision or recall
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)
f = f1_score(y_true, y_pred)
print('No Precision or Recall: p=%.3f, r=%.3f, f=%.3f' % (p, r, f))

運行該示例,我們可以看到在最壞情況下的 F 度量中沒有任何精度或召回率。

No Precision or Recall: p=0.000, r=0.000, f=0.000

最好情況

相反,完美的預測將導致完美的精確度和召回率,進而獲得完美的 F 度量,例如:

# best case f-measure
from sklearn.metrics import f1_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
# perfect precision and recall
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)
f = f1_score(y_true, y_pred)
print('Perfect Precision and Recall: p=%.3f, r=%.3f, f=%.3f' % (p, r, f))

運行這個例子,我們可以看到完美的精度和召回導致完美的 F-measure。

Perfect Precision and Recall: p=1.000, r=1.000, f=1.000

50% 準確率,100%召回

不可能有完美的精確度而沒有召回,或者沒有精確度和完美的召回。準確率和召回率都需要預測真陽性。考慮我們爲所有情況預測正類的情況。這將爲我們提供 50% 的準確率,因爲一半的預測是誤報。它會給我們完美的回憶,因爲我們不會出現假陰性。對於我們在示例中使用的平衡數據集,一半的預測是真陽性,一半是假陽性;因此,精度比將爲 0.5% 或 50%。將 50 感知精度與完美召回相結合將導致懲罰 F 度量,特別是介於 50% 和 100% 之間的調和平均值。
下面的示例演示了這一點。

# perfect precision f-measure
from sklearn.metrics import f1_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
# 50% precision, 100% recall
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)
f = f1_score(y_true, y_pred)
print('Result: p=%.3f, r=%.3f, f=%.3f' % (p, r, f))

運行這個例子證實 50 的精確率和完美的召回率,並且 F 分數的結果約爲 0.667。

Result: p=0.500, r=1.000, f=0.667

Fbeta-Measure

F-measure 平衡了準確率和召回率。

在某些問題上,我們可能對更加關注精度的 F 度量感興趣,例如當假陽性更重要以最小化時,但假陰性仍然很重要。
在其他問題上,我們可能對更關注召回的 F 度量感興趣,例如當假陰性更重要以最小化時,但假陽性仍然很重要。

解決方案是 Fbeta-Measure。

Fbeta 度量是 F 度量的抽象,其中調和均值計算中的精度和召回率的平衡由稱爲beta的係數控制。

  • Fbeta = ((1 + beta^2) * Precision * Recall) / (beta^2 * Precision + Recall)

beta 參數的選擇將用於 Fbeta-measure 的名稱。

例如,beta 值爲 2 被稱爲 F2-measure 或 F2-score。Beta 值爲 1 被稱爲 F1-measure 或 F1-score。

beta 參數的三個常見值如下:

  • F0.5-Measure (beta=0.5):在精度上的權重更大,召回的權重更小。
  • F1-Measure (beta=1.0):平衡準確率和召回率的權重。
  • F2-Measure (beta=2.0):精度權重較小,召回權重較大

起初,不同 beta 值對計算的影響並不直觀。讓我們仔細看看這些例子中的每一個。

F1-measure

上一節中討論的 F-measure 是Beta值爲 1的 Fbeta-measure 的示例。具體來說,F-measure和F1-measure計算的東西是一樣的;例如:

F-Measure = ((1 + 1^2) * Precision * Recall) / (1^2 * Precision + Recall)
F-Measure = (2 * Precision * Recall) / (Precision + Recall)

考慮我們有 50 %精確率和100%召回率的情況。我們可以手動計算這種情況下的 F1 度量,如下所示:

F-Measure = (2 * Precision * Recall) / (Precision + Recall)
F-Measure = (2 * 0.5 * 1.0) / (0.5 + 1.0)
F-Measure = 1.0 / 1.5
F-Measure= 0.666

我們可以使用scikit-learn 中的fbeta_score() 函數將“ beta ”參數設置爲 1.0來確認這個計算.下面列出了完整的示例。

# calculate the f1-measure
from sklearn.metrics import fbeta_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
# perfect precision, 50% recall
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)
f = fbeta_score(y_true, y_pred, beta=1.0)
print('Result: p=%.3f, r=%.3f, f=%.3f' % (p, r, f))

這個 F1-measure 值 0.667 與上面中計算的 F-measure 相匹配。

Result: p=0.500, r=1.000, f=0.667

F0.5-Measure

F0.5-measure 是Beta值爲 0.5的 Fbeta-measure 的一個示例。它具有提高精確率的重要性和降低召回率的重要性的效果。如果最大化精確率最小化假陽性且最大化召回率最小化假陰性,那麼F0.5 度量更關注最小化假陽性而不是最小化假陰性。

F0.5-Measure 計算如下:

F0.5-Measure = ((1 + 0.5^2) * Precision * Recall) / (0.5^2 * Precision + Recall)
F0.5-Measure = (1.25 * Precision * Recall) / (0.25 * Precision + Recall)

考慮我們有 50% 的準確率和完美召回率的情況。我們可以手動計算這種情況下的 F0.5 度量,如下所示:

F0.5-Measure = (1.25 * Precision * Recall) / (0.25 * Precision + Recall)
F0.5-Measure = (1.25 * 0.5 * 1.0) / (0.25 * 0.5 + 1.0)
F0.5-Measure = 0.625 / 1.125
F0.5-Measure = 0.555

我們預計 0.5 的 beta 值會導致這種情況下的得分較低,因爲精確率得分較低且召回率非常好。這正是我們所看到的,對於 F1 分數計算爲 0.667 的相同場景,F0.5 度量達到了 0.555。精確率在計算中發揮了更大的作用。我們可以確認這個計算;下面列出了完整的示例。

# calculate the f0.5-measure
from sklearn.metrics import fbeta_score
from sklearn.metrics import f1_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
# perfect precision, 50% recall
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)
f = fbeta_score(y_true, y_pred, beta=0.5)
print('Result: p=%.3f, r=%.3f, f=%.3f' % (p, r, f))

運行該示例確認精度和召回值,然後報告 F0.5 測量值爲 0.556(四捨五入),與我們手動計算的值相同。

Result: p=0.500, r=1.000, f=0.556

F2-measure

F2-measure 是Beta值爲 2.0的 Fbeta-measure 的一個示例。它具有降低精度重要性和增加召回重要性的效果。如果最大化精度最小化誤報,最大化召回率最小化漏報,那麼F2 度量更關注最小化漏報而不是最小化誤報。

F2-measure 計算如下:

F2-Measure = ((1 + 2^2) * Precision * Recall) / (2^2 * Precision + Recall)
F2-Measure = (5 * Precision * Recall) / (4 * Precision + Recall)

考慮我們有 50% 的準確率和完美召回率的情況。我們可以手動計算這種情況下的 F2 度量,如下所示:

F2-Measure = (5 * Precision * Recall) / (4 * Precision + Recall)
F2-measure  = (5 * 0.5 * 1.0) / (4 * 0.5 + 1.0)
F2-measure  = 2.5 / 3.0
F2-measure  = 0.833

我們預計2.0的beta值會在這種情況下導致更高的分數,因爲召回有一個完美的分數,這將比精度表現不佳的分數更高。正是我們看到的,對於 F1 分數計算爲 0.667 的相同場景,F2 度量達到 0.833。召回在計算中發揮了更大的作用。我們可以確認這個計算;下面列出了完整的示例。

# calculate the f2-measure
from sklearn.metrics import fbeta_score
from sklearn.metrics import f1_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
# perfect precision, 50% recall
y_true = [0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
y_pred = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
p = precision_score(y_true, y_pred)
r = recall_score(y_true, y_pred)
f = fbeta_score(y_true, y_pred, beta=2.0)
print('Result: p=%.3f, r=%.3f, f=%.3f' % (p, r, f))

運行該示例確認精度和召回值,然後報告 F2-measure 爲 0.883,與我們手動計算的值相同(四捨五入)。

Result: p=0.500, r=1.000, f=0.833
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章