CNTK - 分类模型

  • 简述

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

    混淆矩阵 - 包含预测输出与预期输出的表格是衡量分类问题性能的最简单方法,其中输出可以是两种或更多类型的类。
    为了理解它是如何工作的,我们将为一个二元分类模型创建一个混淆矩阵,用于预测信用卡交易是正常的还是欺诈的。它显示如下 -
    Actual fraud Actual normal
    Predicted fraud
    True positive
    False positive
    Predicted normal
    False negative
    True negative
    如我们所见,上述样本混淆矩阵包含 2 列,一列用于类别欺诈,另一列用于类别正常。以同样的方式,我们有 2 行,一个是为类欺诈添加的,另一行是为类正常添加的。以下是与混淆矩阵相关的术语的解释 -
    • True Positives - 当数据点的实际类别和预测类别均为 1 时。
    • True Negatives - 当数据点的实际类别和预测类别均为 0 时。
    • False Positives- 当数据点的实际类别为 0 且预测的数据点类别为 1 时。
    • False Negatives - 当数据点的实际类别为 1 且预测的数据点类别为 0 时。
    让我们看看,我们如何从混淆矩阵中计算不同事物的数量 -
    • Accuracy - 这是我们的 ML 分类模型做出的正确预测的数量。可以借助以下公式计算 -
    • 准确性
    • Precision- 它告诉我们在我们预测的所有样本中正确预测了多少样本。可以借助以下公式计算 -
    • 精确
    • Recall or Sensitivity - Recall 是我们的 ML 分类模型返回的正数。换句话说,它告诉我们数据集中有多少欺诈案例被模型实际检测到。可以借助以下公式计算 -
    • 记起
    • Specificity- 与召回相反,它给出了我们的 ML 分类模型返回的负数。可以借助以下公式计算 -
    • 特异性
  • F-测量

    我们可以使用 F-measure 作为混淆矩阵的替代方案。这背后的主要原因是,我们不能同时最大化 Recall 和 Precision。这些指标之间存在非常紧密的关系,可以通过以下示例来理解 -
    假设,我们想使用 DL 模型将细胞样本分类为癌变或正常。在这里,为了达到最大精度,我们需要将预测数量减少到 1。虽然这可以让我们达到 100% 左右的精度,但召回率会变得非常低。
    另一方面,如果我们想达到最大召回率,我们需要做出尽可能多的预测。虽然,这可以让我们达到 100% 左右的召回率,但准确率会变得非常低。
    在实践中,我们需要找到一种平衡精度和召回率的方法。F-measure 指标允许我们这样做,因为它表达了准确率和召回率之间的调和平均值。
    F-测量
    这个公式称为 F1 度量,其中称为 B 的额外项设置为 1 以获得相等的准确率和召回率。为了强调召回率,我们可以将因子 B 设置为 2。另一方面,为了强调精度,我们可以将因子 B 设置为 0.5。
  • 使用 CNTK 测量分类性能

    在上一节中,我们使用鸢尾花数据集创建了一个分类模型。在这里,我们将使用混淆矩阵和 F-measure 度量来衡量它的性能。

    创建混淆矩阵

    我们已经创建了模型,因此我们可以开始验证过程,其中包括混淆矩阵。首先,我们将在scikit-learn中的混淆矩阵函数的帮助下创建混淆矩阵。为此,我们需要测试样本的真实标签和相同测试样本的预测标签。
    让我们使用以下 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 包中的分类误差函数来计算分类误差。
    现在要计算分类误差,请使用数据集对损失函数执行测试方法。之后,CNTK 会将我们提供的样本作为该函数的输入,并根据输入特征 X_test 进行预测
    
    
    loss.test([X_test, y_test])
    
    

    输出

    
    
    {'metric': 0.36666666666, 'samples': 30}
    
    
  • 实施 F-Measures

    为了实现 F-Measures,CNTK 还包含名为 fmeasures 的函数。我们可以使用这个函数,同时通过替换单元格cntk.metrics.classification_error来训练 NN,在定义标准工厂函数时调用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}