CNTK - 分类模型

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

混淆矩阵

混淆矩阵 - 包含预测输出与预期输出的表格是衡量分类问题性能的最简单方法,其中输出可以是两种或多种类型的类别。

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

实际欺诈 实际正常

预测欺诈

真阳性

假阳性

预测正常

假阴性

真阴性

我们可以看到,上述示例混淆矩阵包含 2 列,一列表示欺诈类,另一列表示正常类。同样,我们有 2 行,一行用于分类欺诈,另一行用于分类正常。以下是与混淆矩阵 − 相关的术语的解释。

  • True Positives(真阳性) − 当数据点的实际类别和预测类别均为 1 时。

  • True Negatives(真阴性) − 当数据点的实际类别和预测类别均为 0 时。

  • False Positives(假阳性) − 当数据点的实际类别为 0 且数据点的预测类别为 1 时。

  • False Negatives(假阴性) − 当数据点的实际类别为 1 且数据点的预测类别为 0 时。

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

  • 准确率 − 这是我们的 ML 分类模型做出的正确预测的数量。它可以通过以下公式计算 −

  • 准确率
  • 精确率 −它告诉我们在我们预测的所有样本中,有多少样本被正确预测。它可以通过以下公式计算 −

  • 精确率
  • 召回率或敏感度 − 召回率是我们的 ML 分类模型返回的正样本数量。换句话说,它告诉我们数据集中有多少欺诈案例被模型实际检测到。它可以借助以下公式计算 −

  • Recall
  • 特异性 − 与召回率相反,它给出了我们的 ML 分类模型返回的负数。它可以借助以下公式 − 来计算

  • specificity

F 度量

我们可以使用 F 度量作为混淆矩阵的替代方案。这背后的主要原因是,我们不能同时最大化召回率和准确率。这些指标之间存在非常密切的关系,可以借助以下示例来理解 −

假设,我们想使用 DL 模型将细胞样本分类为癌细胞或正常细胞。在这里,为了达到最大精度,我们需要将预测数量减少到 1。虽然,这可以让我们达到大约 100% 的精度,但召回率会变得非常低。

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

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

F-measure

这个公式称为 F1 度量,其中称为 B 的额外项设置为 1 以获得相等的精度和召回率。为了强调召回率,我们可以将因子 B 设置为 2。另一方面,为了强调精度,我们可以将因子 B 设置为 0.5。

使用 CNTK 测量分类性能

在上一节中,我们使用鸢尾花数据集创建了一个分类模型。在这里,我们将使用混淆矩阵和 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()
Iris

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

现在要计算分类误差,请使用数据集对损失函数执行测试方法。之后,CNTK 将获取我们提供的样本作为此函数的输入,并根据输入特征 X_test 进行预测。

loss.test([X_test, y_test])

输出

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

实现 F-Measures

为了实现 F-Measures,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])

输出

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