精度与召回率–适用于每个
机器学习人员的直观指南
向任何机器学习专业人员或数据科学家询问他们学习过程中最令人困惑的概念。答案总是趋向于精确和召回。
实际上,Precision和Recall之间的区别很容易记住-但只有在您真正了解了每个术语的含义之后,才可以记住。但是很多时候,而且我可以证明这一点,专家们倾向于提供半生半熟的解释,这会使新来者更加困惑。
因此,让我们直接在本文中创下记录。
精确度和召回率
对于任何机器学习模型,我们都知道在模型上实现“良好拟合”是至关重要的。这涉及在欠拟合和过度拟合之间取得平衡,或者换句话说,在偏差和方差之间进行权衡。
但是,当涉及分类时,往往会偏爱另一种权衡,而倾向于偏差方差权衡。这是精确调用的权衡。不平衡的类通常出现在数据集中,当涉及到特定的用例时,我们实际上希望更加重视精度和召回率指标,以及如何实现它们之间的平衡。
但是,怎么做呢?在本文中,我们将重点关注精度和召回率来探索分类评估指标。我们还将学习如何通过获取数据集和简单的分类算法在Python中计算这些指标。所以,让我们开始吧!
您可以在此处深入了解评估指标-机器学习模型的评估指标。
目录
了解问题陈述
什么是精度?
什么是召回?
最简单的评估指标-准确性
F1-Score的作用
著名的精确召回权衡
了解曲线下的面积(AUC)
了解问题陈述
我坚信边干边学。因此,在本文全文中,我们将使用数据集以实用的方式进行讨论。
让我们来谈谈UCI存储库中流行的心脏病数据集。在这里,我们必须预测患者是否正在患心脏病,或者没有使用给定的功能。您可以从此处下载干净的数据集。
由于本文仅关注模型评估指标,因此我们将使用最简单的分类器– kNN分类模型进行预测。
与往常一样,我们将从导入必要的库和包开始:
然后让我们看一下我们正在处理的数据和目标变量:
精度和召回率-数据头
让我们检查是否缺少值:
精度和召回率-缺少值
没有缺失值。现在我们来看看实际上有多少患者患有心脏病(1),有多少没有(0):
这是下面的计数图:
精度和召回率-目标变量的分布
让我们继续分割训练和测试数据以及输入和目标变量。由于我们使用KNN,因此也必须扩展数据集:
选择k的最佳值的直觉超出了本文的范围,但是我们应该知道,当我们获得k的最高测试得分时,就可以确定k的最佳值。为此,我们可以评估多达20个最近邻居的训练和测试分数:
要评估最大测试成绩和与之相关的k个值,请运行以下命令:
精度和召回率-测试成绩
因此,我们获得了k的最佳值为3、11或20,得分为83.5。我们将最终确定这些值之一,并相应地拟合模型:
精度和召回率-测试成绩
现在,我们如何评估该模型是否为“好”模型?为此,我们使用一种称为混淆矩阵的方法:
精度和召回率-混淆矩阵
混淆矩阵可帮助我们深入了解我们的预测的正确性以及它们如何与实际值保持一致。
从我们的训练和测试数据中,我们已经知道我们的测试数据包含91个数据点。最后是第三行和第三列的值。我们还注意到,存在一些实际值和预测值。实际值是最初归为0或1的数据点数。预测值是我们的KNN模型预测为0或1的数据点数。
实际值为:
实际没有心脏病的患者= 41
确实患有心脏病的患者= 50
预测值为:
预计没有心脏病的患者人数= 40
预计患有心脏病的患者人数= 51
我们在上面获得的所有值都有一个术语。让我们一一介绍它们:
患者实际上没有心脏病并且我们的模型也预测为没有心脏病的情况称为真阴性。对于我们的矩阵,真负数= 33。
患者实际患有心脏病并且我们的模型也预测患有这种疾病的情况称为“真实阳性”。对于我们的矩阵,正正= 43
但是,在某些情况下,患者实际上没有心脏病,但是我们的模型预测他们确实患有心脏病。这种错误是类型I错误,我们将值称为误报。对于我们的矩阵,误报= 8
同样,在某些情况下患者实际上患有心脏病,但我们的模型预测他/她没有。这种错误是II型错误,我们将值称为False Negatives。 对于我们的矩阵,假阴性= 7
什么是精度?
是的-现在我们来解决本文的关键。世界到底是什么?上述所有学习与之有什么关系?
用最简单的术语来说,精度是真实正值与所有正值之间的比率。对于我们的问题陈述,这将是我们在所有实际患有心脏病的患者中正确识别出患有心脏病的患者的度量。数学上:
精度和召回率-精度
我们的模型的精度是多少?是的,它是0.843,或者当它预测患者患有心脏病时,大约84%的时间是正确的。
精度还为我们提供了相关数据点的度量。重要的是我们不要开始治疗实际上没有心脏疾病的患者,但是我们的模型预测会患有心脏疾病。
什么是召回?
召回是我们模型正确识别“真实肯定”的度量。因此,对于所有实际患有心脏病的患者,召回率告诉我们我们正确识别出多少人患有心脏病。数学上:
召回
对于我们的模型,召回率= 0.86。召回率还可以衡量我们的模型能够多么准确地识别相关数据。我们称其为灵敏度或真实正利率。如果患者患有心脏病,但由于我们的模型预测没有得到治疗,该怎么办?我们希望避免这种情况!
最容易理解的指标-准确性
现在我们来谈谈最简单的指标之一,准确性。准确性是正确预测的总数与预测的总数之比。您能猜出精度的公式是什么?
精度和召回率-准确性
对于我们的模型,准确度将为0.835。
将准确性作为模型的定义指标在直觉上确实有意义,但通常还是建议使用Precision和Recall。在其他情况下,我们的精度可能很高,但精度或召回率却很低。理想情况下,对于我们的模型,我们希望完全避免患者患有心脏病的任何情况,但是我们的模型将其归类为没有心脏病,即旨在提高召回率。
另一方面,对于患者未患心脏病且我们的模型预测相反的情况,我们也希望避免对没有心脏病的患者进行治疗(在输入参数可能指示不同疾病的情况下,这一点很重要,但是我们最终因心脏病将他/她接受治疗)。
尽管我们确实追求高精度和高召回价值,但同时实现这两个目标是不可能的。例如,如果我们将模型更改为具有较高召回率的模型,则可能会检测到所有实际患有心脏病的患者,但最终可能会给许多未患心脏病的患者提供治疗。
同样,如果我们以高精度为目标,以避免进行任何错误和不需要的治疗,那么最终会导致许多实际上患有心脏病的患者未经任何治疗。
F1-Score的作用
了解准确性使我们意识到,我们需要在精确度和召回率之间进行权衡。我们首先需要确定哪个对我们的分类问题更重要。
例如,对于我们的数据集,我们可以认为实现高召回率比获得高精度更为重要–我们希望尽可能多地检测心脏病患者。对于其他一些模型,例如对银行客户是否是违约贷款人进行分类,则希望具有较高的精度,因为银行不希望失去基于模型的预测而被拒绝贷款的客户。违约者。
在很多情况下,精确度和召回率都同样重要。例如,对于我们的模型,如果医生告知我们被错误分类为患有心脏病的患者同等重要,因为它们可能表明存在其他疾病,那么我们不仅要提高召回率,而且要提高精度也是如此。
在这种情况下,我们使用称为F1分数的东西。F1分数是精确度和召回度的谐波平均值:
F1-分数
从现在开始,这很容易使用,而不是在精度和召回率之间取得平衡,我们只能瞄准一个好的F1分数,这也将表明它具有良好的精度和良好的召回值。
我们也可以使用sklearn为我们的数据集生成上述指标:
ROC曲线
除了上述术语外,我们还可以从混淆矩阵中计算出更多的值:
误报率(FPR):误报率与实际否定数之比。在我们的模型中,这是对模型预测所有实际没有心脏病的患者中有心脏病的案例的度量。对于我们的数据,FPR = 0.195
真阴性率(TNR)或特异性:真阴性率与实际阴性数之比。对于我们的模型,这是对模型正确预测出实际上没有心脏病的所有患者中没有心脏病的案例的度量。以上数据的TNR = 0.804。从这两个定义中,我们还可以得出结论,即特异性或TNR = 1 – FPR
我们还可以使用ROC曲线和PRC曲线来可视化Precision和Recall。
1. ROC曲线(接收机工作特性曲线):
它是TPR(y轴)和FPR(x轴)之间的图。由于我们的模型基于为每个类别生成的概率将患者分类为患有心脏病或未患有心脏病,因此我们也可以确定概率阈值。
例如,我们想要将阈值设置为0.4。这意味着如果患者患心脏病的概率大于0.4,则该模型会将数据点/患者分类为患有心脏病。显然,这将提供较高的召回值,并减少误报的数量。同样,我们可以使用ROC曲线可视化模型在不同阈值下的表现。
让我们为k = 3的模型生成ROC曲线。
精度和召回率-ROC
AUC解释-
在最低点,即(0,0)-阈值设置为1.0。这意味着我们的模型将所有患者分类为没有心脏病。
在最高点,即(1,1),阈值设置为0.0。这意味着我们的模型将所有患者分类为患有心脏病。
曲线的其余部分是0到1之间的阈值的FPR和TPR值。在某个阈值处,我们观察到FPR接近0时,TPR接近1。可以完美地预测患有心脏病的患者。
以曲线和轴为边界的区域称为“曲线下面积”(AUC)。正是这个区域被视为良好模型的度量。该指标的范围是0到1,我们应该争取较高的AUC值。具有较高AUC的模型被称为具有良好技能的模型。让我们计算模型和上面的图的AUC分数:
我们得到的AUC值为0.868,这是一个非常不错的成绩!用最简单的话来说,这意味着该模型将能够区分患有心脏病的患者和那些没有87%的时间的患者。我们可以提高此分数,我敦促您尝试不同的超参数值。
对角线是AUC为0.5的随机模型,是一种没有技巧的模型,与进行随机预测相同。你能猜出为什么吗?
2.精确召回曲线(PRC)
顾名思义,该曲线直接表示精度(y轴)和召回率(x轴)。如果您遵循上面关于“精确度和召回率”的定义和公式,您会发现我们绝不会使用“真阴性”(没有心脏病的实际人数)。
这对于以下情况特别有用:数据集不平衡,阴性数比阳性数大得多(或者没有心脏病的患者数比患有心脏病的患者大得多)。在这种情况下,我们最关心的是尽可能正确地检测出患有心脏病的患者,并且不需要TNR。
像ROC一样,我们绘制精度并调用不同阈值:
中华人民共和国的解释:
在最低点,即(0,0)-阈值设置为1.0。这意味着我们的模型不会区分患有心脏病的患者和没有心脏病的患者。
在最高点,即(1,1),阈值设置为0.0。这意味着我们的准确性和召回率都很高,并且该模型可以完美区分。
曲线的其余部分是0到1之间阈值的Precision和Recall值。我们的目标是使曲线尽可能接近(1,1),这意味着良好的精度和召回率。
与ROC相似,以曲线和轴为边界的区域是曲线下面积(AUC)。将此区域视为良好模型的度量。AUC的范围是0到1。因此,我们应该争取较高的AUC值。让我们为模型和上图计算AUC:
和以前一样,我们获得了约90%的良好AUC。此外,该模型可以在召回率为0的情况下实现高精度,并且通过降低50%的精度可以实现很高的召回率。
题库