机器学习中的度量和评估,包括回归和分类度量之间的差异。它还引入了损失函数的概念,它衡量模型预测的性能或错误,可用于基于梯度的训练。虽然损失函数针对梯度下降进行了优化,但指标优先考虑提供对模型有效性的直观理解。
简单来说,损失函数和度量虽然功能相似,但它们是不同的工具。有些指标不能用作损失函数,因为它们是不可微的。虽然一些损失函数很容易被人类理解,但指标优先考虑提供对模型性能的直观解释,而损失函数旨在优化梯度下降。
平均绝对误差
平均绝对误差 (MAE) 是一种常用的回归指标,用于衡量模型的预测值与训练数据的真实值之间的平均差异。它通过考虑预测值和真实值之间的绝对差异,提供了一种评估模型预测准确性的方法。
将numpy导入为np
def mean_absolute_error ( y_true, y_pred ):
assert y_pred.shape == y_true.shape
return np. 总和(np.absolute(y_true - y_pred)) / len (y_pred)
想象一个班级有 30 名学生参加考试,满分 100 分。老师根据每个学生过去在课堂上的表现预测了每个学生的考试成绩。然而,当实际考试成绩返回时,老师发现他们的预测并不准确。
为了评估他们预测的准确性,老师计算了他们的预测分数与每个学生的实际分数之间的差异。然而,由于他们想更全面地了解他们的预测总体上有多错误,他们决定取预测分数和实际分数之间所有差异的平均值。这称为平均绝对误差,它给出了一个值,表示班级中所有学生的预测分数和实际分数之间的平均差。
这种方法简单易懂,告诉我们标签和模型预测之间的平均差异。然而 , 一个主要问题是 MAE 不考虑异常值预测。因此,MAE 的问题在于它平等对待所有预测误差,而不管它们的大小。这可能是一个问题,因为与小误差相比,大的预测误差对模型有用性的影响要大得多。例如,偏差 50-55% 或更多的模型可能不是很有用,而仅偏差 1-6% 的模型可能仍被认为是相当准确的。
使用 sklearn 库一行实现:
从sklearn.metrics导入mean_absolute_error
mean_absolute_error(y_true, y_pred)
均方误差
顾名思义,均方误差将模型预测与真实标签之间的差异提高到二次方,而不是取绝对值。均方误差(MSE):
均方误差
然而,我们并不知道模型到底有多不正确。由于我们对结果进行平方而不是取绝对值,因此我们获得的分数不会与测试分数的范围成比例,例如,对于得分在 0 到 100 之间的测试,平均误差为 127.8 是不可能的。
将numpy导入为np
def mean_squared_error ( y_true, y_pred ):
assert y_pred.shape == y_true.shape
return np. 总和((y_true - y_pred) ** 2 ) / len (y_pred)
为了解决这个问题,我们可以取结果的平方根来“反转”提升到二次方的操作,将错误放入上下文尺度,同时仍然强调任何离群值预测。该指标是均方根误差 (RMSE):
均方根误差
将numpy导入为np
def root_mean_squared_error ( y_true, y_pred ):
assert y_pred.shape == y_true.shape
return mean_squared_error(y_true, y_pred) ** 0.5
使用 sklearn 库一行实现:
从sklearn.metrics导入mean_squared_error
mean_squared_error(y_reg_true, y_reg_pred)
mean_squared_error(y_reg_true, y_reg_pred) ** 0.5
MAE、MSE 和 RMSE 是回归任务中最重要的一些。
混淆矩阵
与使用 MAE 概念的回归指标类似,许多分类指标使用混淆矩阵来评估模型的性能。混淆矩阵提供了一种有用的可视化方式,可以显示分类任务中发生了多少错误以及发生了什么类型的错误。通过使用混淆矩阵,我们可以更好地了解分类模型的性能,并确定模型可能需要改进的任何特定区域。
混淆矩阵是一种用于通过将模型的预测与实际标签进行比较来评估模型性能的工具。它由四个部分组成:真阳性、假阳性、真阴性和假阴性。每个组件由两个词描述。第一个词表示模型的预测是正确的还是错误的(如果预测正确则为“true”,如果预测错误则为“false”)。第二个词指的是实际标签或基本事实(标签 1 为“正”,标签 0 为“负”)。
- 当模型预测为 1,ground truth 为 1 时,为真阳性。
- 当模型预测为 1 而 ground truth 为 0 时,它是误报。
- 当模型预测为 0 且 ground truth 为 0 时,它是一个真正的否定。
- 当模型预测为 0 而 ground truth 为 1 时,它是假阴性。
准确性
评估分类模型性能的最简单方法之一是计算其准确性。准确性衡量模型正确预测的值的百分比。用技术术语来说,准确性是通过将真阳性和真阴性的总和除以预测值的总数来计算的。
准确性
准确性是评估分类模型的常用指标,因为它易于理解和计算。然而,在处理不平衡数据时,准确性有一个缺点。不平衡数据是指一类样本明显多于另一类样本。在这种情况下,准确性可能会产生误导,因为它没有考虑数据中的不平衡。
将numpy导入为np
def 精度( y_true, y_pred ):
assert y_true.shape == y_pred.shape
return np.average(y_true == y_pred)
例如,如果有 100 个样本,其中 90 个属于正类,10 个属于负类,那么简单地将所有样本预测为正类的模型将达到 90% 的准确率,即使它不是一个好的模型。另一方面,能够正确预测 90 个正样本中的 81 个和 10 个负样本中的 9 个的完善模型要好得多。因此,在处理不平衡数据时,单靠准确性不足以评估分类模型。
使用 sklearn 库一行实现:
从sklearn.metrics导入accuracy_score
accuracy_score(y_class_true, y_class_pred)
精确
精度是一种考虑到数据中类别不平衡问题的度量。它通过计算真阳性与真阳性和假阳性之和的比率来衡量模型做出的阳性预测的准确性。精度对于惩罚在不平衡且具有大量负值的数据集中的正类上表现不佳的模型很有用。
精确
将numpy导入为np
def 精度(y_true,y_pred):
断言y_true.shape == y_pred.shape
返回((y_pred == 1)&(y_true == 1))。总和() / y_pred。求和()
它在负样本数量大大超过正样本数量的数据集中特别有用,例如在疾病诊断中。Precision 提供了有意义的见解,可以了解模型在预测罕见的正类时的准确性。
使用 sklearn 库一行实现:
从sklearn.metrics导入precision_score
precision_score(y_class_pred, y_class_pred)
记起
召回率是一种衡量模型做出的正类预测的正确性的指标。它测量所有正标签中真阳性(正确预测的阳性样本)的百分比。召回率在阳性类别很少见或对准确预测至关重要的情况下特别有用,例如在假阴性(未能识别疾病)可能危及生命的医学诊断中。在这些情况下,针对高召回率进行优化至关重要,即使这意味着要接受更高的误报率。
当开发完美模型的资源有限时,避免假阴性比避免假阳性重要得多,我们将优化以提高召回率,因为我们希望模型尽可能准确,尤其是在预测阳性类别时。
记起
import numpy as np
def recall ( y_true, y_pred ):
assert y_true.shape == y_pred.shape
return ((y_pred == 1 ) & (y_true == 1 )). 总和()/ y_true。求和()
使用 sklearn 库一行实现:
从sklearn.metrics导入recall_score
recall_score(y_class_true, y_class_pred)
F1分数
F1 分数是一种将精度和召回率结合到一个指标中的方法,可以更全面地了解模型的性能。使用调和平均数是因为精确率和召回率都表示为比率,因此我们需要一种方法将它们结合起来,考虑到它们的相对贡献。F1 分数对精确率和召回率给予同等的重视,这在我们想要平衡它们之间的权衡时很重要。例如,如果我们正在诊断一种罕见疾病,我们可能希望优化以提高召回率,但不以牺牲精确率为代价。F1 分数帮助我们找到这两个指标之间的最佳平衡点。
F1分数
def f1_score ( y_true, y_pred ):
num = ( 2 * precision(y_true, y_pred) * recall(y_true, y_pred))
denom = (precision(y_true, y_pred) + recall(y_true, y_pred))
return num / denom
与精确率和召回率相比,F1 分数可以更好地理解正类分类的准确性。
F1 分数可以扩展到 F-beta 分数,这允许调整对精确度和召回率的重视程度。beta 的值决定了每个指标的权重或重点。
泛化 F-Beta
将 beta 设置为低于 1 会为精度赋予更多权重,这意味着精度得分在调和平均期间的价值更高。另一方面,将 beta 设置为大于 1 的值会强调召回分数。这为精确度和召回分数的组合提供了更大的灵活性,因为注意力的数量可以根据情况进行调整。
使用 sklearn 库一行实现:
从sklearn.metrics导入f1_score
f1_score(y_class_true, y_class_pred)
F1 分数是评估模型正类预测准确性的有用指标,但它有一些局限性。一个限制是它只测量正类,不提供有关模型在负类上的表现如何的信息。另一个限制是它依赖于二元分类阈值,这可能不是给定问题的最佳阈值。这可能会导致丢失有关模型对其预测的置信度的重要信息。因此,在使用 F1 分数和其他二元评估指标时考虑这些限制很重要。
ROC-AUC
接受者操作特征曲线下的面积绘制了针对各种阈值的真阳性率与假阳性率的关系图。
召回率或真阳性率表示模型做出的所有阳性预测中正确预测的比例。另一方面,假阳性率是被错误分类为阳性的阴性样本的比率。它衡量模型在预测积极结果时出错的频率。通过绘制各种分类阈值的真阳性率和假阳性率,生成 ROC 曲线。这条曲线有助于确定最佳阈值,并允许我们可视化真阳性率和假阳性率之间的权衡。
ROC 曲线针对模型预测概率的不同阈值绘制真阳性率 (TPR) 与假阳性率 (FPR)。TPR 是实际正例被正确分类为正例的比例,而 FPR 是实际负例被错误分类为正例的比例。
def get_tpr_fpr ( y_pred, y_true ):
tp = (y_pred == 1 ) & (y_true == 1 )
tn = (y_pred == 0 ) & (y_true == 0 )
fp = (y_pred == 1 ) & (y_true = = 0 )
fn = (y_pred == 0 ) & (y_true == 1 )
tpr = tp. sum () / (tp.sum ( ) + fn.sum ( ))
fpr = fp.sum() sum () / (fp.sum ( ) + tn.sum ( ))
返回tpr,fpr
要绘制 ROC 曲线,我们需要计算各种阈值的真阳性率 (TPR) 和假阳性率 (FPR)。根据模型生成的预测概率,可以使用一个函数来计算每个阈值的 TPR 和 FPR。该函数选择特定数量的阈值并计算每个阈值的 TPR 和 FPR。然后将这些值存储在单独的列表中并由函数返回。
一旦我们有了不同阈值的 TPR 和 FPR 值,我们就可以绘制 ROC 曲线,其中 x 轴代表 FPR,y 轴代表 TPR。但是,很难使用积分计算曲线下面积 (AUC),因为我们没有一个精确的函数来表示所有 TPR 和 FPR 值的曲线。相反,我们可以通过将曲线划分为矩形部分并对它们的面积求和来估算面积。随着我们使用越来越多的矩形,估计的面积越来越接近曲线下的真实面积。AUC 提供了模型区分类别的程度的度量,值为 1 表示完美区分,值为 0.5 表示随机预测。
def roc_curve ( y_pred, y_true, n_thresholds= 100 ):
fpr_thresh = []
tpr_thresh = []
for i in range (n_thresholds + 1 ):
threshold_vector = (y_true >= i/n_thresholds)
tpr, fpr = get_tpr_fpr(y_pred, y_true)
fpr_thresh.append(fpr)
tpr_thresh.append(tpr)
返回tpr_thresh, fpr_thresh
def area_under_roc_curve ( y_true, y_pred ):
fpr, tpr = roc_curve(y_pred, y_true)
rectangle_roc = 0
for k in range( len (fpr) - 1 ):
rectangle_roc += (fpr[k]- fpr[k + 1 ]) * tpr[k]
返回 1 - rectangle_roc
使用 sklearn 库一行实现:
从sklearn.metrics导入roc_auc_score
roc_auc_score(y_true, y_pred)
本文讨论了机器学习中使用的各种指标和评估技术,包括准确性、精确度、召回率、F1 分数、ROC 曲线和 AUC。它解释了每个指标背后的直觉以及如何计算它们。本文还介绍了这些指标的局限性以及如何解决这些问题。总的来说,本文旨在揭开机器学习中度量和评估概念的神秘面纱,使初学者和从业者都更容易理解它们。