导读:在真实场景中,模型很少能成功地预测所有的内容。我们知道应该使用测试集的数据来评估我们的模型。但是这到底是如何工作的呢?
简短但不是很有用的答案是,这取决于模型。人们已经提出了各种评分函数,它可用于在所有可能的场景中评估训练模型。好消息是,很多评分函数实际上是scikit-learn的metrics模块的一部分。
让我们快速了解一些最重要的评分函数。
作者:阿迪蒂亚·夏尔马(Aditya Sharma)、维什韦什·拉维·什里马利(Vishwesh Ravi Shrimali)、迈克尔·贝耶勒(Michael Beyeler)
来源:大数据DT(ID:hzdashuju)
01 使用准确率、精度和召回率评分分类器
在二值分类任务中只有两个不同的类标签,有许多不同的方法来度量分类性能。一些常见的评估指标如下所示:
accuracy_score:准确率(accuracy)计算测试集中预测正确的数据点数,并返回正确预测的数据点的比例。以将图片分类为猫或狗为例,准确率表示正确分类为包含猫或狗的图片比例。该函数是最基本的分类器评分函数。
precision_score:精度(precision)描述了一个分类器不把包含狗的图片标记为猫的能力。或者说,在分类器认为测试集所有包含猫的图片中,精度是实际包含一只猫的图片比例。
recall_score:召回率(recall,或者敏感度)描述了一个分类器检索包含猫的所有图片的能力。或者说,测试集所有包含猫的图片中,召回率是正确识别为猫的图片比例。
假设我们有一些ground truth(正确与否取决于我们的数据集)类标签,不是0就是1。我们使用NumPy的随机数生成器随机生成数据点。显然,这意味着只要我们重新运行代码,就会随机生成新数据点。
我们希望你能够运行代码,并总是得到和书中相同的结果。实现此目的的一个很好的技巧是固定随机数生成器的种子。这会保证你在每次运行脚本时,都以相同的方式初始化生成器:
1)我们使用下列代码可以固定随机数生成器的种子:
import numpy as np
np.random.seed(42)
2)然后,选取(0, 2)范围内的随机整数,我们可以生成0或1的5个随机标签:
y_true = np.random.randint(0, 2, size=5)
y_true
Out:
array([0, 1, 0, 0, 0])
在文献中,这两类有时也被称为正样例(类标签是1的所有数据点)和负样例(其他所有数据点)。
假设我们有一个分类器试图预测之前提到的类标签。为方便讨论,假设分类器不是很聪明,总是预测标签为1。通过硬编码预测标签,我们可以模拟这种行为:
y_pred = np.ones(5, dtype=np.int32)
y_pred
Out:
array([1, 1, 1, 1, 1], dtype=int32)
我们预测的准确率是多少?
如前所述,准确率计算测试集中预测正确的数据点数,并返回测试集大小的比例。我们只是正确地预测了第二个数据点(实际标签是1)。除此之外,实际标签是0,而我们预测为1。因此,我们的准确率应该是1/5或者0.2。
准确率指标的一个简单实现可总结为:预测的类标签与实际类标签相符的所有情况。
test_set_size = len(y_true)
predict_correct = np.sum(y_true == y_pred)
predict_correct / test_set_size
Out:
0.2
scikit-learn的metrics模块提供了一个更智能、更便捷的实现: