使用 Python 进行机器学习模型的评估指标及代码

17 Mar 2025 | 阅读 17 分钟

为了评估机器学习模型的有效性,评估是必不可少的。机器学习模型通过各种度量标准进行评估。为了根据性能优化模型,选择最佳指标至关重要。在本教程中,我们将深入探讨分类模型中评估指标的数学基础和用法。

通过构建一个 ML 分类模型,我们可以开始讨论评估标准。在这里,我们在 Sklearn 库内置的数据集中的乳腺癌数据上使用了一个随机森林分类模型。

为了设置适当的环境,我们首先需要导入必要的库和模块。然后我们将加载数据并将其分割成训练集和测试集。我们将构建模型并计算各种准确性指标。

分类指标

我们将看到可用于评估分类机器学习模型的指标。

分类准确率

分类准确率是指所有预测事件中正确预测事件的百分比。

在分类问题中使用此评估指标时,通常会被滥用。只有当每个类别的观测值数量相等(这种情况很少发生)并且所有预测和预测错误具有相等的权重时,它才是合适的,而这通常不是事实。

这是分类准确率计算方式的示例。

代码

输出

The accuracy matrix is: [0.98245614 0.98245614 0.94736842 0.96491228 0.94736842 0.94736842
 0.94736842 0.96491228 0.98245614 0.96428571]
The mean accuracy is: 0.963095238095238, and the standard deviation is: 0.014566692235547473

正如我们所见,使用 `cross_val_score` 函数,我们可以获得平均准确率分数和准确率分数的标准差。

对数损失

另一种评估指标是逻辑损失,也称为对数损失(简称)。此指标评估目标类别属于某个类别的预测概率。

概率范围是 [0, 1]。然而,对数损失是此概率值的负平均值。因此,较低的对数损失值优于较高的对数损失值。它衡量算法在预测或分类不同类别的属性时的置信度。通过奖励正确预测并降低错误预测来衡量此置信度值。

以下是用 Python 语言查找分类器对数损失值的代码。我们将使用糖尿病数据集和支持向量分类器来对数据进行分类。

代码

输出

0.10352623753628318

对数损失值越接近 0,模型越好。0 是完美的对数损失分数。

模型的随机性或评估过程,以及数值精度的差异,可能会导致您的结果有所不同。考虑执行此场景几次并对比典型结果。

ROC 曲线下面积

ROC 曲线下面积,或缩写 AUC-ROC,是用于评估二元分类问题的性能指标。

AUC 值表示分类模型对正类和负类进行分类的能力。面积为 1 表示模型正确分类了所有属性。面积为 0.5 表示模型随机分类模型。小于该值表示模型偏向于某个特定类别。

用于绘制属于某个类别的概率的真正例值和假正例值图,称为 ROC 曲线。ROC 曲线边界下的面积是曲线函数的大致定积分。

下面是用 Python 计算 AUC-ROC 的代码。

代码

输出

0.9979423868312757

由于 `auc_roc_score` 值非常接近 1,这意味着模型几乎完美地分类了数据集的类别。

模型的随机性或评估过程,以及数值精度的差异,可能会导致您的结果有所不同。考虑执行此场景几次并对比典型结果。

混淆矩阵

混淆矩阵是分类模型准确性的表示。模型可以分类两个以上的类别。表格的 x 轴是模型进行的预测,y 轴是预测的实际值。混淆矩阵的单元格给出了分类模型所做预测的数量。

例如,分类模型可以预测正类和负类,每个预测都可以有正类和负类的值。模型将属性预测为负类但实际上是负类的次数出现在单元格“预测 = 负类”和“实际 = 负类”中。然而,模型将属性预测为正类但实际上是正类的次数出现在单元格“预测 = 正类”和“实际 = 正类”中。

这是混淆矩阵的表示

Evaluation Metrics for Machine Learning Models with Codes in Python

真阳性(True Positive):- 指模型将一个自变量预测为正类,而实际值为正类的次数。

假阳性(False Positive):- 指模型将一个自变量预测为正类,而实际值为负类的次数。

真阴性(True Negative):- 指模型将一个自变量预测为负类,而实际值为负类的次数。

假阴性(False Negative):- 指模型将一个自变量预测为负类,而实际值为正类的次数。

这是展示如何在 Python 中计算分类模型混淆矩阵的代码。

代码

输出

The confusion matrix is:
 [[17 1]
 [ 1 26]]

有大量的真阳性和真阴性预测。只有两次预测是假阴性和假阳性。这意味着模型在正确分类目标类别方面非常高效。

分类报告

当我们处理分类模型时,Sklearn 提供了一个分类报告功能。该报告对我们用于分类数据集的分类模型的准确性进行了总结。

`classification_report()` 函数给出了每个类别的精确率(precision)、召回率(recall)、F1 分数(F1 score)和支持度(support)值。

下面是用 Python 代码片段展示如何打印此分类报告。

代码

输出

              precision    recall  f1-score   support

           0       0.94      0.94      0.94        18
           1       0.96      0.96      0.96        27

    accuracy                           0.96        45
   macro avg       0.95      0.95      0.95        45
weighted avg       0.96      0.96      0.96        45

精确率和召回率

精确率和召回率是同一枚硬币的两面。精确率的计算方法是将真阳性预测的总数除以所有阳性预测的总数,即真阳性与假阳性之和。假阳性是模型通过将属性预测为阳性但实际上是阴性而做出的不正确预测。

召回率是另一种指标,它能够确定某个类别的所有相关实例,即所有相关的阳性类别和所有相关的阴性类别。精确率表示模型根据类别的实例比例,而召回率则表示这些实例的真实比例。

正如我们所说,精确率和召回率是同一枚硬币的两面,这是因为如果我们把所有假阳性都变为真阳性,精确率将为 1,但召回率会非常低,因为也会有假阴性。然而,如果反过来,把所有假阴性都变为真阳性,召回率将为 1,但精确率会非常低。因此,简单来说,如果我们提高精确率,召回率就会降低;如果我们提高召回率,精确率就会降低。

代码

输出

The precision score is: 0.8983050847457628
The recall score is: 0.9814814814814815

F1 分数

在某些情况下,我们可能需要在牺牲另一个指标的情况下最大化召回率分数或精确率分数。例如,在对患者进行疾病筛查以进行进一步检查时,我们可能希望召回率接近 1。也就是说,我们希望分类出所有真正患有疾病的患者,并接受非常低的精确率值,这意味着我们将一些实际上没有患病的患者错误地诊断为患病。然而,在这种情况下,应该有一个精确率和召回率的最佳组合。对于这种情况,我们可以将这两个指标合并为一个,称为 F1 分数。

F1 分数是通过计算两个分数值的调和平均数来计算的。

我们使用调和平均数而不是简单平均数是有原因的。调和平均数能够惩罚变量的极端值。精确率得分为 1,召回率得分为 0 的分类模型,其简单平均值为 0.5。然而,在这种情况下,F1 分数将为 0。对于 F1 分数,两个度量都具有相等的权重,它是更一般的 F-beta 指标的一个特例,其中我们可以调整 beta 来为任一度量赋予所需的权重值。如果我们希望构建一个在精确率和召回率之间达到最佳平衡的分类器,我们就必须最大化 F1 分数。

代码

输出

The F1 score is: 
0.9380530973451328

回归指标

在本节中,我们将回顾可用于评估回归模型的指标。

平均绝对误差

MAE 是预测值减去实际值的绝对值的平均值。误差项给出了模型预测错误的程度。

该度量值是预测值中误差的幅度。但该值不告诉误差的方向。这意味着它不告诉是高估了值还是低估了值。

下面是用 Python 计算平均绝对误差值的代码。我们将使用数据集来拟合线性回归模型。

代码

输出

41.64919844144016

MAE 为 0 表示模型在预测中没有误差,或者它完美地预测了值。

我们使用 `metrics` 包的 `mean_absolute_error` 函数来计算 MAE。

均方误差

均方误差与我们上面计算的平均绝对误差相似。此指标也提供了预测值中误差测量的净度量。

我们通过取误差项平方的平均值的平方根来计算 MSE。这会将误差的单位转换回输出值的单位,并可以提供对预测值的有意义的描述。此误差称为均方根误差(RMSE)。

下面是用 Python 代码展示如何计算均方误差值。

代码

输出

Mean Squared Error: 
2827.084017424082
Root Mean Squared Error: 53.17033023617666

值增加表明预测值中的误差非常大。

要计算均方根误差,我们需要计算结果误差项绝对值的平方根。

均方根对数误差 (RMSLE)

如果我们对 RMSE 指标取对数,我们就会得到 RMSLE。取对数会减慢误差的尺度。如果您正在开发一个不调用属性的回归模型,此指标非常有用。在这种情况下,输出值将在较大的尺度上分布。

为了应对这种情况,我们取 RMSE 误差的对数,结果就是 RMSLE。

代码

输出

Root Mean Sqaured Log Error: 0.14495165917354452

R^2 指标

R^2 指标表明模型拟合数据的程度。简单来说,模型能够使用自变量预测因变量值的程度。在统计学上,此指标称为决定系数。此指标还告诉我们提供给模型的自变量是否有助于预测目标变量的值,或者数据集中是否存在一些冗余的自变量需要删除。

R 方误差的值介于 0 和 1 之间,其中 R^2 = 1 表示模型完美拟合数据。

下面是一个示例,展示了如何在 Python 中确定决定系数或 R 方误差的值。

代码

输出

R^2 value is: 0.43845439143447806

在上述模型拟合中,r-square 的值小于 0.5。这意味着模型与数据的拟合不佳。R^2 分数 0.7 被认为是相当不错的值。

调整后的 R 平方

R 平方指标的问题在于,如果我们向数据添加新特征,R 平方分数会持续增加,或者保持不变,但绝不会减少。这是因为该指标假设当我们添加新特征时,数据的方差会增加。

然而,问题在于,当我们向数据集中添加不相关的属性时,有时 R 平方也会开始增加,这是错误的。

因此,为了解决这个问题,统计学家引入了调整后的 R 平方误差。

现在,如果我们向数据添加更多特征,根据调整后的 R 平方的公式,其值将开始下降。

如果我们向数据集中添加一个相关的属性,R 平方分数将增加,而 (1 - R 平方) 将大大减小,公式的分母也将减小,因此整个项将减小,如果我们从 1 中减去这个项,分数将增加。

代码

输出

The R^2 value is: 0.43845439143447806
The adjusted R^2 value is: 0.39242606286353365

最大误差

均方根误差是回归模型中最常用的评估指标。但有时该指标难以解释。此指标的替代方法是计算预测值与真实值之间的绝对百分比误差,然后评估这些值分布的分位数。最大误差指标告诉我们使用预测值和真实值可能出现的最坏情况下的误差。

代码

输出

The max error is: 
150.19876023168362

下一主题Pythonping 模块