使用交叉验证评估准确性
交叉验证是机器学习中的一个重要概念. 在前面的章节中我们将数据分成训练和测试数据集. 然而, 为了使其更加健壮, 我们需要用不同的子集重复这个过程. 如果我们只是为一个特定的子集调整它, 我们可能会最终过拟合该模型. 过拟合指的是在测试数据上表现良好, 但在未知数据上却并不理想的情况. 我们希望我们的机器学习模型在未知数据上表现良好.
准备
在讨论如何执行交叉验证之前, 让我们谈谈性能指标. 当我们处理机器学习模型时, 我们通常关心三个事情: 精确率, 召回率和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)) + "%")