調整分類模型的閾值是改變模型對正負類的預測標準的一種方法,常用于提高精確率、召回率或者其他性能指標。以下是如何調整分類閾值的步驟和方法:
PS:閾值是針對預測概率(表示樣本屬于某個特定類別的可能性)來說的
調整分類的閾值步驟和方法:
-
理解閾值的作用:
- 分類模型通常輸出一個概率值(0到1之間),表示樣本屬于正類的可能性。
- 默認閾值通常設為0.5,即如果概率值大于0.5,預測為正類;否則預測為負類。
- 調整閾值可以改變模型對正負類的預測標準,從而影響假陽性和假陰性率。
-
增大閾值:精確率增加,召回率減少
-
減少假陽性(False Positive, FP):
- 定義:假陽性是指模型預測為正類,但實際為負類的情況。
- 解釋:增大閾值意味著模型要求更高的置信度才會將樣本預測為正類。因此,一些原本在默認閾值下被預測為正類(但實際為負類)的樣本,在更高的閾值下會被重新預測為負類,從而減少假陽性的數量。
-
增加假陰性(False Negative, FN):
- 定義:假陰性是指模型預測為負類,但實際為正類的情況。
- 解釋:增大閾值意味著一些原本在默認閾值下被正確預測為正類的樣本,在更高的閾值下可能會被預測為負類。因此,模型會錯過一些實際為正類的樣本,從而增加假陰性的數量。
-
舉例說明
假設我們有一個模型的輸出概率如下(數值為示例):
樣本 實際標簽 預測概率 預測 A 正類 0.8 正類 真陽性 B 負類 0.6 正類 假陽性(減少假陽) C 正類 0.4 負類 假陰性 D 負類 0.3 負類 真陰性 E 正類 0.7 正類 真陽性(增加假陰) 默認閾值為 0.5 時:
- 樣本 A、B、E 被預測為正類。
- 樣本 C、D 被預測為負類。
-
此時,假陽性為 1(樣本 B),假陰性為 1(樣本 C)。
如果我們將閾值增大到 0.7:
- 樣本 A、E 被預測為正類。
- 樣本 B、C、D 被預測為負類。
-
此時,假陽性減少到 0(樣本 B 不再是假陽性),但假陰性增加到 2(樣本 C 和 E)。
-
-
減小閾值:精確率減少,召回率增加
-
增加真陽性率(Recall):
- 定義:真陽性率是指模型正確識別正類樣本的比例。
- 解釋:降低閾值會使模型更容易將樣本預測為正類,因此能夠捕捉更多的真正類(正類)樣本,從而提高真陽性率。
-
增加假陽性率(False Positive Rate):
- 定義:假陽性率是指模型錯誤地將負類樣本預測為正類的比例。
- 解釋:降低閾值會導致模型將一些本應為負類的樣本錯誤地預測為正類,因此會增加假陽性率。
-
降低精確率(Precision):
- 定義:精確率是指模型預測為正類的樣本中實際為正類的比例。
- 解釋:降低閾值會增加將樣本預測為正類的數量,但其中一部分樣本可能是假陽性,因此會降低精確率。
-
影響模型的決策邊界:
- 解釋:閾值決定了模型在將樣本分類為正類或負類時所依據的概率界限。降低閾值會放寬模型對于正類的判定標準,使得更多的樣本被預測為正類。
-
示例說明
假設我們有一個分類模型,對于一些樣本的預測概率如下:
樣本 實際標簽 預測概率 預測標簽(閾值=0.5) 預測標簽(閾值=0.3) A 正類 0.8 正類 正類 B 負類 0.3 負類 正類 C 正類 0.6 正類 正類 D 負類 0.2 負類 正類 E 正類 0.7 正類 正類 通過降低閾值(例如從0.5降至0.3):
- 樣本 B 和 D 被重新預測為正類,因為它們的預測概率超過了0.3。
- 這樣做會增加真陽性率(Recall),但可能也會增加假陽性率(False Positive Rate),因為更多的負類樣本被錯誤地預測為正類。同時,精確率(Precision)可能會下降,因為模型更容易將樣本預測為正類,導致一些預測為正類的樣本實際上是假陽性。
-
-
選擇最佳閾值:
- 使用ROC曲線(Receiver Operating Characteristic Curve)和AUC(Area Under the Curve):
- ROC曲線繪制了不同閾值下的真陽性率(召回率)與假陽性率的關系。
- AUC值越大,模型性能越好。
- 使用精確率-召回率曲線P-R(Precision-Recall Curve):
- 繪制了不同閾值下的精確率與召回率的關系。
- 在平衡精確率和召回率時,這條曲線非常有用。
- 使用ROC曲線(Receiver Operating Characteristic Curve)和AUC(Area Under the Curve):
實際操作示例
假設我們使用Python和Scikit-learn庫來調整分類閾值:
import numpy as np
from sklearn.metrics import precision_recall_curve, roc_curve# 假設 y_true 是真實標簽,y_scores 是模型輸出的概率值
y_true = np.array([0, 1, 1, 0, 1, 0, 1, 1, 0, 0])
y_scores = np.array([0.1, 0.4, 0.35, 0.8, 0.65, 0.7, 0.2, 0.9, 0.55, 0.3])# 計算不同閾值下的精確率和召回率
precision, recall, thresholds = precision_recall_curve(y_true, y_scores)# 計算不同閾值下的假陽性率和真陽性率(用于繪制ROC曲線)
fpr, tpr, roc_thresholds = roc_curve(y_true, y_scores)# 選擇一個新的閾值,例如0.5
new_threshold = 0.5
y_pred = (y_scores >= new_threshold).astype(int)# 計算新的精確率和召回率
new_precision = np.sum((y_pred == 1) & (y_true == 1)) / np.sum(y_pred == 1)
new_recall = np.sum((y_pred == 1) & (y_true == 1)) / np.sum(y_true == 1)print(f"New Precision: {new_precision}")
print(f"New Recall: {new_recall}")
小結
通過調整分類閾值,可以在精確率和召回率之間進行權衡,以滿足不同的應用需求。實際操作中,可以使用精確率-召回率曲線和ROC曲線來幫助選擇最佳的閾值,從而優化模型的性能。