使用交叉验证评估准确性

交叉验证是机器学习中的一个重要概念. 在前面的章节中我们将数据分成训练和测试数据集. 然而, 为了使其更加健壮, 我们需要用不同的子集重复这个过程. 如果我们只是为一个特定的子集调整它, 我们可能会最终过拟合该模型. 过拟合指的是在测试数据上表现良好, 但在未知数据上却并不理想的情况. 我们希望我们的机器学习模型在未知数据上表现良好.

准备

在讨论如何执行交叉验证之前, 让我们谈谈性能指标. 当我们处理机器学习模型时, 我们通常关心三个事情: 精确率, 召回率和F1得分. 我们可以使用参数评分获得所需的性能指标. 精确率是指正确分类占列表中项目总数百分比. 召回率指的是检索的项目数量占培训列表中项目总数的百分比.

我们考虑一个包含100个项目的测试数据集, 其中82个是我们感兴趣的. 现在, 我们希望我们的分类器为我们识别这82个项目. 我们的分类器选出73项作为感兴趣的项目. 在这73个项目中, 只有65个实际上是感兴趣的项目, 其余8个被错误分类. 我们可以通过以下方式计算精度:

  • 正确处理的数量为: 65
  • 总计处理的数量为: 73
  • 精确率为: 65 / 73 = 89.04%

为计算召回率, 使用如下逻辑:

  • 数据集中感兴趣的总数为: 82
  • 正确处理的数量为: 65
  • 召回率为: 65 / 82 = 79.26%

良好的机器学习模型需要同时具有良好的精确率和良好的召回率. 很容易得到其中一个到100%, 但另一个指标受损! 我们需要同时保持两个指标高. 为了量化这一点, 我们使用F1分数, 它是精确率和召回率的组合. 这实际上是精度和召回的调和平均值.

F1 = 2 * 精确率 * 召回率 / (精确率 + 召回率)

上面的例子中:

F1 = 2 * 0.8904 * 0.7926 / (0.8904 + 0.7926) = 0.8370

怎么做...?

  • 让我们来看看如何执行交叉验证和提取性能指标. 我们将从精确率开始:
num_validations = 5
accuracy = cross_val_score(
    classifier_gaussiannb,
    X, y,
    scoring='accuracy',
    cv=num_validations
)
print ("Accuracy: " + str(round(100 * accuracy.mean(), 2)) + "%")
  • 然后是召回率和F1分值:
f1 = cross_val_score(
    classifier_gaussiannb,
    X, y,
    scoring='f1_weighted',
    cv=num_validations
)
print ("F1: " + str(round(100 * f1.mean(), 2)) + "%")

precision = cross_val_score(
    classifier_gaussiannb,
    X, y,
    scoring='precision_weighted',
    cv=num_validations
)
print ("Precision: " + str(round(100 * precision.mean(), 2)) + "%")

recall = cross_val_score(
    classifier_gaussiannb,
    X, y,
    scoring='recall_weighted',
    cv=num_validations
)
print ("Recall: " + str(round(100 * recall.mean(), 2)) + "%")

results matching ""

    No results matching ""