首頁>技術>

介紹

在我最近的一個專案中,事務監控系統生成了大量誤報警報(然後由調查小組手動調查這些警報)。我們被要求使用機器學習來自動關閉那些錯誤警報。機器學習模型的評估標準是一個度量負預測值(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

22
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Python正則表示式(一)