- Microsoft Cognitive Toolkit (CNTK) 教程
- 首頁
- 介紹
- 入門
- CPU 和 GPU
- CNTK - 序列分類
- CNTK - 邏輯迴歸模型
- CNTK - 神經網路 (NN) 概念
- CNTK - 建立第一個神經網路
- CNTK - 訓練神經網路
- CNTK - 記憶體資料集和大型資料集
- CNTK - 效能測量
- 神經網路分類
- 神經網路二元分類
- CNTK - 神經網路迴歸
- CNTK - 分類模型
- CNTK - 迴歸模型
- CNTK - 記憶體不足的資料集
- CNTK - 模型監控
- CNTK - 卷積神經網路
- CNTK - 迴圈神經網路
- Microsoft Cognitive Toolkit 資源
- Microsoft Cognitive Toolkit - 快速指南
- Microsoft Cognitive Toolkit - 資源
- Microsoft Cognitive Toolkit - 討論
CNTK - 分類模型
本章將幫助您瞭解如何在 CNTK 中衡量分類模型的效能。讓我們從混淆矩陣開始。
混淆矩陣
混淆矩陣 - 一個表格,顯示預測輸出與預期輸出,這是衡量分類問題效能最簡單的方法,其中輸出可以是兩種或多種型別的類別。
為了理解它的工作原理,我們將為一個二元分類模型建立一個混淆矩陣,該模型預測信用卡交易是正常的還是欺詐的。它顯示如下:
| 實際欺詐 | 實際正常 | |
|---|---|---|
|
預測欺詐 |
真正例 (True positive) |
假正例 (False positive) |
|
預測正常 |
假反例 (False negative) |
真反例 (True negative) |
如我們所見,上述示例混淆矩陣包含兩列,一列用於欺詐類別,另一列用於正常類別。同樣,我們有兩行,一行為欺詐類別,另一行為正常類別。以下是與混淆矩陣相關的術語的解釋:
真正例 (True Positives) - 當資料點的實際類別和預測類別都為 1 時。
真反例 (True Negatives) - 當資料點的實際類別和預測類別都為 0 時。
假正例 (False Positives) - 當資料點的實際類別為 0 而預測類別為 1 時。
假反例 (False Negatives) - 當資料點的實際類別為 1 而預測類別為 0 時。
讓我們看看如何從混淆矩陣中計算不同事物的數量:
準確率 (Accuracy) - 這是我們的 ML 分類模型做出的正確預測的數量。可以使用以下公式計算:
精確率 (Precision) - 它告訴我們,在我們預測的所有樣本中,有多少樣本被正確預測。可以使用以下公式計算:
召回率 (Recall) 或靈敏度 (Sensitivity) - 召回率是我們 ML 分類模型返回的正例的數量。換句話說,它告訴我們模型實際檢測到的資料集中有多少欺詐案例。可以使用以下公式計算:
特異性 (Specificity) - 與召回率相反,它給出的是我們的 ML 分類模型返回的反例的數量。可以使用以下公式計算:
F 值
我們可以使用 F 值作為混淆矩陣的替代方法。其主要原因是,我們無法同時最大化召回率和精確率。這兩個指標之間存在非常強的關係,這可以透過以下示例來理解:
假設,我們想使用 DL 模型將細胞樣本分類為癌變或正常。在這裡,為了達到最大精確率,我們需要將預測數量減少到 1。儘管這可以使我們的精確率達到 100%,但召回率將變得非常低。
另一方面,如果我們想達到最大召回率,我們需要儘可能多地進行預測。儘管這可以使我們的召回率達到 100%,但精確率將變得非常低。
在實踐中,我們需要找到一種在精確率和召回率之間取得平衡的方法。F 值指標允許我們這樣做,因為它表示精確率和召回率之間的調和平均值。
這個公式稱為 F1 值,其中額外的項 B 設定為 1 以獲得精確率和召回率的相等比率。為了強調召回率,我們可以將因子 B 設定為 2。另一方面,為了強調精確率,我們可以將因子 B 設定為 0.5。
使用 CNTK 衡量分類效能
在上一節中,我們使用 Iris 花資料集建立了一個分類模型。在這裡,我們將使用混淆矩陣和 F 值指標來衡量其效能。
建立混淆矩陣
我們已經建立了模型,因此我們可以開始驗證過程,其中包括混淆矩陣。首先,我們將使用來自scikit-learn 的confusion_matrix 函式來建立混淆矩陣。為此,我們需要測試樣本的真實標籤和相同測試樣本的預測標籤。
讓我們使用以下 Python 程式碼計算混淆矩陣:
from sklearn.metrics import confusion_matrix y_true = np.argmax(y_test, axis=1) y_pred = np.argmax(z(X_test), axis=1) matrix = confusion_matrix(y_true=y_true, y_pred=y_pred) print(matrix)
輸出
[[10 0 0] [ 0 1 9] [ 0 0 10]]
我們還可以使用熱圖函式來視覺化混淆矩陣,如下所示:
import seaborn as sns
import matplotlib.pyplot as plt
g = sns.heatmap(matrix,
annot=True,
xticklabels=label_encoder.classes_.tolist(),
yticklabels=label_encoder.classes_.tolist(),
cmap='Blues')
g.set_yticklabels(g.get_yticklabels(), rotation=0)
plt.show()
我們還應該有一個單一的效能數字,我們可以用來比較模型。為此,我們需要使用 CNTK 中 metrics 包中的classification_error 函式計算分類誤差,就像建立分類模型時所做的那樣。
現在要計算分類誤差,請使用資料集對損失函式執行測試方法。之後,CNTK 將獲取我們為此函式提供的樣本作為輸入,並根據輸入特徵 X_test 進行預測。
loss.test([X_test, y_test])
輸出
{'metric': 0.36666666666, 'samples': 30}
實現 F 值
為了實現 F 值,CNTK 還包含一個名為 fmeasures 的函式。在訓練 NN 時,我們可以使用此函式,在定義標準工廠函式時,用對cntk.losses.fmeasure 的呼叫替換單元cntk.metrics.classification_error,如下所示:
import cntk @cntk.Function def criterion_factory(output, target): loss = cntk.losses.cross_entropy_with_softmax(output, target) metric = cntk.losses.fmeasure(output, target) return loss, metric
使用 cntk.losses.fmeasure 函式後,我們將得到loss.test 方法呼叫的不同輸出,如下所示:
loss.test([X_test, y_test])
輸出
{'metric': 0.83101488749, 'samples': 30}