AUC
類別keras.metrics.AUC(
num_thresholds=200,
curve="ROC",
summation_method="interpolation",
name=None,
dtype=None,
thresholds=None,
multi_label=False,
num_labels=None,
label_weights=None,
from_logits=False,
)
逼近 ROC 或 PR 曲線的 AUC(曲線下面積)。
ROC(接收者操作特徵;預設)或 PR(精確度召回)曲線的 AUC(曲線下面積)是二元分類器的品質衡量標準。與準確度不同,且類似於交叉熵損失,ROC-AUC 和 PR-AUC 會評估模型的所有操作點。
此類別使用黎曼和逼近 AUC。在指標累積階段,預測會根據值累積在預定義的桶中。然後透過內插每個桶的平均值來計算 AUC。這些桶定義了評估的操作點。
此指標會建立四個區域變數 true_positives
、true_negatives
、false_positives
和 false_negatives
,這些變數用於計算 AUC。為了離散化 AUC 曲線,使用線性間隔的一組閾值來計算召回率和精確度值的配對。因此,ROC 曲線下的面積是使用召回率值的高度乘以假陽性率來計算,而 PR 曲線下的面積是使用精確度值的高度乘以召回率來計算。
此值最終會以 auc
的形式傳回,這是一個等冪運算,用於計算精確度與召回率值的離散曲線下的面積(使用上述變數計算)。num_thresholds
變數控制離散化的程度,閾值數量越大,越能逼近真正的 AUC。逼近的品質可能會因 num_thresholds
而有很大差異。thresholds
參數可用於手動指定閾值,以更均勻地分割預測。
為了獲得真實 AUC 的最佳逼近值,predictions
應該在大約 [0, 1]
範圍內均勻分佈(如果 from_logits=False
)。如果情況並非如此,AUC 逼近的品質可能會很差。將 summation_method
設定為「minoring」或「majoring」可以透過提供 AUC 的下限或上限估計值來幫助量化逼近中的誤差。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
引數
200
。'ROC'
(預設)或 'PR'
代表精確度召回曲線。ROC
。對於 PR-AUC,內插(真/假)陽性,但不內插精確度(請參閱 Davis & Goadrich 2006 了解詳細資訊);「minoring」對於增加的間隔應用左求和,對於減少的間隔應用右求和;「majoring」則相反。num_thresholds
參數。值應介於 [0, 1]
之間。等於 {-epsilon
, 1+epsilon
} 的端點閾值,對於一個小的正 epsilon 值,將會自動包含這些,以便正確處理完全等於 0 或 1 的預測。False
時)是否應在計算 AUC 之前將資料扁平化為單一標籤。在後一種情況下,當將多標籤資料傳遞給 AUC 時,每個標籤-預測配對都會被視為個別的資料點。對於多類別資料,應設定為 False
。multi_label
為 True 時使用。如果未指定 num_labels
,則會在第一次呼叫 update_state
時建立狀態變數。multi_label
為 True 時,權重會應用於個別標籤 AUC,然後將其平均以產生多標籤 AUC。當它是 False 時,它們會用於加權扁平資料上計算混淆矩陣中的個別標籤預測。請注意,這與 class_weights
不同,因為 class_weights
會根據範例的標籤值來加權範例,而 label_weights
僅取決於扁平化之前該標籤的索引;因此 label_weights
不應用於多類別資料。update_state
中的 y_pred
)是機率還是 sigmoid logits。根據經驗法則,當使用 keras 損失時,損失的 from_logits
建構子引數應與 AUC from_logits
建構子引數相符。範例
>>> m = keras.metrics.AUC(num_thresholds=3)
>>> m.update_state([0, 0, 1, 1], [0, 0.5, 0.3, 0.9])
>>> # threshold values are [0 - 1e-7, 0.5, 1 + 1e-7]
>>> # tp = [2, 1, 0], fp = [2, 0, 0], fn = [0, 1, 2], tn = [0, 2, 2]
>>> # tp_rate = recall = [1, 0.5, 0], fp_rate = [1, 0, 0]
>>> # auc = ((((1 + 0.5) / 2) * (1 - 0)) + (((0.5 + 0) / 2) * (0 - 0)))
>>> # = 0.75
>>> m.result()
0.75
>>> m.reset_state()
>>> m.update_state([0, 0, 1, 1], [0, 0.5, 0.3, 0.9],
... sample_weight=[1, 0, 0, 1])
>>> m.result()
1.0
搭配 compile()
API 使用
# Reports the AUC of a model outputting a probability.
model.compile(optimizer='sgd',
loss=keras.losses.BinaryCrossentropy(),
metrics=[keras.metrics.AUC()])
# Reports the AUC of a model outputting a logit.
model.compile(optimizer='sgd',
loss=keras.losses.BinaryCrossentropy(from_logits=True),
metrics=[keras.metrics.AUC(from_logits=True)])
Precision
類別keras.metrics.Precision(
thresholds=None, top_k=None, class_id=None, name=None, dtype=None
)
計算預測相對於標籤的精確度。
此指標會建立兩個區域變數 true_positives
和 false_positives
,這些變數用於計算精確度。此值最終會以 precision
的形式傳回,這是一個等冪運算,只會將 true_positives
除以 true_positives
和 false_positives
的總和。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
如果設定了 top_k
,我們會計算精確度,方法是計算批次項目中具有最高預測值的 top-k 個類別中,平均而言有多少個類別是正確的,並且可以在該項目的標籤中找到。
如果指定了 class_id
,我們會透過僅考慮批次中 class_id
高於閾值且/或在 top-k 個最高預測中的項目,並計算其中 class_id
實際上是正確標籤的比例來計算精確度。
引數
[0, 1]
之間。將閾值與預測值進行比較,以判斷預測的真值(即,高於閾值為 True
,低於閾值為 False
)。如果與設定 from_logits=True
的損失函數一起使用(即,未對預測套用 sigmoid),則應將 thresholds
設定為 0。會為每個閾值產生一個指標值。如果未設定 thresholds
也未設定 top_k
,則預設會以 thresholds=0.5
計算精確度。[0, num_classes)
內,其中 num_classes
是預測的最後一個維度。範例
>>> m = keras.metrics.Precision()
>>> m.update_state([0, 1, 1, 1], [1, 0, 1, 1])
>>> m.result()
0.6666667
>>> m.reset_state()
>>> m.update_state([0, 1, 1, 1], [1, 0, 1, 1], sample_weight=[0, 0, 1, 0])
>>> m.result()
1.0
>>> # With top_k=2, it will calculate precision over y_true[:2]
>>> # and y_pred[:2]
>>> m = keras.metrics.Precision(top_k=2)
>>> m.update_state([0, 0, 1, 1], [1, 1, 1, 1])
>>> m.result()
0.0
>>> # With top_k=4, it will calculate precision over y_true[:4]
>>> # and y_pred[:4]
>>> m = keras.metrics.Precision(top_k=4)
>>> m.update_state([0, 0, 1, 1], [1, 1, 1, 1])
>>> m.result()
0.5
搭配 compile()
API 使用
model.compile(optimizer='sgd',
loss='binary_crossentropy',
metrics=[keras.metrics.Precision()])
搭配 from_logits=True
的損失使用
model.compile(optimizer='adam',
loss=keras.losses.BinaryCrossentropy(from_logits=True),
metrics=[keras.metrics.Precision(thresholds=0)])
Recall
類別keras.metrics.Recall(
thresholds=None, top_k=None, class_id=None, name=None, dtype=None
)
計算預測相對於標籤的召回率。
此指標會建立兩個區域變數 true_positives
和 false_negatives
,這些變數用於計算召回率。此值最終會以 recall
的形式傳回,這是一個等冪運算,只會將 true_positives
除以 true_positives
和 false_negatives
的總和。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
如果設定了 top_k
,則會計算召回率,方法是計算批次項目的標籤中,平均而言有多少個類別在 top-k 個預測中。
如果指定了 class_id
,我們會透過僅考慮批次中標籤中包含 class_id
的項目,並計算其中 class_id
高於閾值且/或在 top-k 個預測中的比例來計算召回率。
引數
[0, 1]
之間。將閾值與預測值進行比較,以判斷預測的真值(即,高於閾值為 True
,低於閾值為 False
)。如果與設定 from_logits=True
的損失函數一起使用(即,未對預測套用 sigmoid),則應將 thresholds
設定為 0。會為每個閾值產生一個指標值。如果未設定 thresholds
也未設定 top_k
,則預設會以 thresholds=0.5
計算召回率。[0, num_classes)
內,其中 num_classes
是預測的最後一個維度。範例
>>> m = keras.metrics.Recall()
>>> m.update_state([0, 1, 1, 1], [1, 0, 1, 1])
>>> m.result()
0.6666667
>>> m.reset_state()
>>> m.update_state([0, 1, 1, 1], [1, 0, 1, 1], sample_weight=[0, 0, 1, 0])
>>> m.result()
1.0
搭配 compile()
API 使用
model.compile(optimizer='sgd',
loss='binary_crossentropy',
metrics=[keras.metrics.Recall()])
搭配 from_logits=True
的損失使用
model.compile(optimizer='adam',
loss=keras.losses.BinaryCrossentropy(from_logits=True),
metrics=[keras.metrics.Recall(thresholds=0)])
TruePositives
類別keras.metrics.TruePositives(thresholds=None, name=None, dtype=None)
計算真陽性的數量。
如果給定 sample_weight
,則計算真陽性的權重總和。此指標會建立一個區域變數 true_positives
,用於追蹤真陽性的數量。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
引數
0.5
。一個浮點值,或一個浮點閾值值的 Python 列表/元組,介於 [0, 1]
之間。將閾值與預測值進行比較,以判斷預測的真值(即,高於閾值為 True
,低於閾值為 False
)。如果與設定 from_logits=True
的損失函數一起使用(即,未對預測套用 sigmoid),則應將 thresholds
設定為 0。會為每個閾值產生一個指標值。範例
>>> m = keras.metrics.TruePositives()
>>> m.update_state([0, 1, 1, 1], [1, 0, 1, 1])
>>> m.result()
2.0
>>> m.reset_state()
>>> m.update_state([0, 1, 1, 1], [1, 0, 1, 1], sample_weight=[0, 0, 1, 0])
>>> m.result()
1.0
TrueNegatives
類別keras.metrics.TrueNegatives(thresholds=None, name=None, dtype=None)
計算真陰性的數量。
如果給定 sample_weight
,則計算真陰性的權重總和。此指標會建立一個區域變數 accumulator
,用於追蹤真陰性的數量。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
引數
0.5
。一個浮點值,或一個浮點閾值值的 Python 列表/元組,介於 [0, 1]
之間。將閾值與預測值進行比較,以判斷預測的真值(即,高於閾值為 True
,低於閾值為 False
)。如果與設定 from_logits=True
的損失函數一起使用(即,未對預測套用 sigmoid),則應將 thresholds
設定為 0。會為每個閾值產生一個指標值。範例
>>> m = keras.metrics.TrueNegatives()
>>> m.update_state([0, 1, 0, 0], [1, 1, 0, 0])
>>> m.result()
2.0
>>> m.reset_state()
>>> m.update_state([0, 1, 0, 0], [1, 1, 0, 0], sample_weight=[0, 0, 1, 0])
>>> m.result()
1.0
FalsePositives
類別keras.metrics.FalsePositives(thresholds=None, name=None, dtype=None)
計算假陽性的數量。
如果給定 sample_weight
,則計算假陽性的權重總和。此指標會建立一個區域變數 accumulator
,用於追蹤假陽性的數量。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
引數
0.5
。一個浮點值,或一個浮點閾值值的 Python 列表/元組,介於 [0, 1]
之間。將閾值與預測值進行比較,以判斷預測的真值(即,高於閾值為 True
,低於閾值為 False
)。如果與設定 from_logits=True
的損失函數一起使用(即,未對預測套用 sigmoid),則應將 thresholds
設定為 0。會為每個閾值產生一個指標值。範例
>>> m = keras.metrics.FalsePositives()
>>> m.update_state([0, 1, 0, 0], [0, 0, 1, 1])
>>> m.result()
2.0
>>> m.reset_state()
>>> m.update_state([0, 1, 0, 0], [0, 0, 1, 1], sample_weight=[0, 0, 1, 0])
>>> m.result()
1.0
FalseNegatives
類別keras.metrics.FalseNegatives(thresholds=None, name=None, dtype=None)
計算假陰性的數量。
如果給定 sample_weight
,則計算假陰性的權重總和。此指標會建立一個局部變數 accumulator
,用於追蹤假陰性的數量。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
引數
0.5
。一個浮點值,或一個浮點閾值值的 Python 列表/元組,介於 [0, 1]
之間。將閾值與預測值進行比較,以判斷預測的真值(即,高於閾值為 True
,低於閾值為 False
)。如果與設定 from_logits=True
的損失函數一起使用(即,未對預測套用 sigmoid),則應將 thresholds
設定為 0。會為每個閾值產生一個指標值。範例
>>> m = keras.metrics.FalseNegatives()
>>> m.update_state([0, 1, 1, 1], [0, 1, 0, 0])
>>> m.result()
2.0
>>> m.reset_state()
>>> m.update_state([0, 1, 1, 1], [0, 1, 0, 0], sample_weight=[0, 0, 1, 0])
>>> m.result()
1.0
PrecisionAtRecall
類別keras.metrics.PrecisionAtRecall(
recall, num_thresholds=200, class_id=None, name=None, dtype=None
)
計算召回率 >= 指定值時的最佳精確度。
此指標會建立四個局部變數:true_positives
、true_negatives
、false_positives
和 false_negatives
,用於計算指定召回率的精確度。計算給定召回率值的閾值,並用於評估相應的精確度。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
如果指定 class_id
,我們會僅考慮批次中 class_id
高於閾值預測的條目來計算精確度,並計算其中 class_id
確實為正確標籤的比例。
引數
[0, 1]
中的純量值。[0, num_classes)
內,其中 num_classes
是預測的最後一個維度。範例
>>> m = keras.metrics.PrecisionAtRecall(0.5)
>>> m.update_state([0, 0, 0, 1, 1], [0, 0.3, 0.8, 0.3, 0.8])
>>> m.result()
0.5
>>> m.reset_state()
>>> m.update_state([0, 0, 0, 1, 1], [0, 0.3, 0.8, 0.3, 0.8],
... sample_weight=[2, 2, 2, 1, 1])
>>> m.result()
0.33333333
搭配 compile()
API 使用
model.compile(
optimizer='sgd',
loss='binary_crossentropy',
metrics=[keras.metrics.PrecisionAtRecall(recall=0.8)])
RecallAtPrecision
類別keras.metrics.RecallAtPrecision(
precision, num_thresholds=200, class_id=None, name=None, dtype=None
)
計算精確度 >= 指定值時的最佳召回率。
對於給定的分數-標籤分佈,可能無法達到所需的精確度,在這種情況下,會回傳 0.0 作為召回率。
此指標會建立四個局部變數:true_positives
、true_negatives
、false_positives
和 false_negatives
,用於計算給定精確度的召回率。計算給定精確度值的閾值,並用於評估相應的召回率。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
如果指定 class_id
,我們會僅考慮批次中 class_id
高於閾值預測的條目來計算精確度,並計算其中 class_id
確實為正確標籤的比例。
引數
[0, 1]
中的純量值。[0, num_classes)
內,其中 num_classes
是預測的最後一個維度。範例
>>> m = keras.metrics.RecallAtPrecision(0.8)
>>> m.update_state([0, 0, 1, 1], [0, 0.5, 0.3, 0.9])
>>> m.result()
0.5
>>> m.reset_state()
>>> m.update_state([0, 0, 1, 1], [0, 0.5, 0.3, 0.9],
... sample_weight=[1, 0, 0, 1])
>>> m.result()
1.0
搭配 compile()
API 使用
model.compile(
optimizer='sgd',
loss='binary_crossentropy',
metrics=[keras.metrics.RecallAtPrecision(precision=0.8)])
SensitivityAtSpecificity
類別keras.metrics.SensitivityAtSpecificity(
specificity, num_thresholds=200, class_id=None, name=None, dtype=None
)
計算特異度 >= 指定值時的最佳靈敏度。
Sensitivity
測量實際正例中被正確識別為正例的比例 (tp / (tp + fn))
。Specificity
測量實際負例中被正確識別為負例的比例 (tn / (tn + fp))
。
此指標會建立四個局部變數:true_positives
、true_negatives
、false_positives
和 false_negatives
,用於計算給定特異度的靈敏度。計算給定特異度值的閾值,並用於評估相應的靈敏度。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
如果指定 class_id
,我們會僅考慮批次中 class_id
高於閾值預測的條目來計算精確度,並計算其中 class_id
確實為正確標籤的比例。
有關特異度和靈敏度的其他資訊,請參閱以下連結。
引數
[0, 1]
中的純量值。[0, num_classes)
內,其中 num_classes
是預測的最後一個維度。範例
>>> m = keras.metrics.SensitivityAtSpecificity(0.5)
>>> m.update_state([0, 0, 0, 1, 1], [0, 0.3, 0.8, 0.3, 0.8])
>>> m.result()
0.5
>>> m.reset_state()
>>> m.update_state([0, 0, 0, 1, 1], [0, 0.3, 0.8, 0.3, 0.8],
... sample_weight=[1, 1, 2, 2, 1])
>>> m.result()
0.333333
搭配 compile()
API 使用
model.compile(
optimizer='sgd',
loss='binary_crossentropy',
metrics=[keras.metrics.SensitivityAtSpecificity()])
SpecificityAtSensitivity
類別keras.metrics.SpecificityAtSensitivity(
sensitivity, num_thresholds=200, class_id=None, name=None, dtype=None
)
計算靈敏度 >= 指定值時的最佳特異度。
Sensitivity
測量實際正例中被正確識別為正例的比例 (tp / (tp + fn))
。Specificity
測量實際負例中被正確識別為負例的比例 (tn / (tn + fp))
。
此指標會建立四個局部變數:true_positives
、true_negatives
、false_positives
和 false_negatives
,用於計算給定靈敏度的特異度。計算給定靈敏度值的閾值,並用於評估相應的特異度。
如果 sample_weight
為 None
,則權重預設為 1。使用 0 的 sample_weight
來遮罩值。
如果指定 class_id
,我們會僅考慮批次中 class_id
高於閾值預測的條目來計算精確度,並計算其中 class_id
確實為正確標籤的比例。
有關特異度和靈敏度的其他資訊,請參閱以下連結。
引數
[0, 1]
中的純量值。[0, num_classes)
內,其中 num_classes
是預測的最後一個維度。範例
>>> m = keras.metrics.SpecificityAtSensitivity(0.5)
>>> m.update_state([0, 0, 0, 1, 1], [0, 0.3, 0.8, 0.3, 0.8])
>>> m.result()
0.66666667
>>> m.reset_state()
>>> m.update_state([0, 0, 0, 1, 1], [0, 0.3, 0.8, 0.3, 0.8],
... sample_weight=[1, 1, 2, 2, 2])
>>> m.result()
0.5
搭配 compile()
API 使用
model.compile(
optimizer='sgd',
loss='binary_crossentropy',
metrics=[keras.metrics.SpecificityAtSensitivity()])
F1Score
類別keras.metrics.F1Score(average=None, threshold=None, name="f1_score", dtype=None)
計算 F-1 分數。
公式
f1_score = 2 * (precision * recall) / (precision + recall)
這是精確度和召回率的調和平均數。其輸出範圍為 [0, 1]
。它適用於多類別和多標籤分類。
引數
None
、"micro"
、"macro"
和 "weighted"
。預設值為 None
。如果為 None
,則不會執行平均,且 result()
將回傳每個類別的分數。如果為 "micro"
,則透過計算總計的真正例、假陰性和假陽性來全域計算指標。如果為 "macro"
,則計算每個標籤的指標,並回傳它們的未加權平均值。這不會考慮標籤不平衡。如果為 "weighted"
,則計算每個標籤的指標,並回傳它們的平均值,該平均值會根據支援度(每個標籤的真實實例數)進行加權。這會修改 "macro"
以考慮標籤不平衡。它可能會產生不在精確度和召回率之間的分數。threshold
的 y_pred
元素會轉換為 1,其餘為 0。如果 threshold
為 None
,則 y_pred
的 argmax 會轉換為 1,其餘則為 0。回傳
範例
>>> metric = keras.metrics.F1Score(threshold=0.5)
>>> y_true = np.array([[1, 1, 1],
... [1, 0, 0],
... [1, 1, 0]], np.int32)
>>> y_pred = np.array([[0.2, 0.6, 0.7],
... [0.2, 0.6, 0.6],
... [0.6, 0.8, 0.0]], np.float32)
>>> metric.update_state(y_true, y_pred)
>>> result = metric.result()
array([0.5 , 0.8 , 0.6666667], dtype=float32)
FBetaScore
類別keras.metrics.FBetaScore(
average=None, beta=1.0, threshold=None, name="fbeta_score", dtype=None
)
計算 F-Beta 分數。
公式
b2 = beta ** 2
f_beta_score = (1 + b2) * (precision * recall) / (precision * b2 + recall)
這是精確度和召回率的加權調和平均數。其輸出範圍為 [0, 1]
。它適用於多類別和多標籤分類。
引數
None
、"micro"
、"macro"
和 "weighted"
。預設值為 None
。如果為 None
,則不會執行平均,且 result()
將回傳每個類別的分數。如果為 "micro"
,則透過計算總計的真正例、假陰性和假陽性來全域計算指標。如果為 "macro"
,則計算每個標籤的指標,並回傳它們的未加權平均值。這不會考慮標籤不平衡。如果為 "weighted"
,則計算每個標籤的指標,並回傳它們的平均值,該平均值會根據支援度(每個標籤的真實實例數)進行加權。這會修改 "macro"
以考慮標籤不平衡。它可能會產生不在精確度和召回率之間的分數。1
。threshold
的 y_pred
元素會轉換為 1,其餘為 0。如果 threshold
為 None
,則 y_pred
的 argmax 會轉換為 1,其餘則為 0。回傳
範例
>>> metric = keras.metrics.FBetaScore(beta=2.0, threshold=0.5)
>>> y_true = np.array([[1, 1, 1],
... [1, 0, 0],
... [1, 1, 0]], np.int32)
>>> y_pred = np.array([[0.2, 0.6, 0.7],
... [0.2, 0.6, 0.6],
... [0.6, 0.8, 0.0]], np.float32)
>>> metric.update_state(y_true, y_pred)
>>> result = metric.result()
>>> result
[0.3846154 , 0.90909094, 0.8333334 ]