- 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}