Microsoft Cognitive Toolkit 简明教程

CNTK - Classification Model

本章将帮助您了解如何衡量 CNTK 中分类模型的性能。让我们从混淆矩阵开始。

Confusion matrix

混淆矩阵 - 一个表,预测输出与预期输出相对比,这是衡量分类问题性能最简单的方法,其中输出可以是两种或更多类型的类别。

为了了解它的工作原理,我们将创建一个用于二进制分类模型的混淆矩阵,该模型预测信用卡交易是正常的还是欺诈的。它显示如下 −

Actual fraud

Actual normal

Predicted fraud

True positive

False positive

Predicted normal

False negative

True negative

जैसा कि हम देख सकते हैं, ऊपर दिए गए नमूना भ्रम मैट्रिक्स में 2 कॉलम हैं, एक वर्ग धोखाधड़ी के लिए और दूसरा वर्ग सामान्य के लिए। उसी तरह हमारे पास 2 पंक्तियाँ हैं, एक वर्ग धोखाधड़ी के लिए जोड़ी गई है और दूसरी वर्ग सामान्य के लिए जोड़ी गई है। निम्नलिखित भ्रम मैट्रिक्स से जुड़े शब्दों की व्याख्या है −

  1. * ट्रू पॉजिटिव* - जब डेटा बिंदु का वास्तविक वर्ग और भविष्यवाणी की गई वर्ग दोनों 1 हो।

  2. * ट्रू नेगेटिव* - जब डेटा बिंदु का वास्तविक वर्ग और भविष्यवाणी की गई वर्ग दोनों 0 हो।

  3. * 假阳性* - 当数据点的实际类别为 0 且数据点的预测类别为 1 时。

  4. * 假阴性* - 当数据点的实际类别为 1 且数据点的预测类别为 0 时。

让我们看看,如何从混淆矩阵中计算出不同事项的数量 −

  1. Accuracy - 这是我们的 ML 分类模型做出的正确预测数。可以使用以下公式来计算 −

  2. Precision - 该公式告诉我们,在我们预测的所有样本中,有多少样本被正确预测。可以使用以下公式来计算 −

  3. Recall or Sensitivity - 召回率是我们 ML 分类模型返回的正例数。换句话说,该公式告诉我们在数据集中有多少欺诈案例实际上被模型检测到了。可以使用以下公式来计算 −

  4. Specificity - 与召回率相反,该公式提供了我们 ML 分类模型返回的负例数。可以使用以下公式来计算 −

F-measure

我们可以将 F 度量作为混淆矩阵的替代方法。这样的主要原因是,我们无法同时使召回率和精确率最大化。这些指标之间存在着非常牢固的关系,这可以通过以下示例了解 −

假设,我们要使用 DL 模型将细胞样本分类为癌性或正常。这里,为了达到最高的精确率,我们需要将预测数减少到 1。尽管这可以使我们达到约 100% 的精确率,但召回率将变得非常低。

另一方面,如果我们想要达到最大的召回率,我们需要进行尽可能多的预测。虽然这可以使我们的召回率达到约 100%,但精确率将变得非常低。

在实践中,我们需要找到一种在精确率和召回率之间取得平衡的方法。F 度量指标允许我们这样做,因为它表示精确率和召回率之间的调和平均。

fmeasure

该公式被称为 F1 度量,其中称作 B 的额外项设置为 1,以得到精确率和召回率的相同样比。为了强调召回率,我们可以将因子 B 设置为 2。另一方面,为了强调精确率,我们可以将因子 B 设置为 0.5。

Using CNTK to measure classification performance

在上一节中,我们已经使用 Iris 花数据集创建了一个分类模型。在此,我们将使用混淆矩阵和 F 度量指标来衡量其性能。

Creating Confusion matrix

我们已经创建了该模型,所以我们可以开始对模型进行验证过程,该过程包括 confusion matrix 。首先,我们将使用 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)

Output

[[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()
iris

我们还应该有一个单一的性能数字,我们可以使用它来比较模型。为此,我们需要使用 CNTK 中指标包中的 classification_error 函数来计算分类错误,就像在创建分类模型时所做的那样。

现在,要来计算分类错误,请使用数据集中带有损失函数的测试方法。之后,CNTK 会将我们提供给该函数作为输入的样本作为输入,并根据输入特征 X_*test* 做出预测。

loss.test([X_test, y_test])

Output

{'metric': 0.36666666666, 'samples': 30}

Implementing F-Measures

为了实现 F 度量,CNTK 还包括一个名为 fmeasures 的函数。我们在通过训练 NN 时可以将单元格 cntk.metrics.classification_error 替换为对 cntk.losses.fmeasure 的调用,在定义准则工厂函数时使用如下方式 −

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])

Output

{'metric': 0.83101488749, 'samples': 30}