介紹
在我最近的一個專案中,事務監控系統生成了大量誤報警報(然後由調查小組手動調查這些警報)。我們被要求使用機器學習來自動關閉那些錯誤警報。機器學習模型的評估標準是一個度量負預測值(Negative Predicted Value),表示在模型的總負預測中,有多少個案例是正確識別的。
NPV = True Negative / (True Negative + False Negative)
我會快速顯示混淆矩陣,下面是jupyter筆記本的輸出。在二分類模型中,target=1是欺詐交易,target=0是非欺詐交易。
cm = confusion_matrix(y_test_actual, y_test_pred)print(cm)----- Output -----[[230, 33] [24, 74]
根據解釋混淆矩陣的不同方式,你會得到90%或76%的NPV。因為:
TN = cm[0][0] 或者 cm[1][1] 也就是 230 或者 74
FN = cm[1][0] 也就是 24
維基百科表示我參考了維基百科中的混淆矩陣表示法。
這張來自維基百科的圖片顯示,預測的標籤位於水平面,而實際的標籤位於垂直面。這意味著:
TN = cm[1][1] ie. 76
FN = cm[1][0] ie. 24
NPV=76%
Sklearn表示法Scikit-learn文件說Wikipedia和其他參考文獻可能對axes使用不同的約定:https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html#sklearn.metrics.confusion_matrix
他們認為維基百科和其他參考文獻可能會使用不同的座標軸慣例。
我們已經看到,如果對軸使用錯誤的約定,度量可能會偏的非常厲害。
如果你通讀文件,會發現這個示例:
tn, fp, fn, tp = confusion_matrix([0, 1, 0, 1], [1, 1, 1, 0]).ravel()
這裡,他們將矩陣輸出展平。在我們的例子中,這意味著:
TN = cm[0][0] ie. 230
FN = cm[1][0] ie. 24
NPV = 90%
理解混淆矩陣的結構清楚地理解混淆矩陣的結構是非常重要的。儘管你可以直接使用公式計算大多數標準指標,如準確度、精確度、召回率等。許多時候,你需要計算諸如NPV、假正例率、假反例率等指標,這些指標在現成的軟體包中是不可用的。
現在,如果我讓你為混淆矩陣選擇正確的選項,那就是混淆矩陣的輸出。你會選哪一個?
你的答案是“A”是因為維基百科是這麼說的,還是“C”是因為sklearn文件是這麼說的?
讓我們看看考慮一下這些是你的y_true 和y_pred 值。
y_true = [0, 1, 0, 1, 0, 1, 0]y_pred = [1, 1, 1, 0, 1, 0, 1]
我們可以計算如下:
TP (True Positive) = 1
FP (False Positive) = 4
TN (True Negative) = 0
FN (False Negative) = 2
對於二分類的經典機器學習模型,主要是執行以下程式碼來獲得混淆矩陣。
from sklearn.metrics import confusion_matrixconfusion_matrix(y_true, y_pred)
如果我們把它填回混淆矩陣,我們得到如下的混淆矩陣:
cm = confusion_matrix(y_true, y_pred)print (cm)--- Output ---[[0,4] [2,1]] which translates to this: predicted 0 1 ----- ----- 0| 0 | 4 actual ----- ----- 1| 2 | 1
TN (True Negative) = cm[0][0] = 0
FN (False Negative) = cm[1][0] = 2
TP (True Positive) = cm[1][1] = 1
FP (False Positive) = cm[0][1] = 4
但是,如果要新增一個簡單的引數“labels”。
cm = confusion_matrix(y_true, y_pred, labels=[1,0])print (cm)--- Output ---[[1,2] [4,0]] which translates to this: predicted 1 0 ----- ----- 1| 1 | 2 actual ----- ----- 0| 4 | 0
TP (True Positive) = cm[0][0] = 1
FP (False Positive) = cm[1][0] = 4
TN (True Negative) = cm[1][1] = 0
FN (False Negative) = cm[0][1] = 2
結論:下面是sklearn的混淆矩陣的預設輸出的正確表示。水平軸上的真實標籤和垂直軸上的預測標籤。
1.預設輸出:
# 1.預設輸出confusion_matrix(y_true, y_pred)
2.透過新增labels引數,可以獲得以下輸出:
# 2. 使用labels引數confusion_matrix(y_true, y_pred, labels=[1,0])
Github連結:https://github.com/samarth-agrawal-86/data_scientist_toolkit