多标签排名指标 - 机器学习中的覆盖误差

machine learningpythondata science更新于 2024/2/2 23:27:00

评估多标签模型的质量需要使用多标签排名指标,其中一个指标是覆盖误差,它量化了排名模型覆盖特定实例的所有相关标签的能力。

多标签排名任务涉及为给定实例分配多个相关标签,例如标记图像或对文档进行分类。在本文中,我们深入探讨覆盖误差的概念,并探讨其在评估多标签排名模型的有效性方面的重要性。

什么是覆盖误差?

覆盖误差是机器学习中用于评估多标签排名模型的指标。它衡量模型覆盖每个实例的所有相关标签的能力。覆盖误差越低,表示性能越好,零表示完美覆盖,所有真实标签均被正确预测。

覆盖误差的数学表达式可以定义如下 −

覆盖误差 = (1/N) * Σ |Yi - Ŷi|

其中 −

  • N 表示评估集中的实例总数。

  • Yi 表示第 i 个实例的真实标签集。

  • Ŷi 表示第 i 个实例的预测标签集。

  • |Yi - Ŷi|表示真实标签与预测标签之间的绝对差异,表示第 i 个实例的缺失标签数。

通过将所有实例的绝对差异相加并除以实例总数 (N),我们得到平均覆盖误差,从而评估模型准确覆盖相关标签的能力。

如何计算多标签排名指标 - 覆盖误差?

以下是我们将遵循的计算多标签排名指标 - 覆盖误差的步骤 -

  • 获取数据集中每个实例的真实标签和预测标签。

  • 确定数据集中的实例数和标签数。

  • 初始化一个数组或列表来存储每个实例的覆盖误差。

  • 对于每个实例 −

    • 通过查找真实标签值为 1 的索引来识别真实标签。

    • 通过查找预测标签值为 1 的索引来识别预测标签。

    • 计算真实标签和预测标签之间的集合差异以找到缺失的标签。

    • 将缺失标签的数量存储在该实例的覆盖率误差数组中。

  • 通过取覆盖率误差数组的平均值来计算平均覆盖率误差。

  • 结果值表示多标签排名模型的覆盖率误差指标。

示例

下面是两个编程示例,一个是通过创建我们自己的数据集,另一个是使用内置数据集。

import numpy as np

def coverage_error(y_true, y_pred):
   num_samples, num_labels = y_true.shape
   coverage = np.zeros(num_samples)

   for i in range(num_samples):
      true_labels = set(np.where(y_true[i])[0])
      predicted_labels = set(np.where(y_pred[i])[0])
      coverage[i] = len(true_labels - predicted_labels)

   return np.mean(coverage)

# 示例用法
y_true = np.array([[1, 0, 1, 0],
                  [0, 1, 0, 1],
                  [1, 0, 0, 1]])

y_pred = np.array([[1, 0, 1, 0],
                  [0, 1, 1, 0],
                  [1, 0, 0, 0]])

error = coverage_error(y_true, y_pred)
print("覆盖率误差:", error)

输出

覆盖率误差:0.6666666666666666

覆盖率误差得分为 0.66666666,这意味着平均而言,我们需要包含 66% 的排名靠前的标签才能覆盖所有真实标签。这是一个相对较好的分数,但可以通过使用不同的模型或调整模型的超参数来改进。

评估集中有三个实例,用 y_true 和 y_pred 中的行表示。每个实例都有四个标签。

对于第一个实例 -

  • 真实标签为 [0, 2](y_true 第一行中值为 1 的元素的索引)。

  • 预测标签为 [0, 2](y_pred 第一行中值为 1 的元素的索引)。

  • 真实标签和预测标签之间的差异是一个空集 ([]),因为两个集合相同。

  • 因此,第一个实例的覆盖误差为 0。

对于第二个实例 -

  • 真实标签为 [1, 3](y_true 第二行中值为 1 的元素的索引)。

  • 预测标签为[1, 2](y_pred 第二行中值为 1 的元素的索引)。

  • 真实标签与预测标签之间的差异为 [3]。

  • 因此,第二个实例的覆盖误差为 1。

对于第三个实例 

  • 真实标签为 [0, 3](y_true 第三行中值为 1 的元素的索引)。

  • 预测标签为 [0](y_pred 第三行中值为 1 的元素的索引)。

  • 真实标签与预测标签之间的差异为[3]。

  • 因此,第三个实例的覆盖误差为 1。

要计算总体覆盖误差,我们取所有实例的覆盖误差的平均值 −

(0 + 1 + 1) / 3 = 2 / 3 = 0.66666666666666666

因此,示例中的覆盖误差为 0.6666666666666666,表明平均而言,3 个实例中有 2 个在模型的预测中与真实标签相比缺少一个标签。

使用内置数据集 (Iris) 的程序 −

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MultiLabelBinarizer
import numpy as np

def coverage_error(y_true, y_pred):
    num_samples, num_labels = y_true.shape
    coverage = np.zeros(num_samples)

    for i in range(num_samples):
      true_labels = set(np.where(y_true[i])[0])
      predicted_labels = set(np.where(y_pred[i])[0])
      coverage[i] = len(true_labels - predicted_labels)

   return np.mean(coverage)

# 加载 Iris 数据集
iris = load_iris()

# 数据清理和预处理
X = iris.data
y = iris.target.reshape(-1, 1)

# 将标签转换为二进制形式
mlb = MultiLabelBinarizer()
y = mlb.fit_transform(y)

# 将数据集拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 示例用法
error = coverage_error(y_test, y_test)
print("覆盖率误差:", error)
覆盖率误差:0.0

在上面的例子中,覆盖率误差为 0.0,这意味着多标签排名模型完美覆盖了 Iris 测试集中的每个实例的所有相关标签数据集。覆盖误差为 0.0 表示与真实标签相比,模型的预测中没有缺失或不正确的标签。

结论

总之,覆盖误差是评估机器学习中多标签排名模型性能的宝贵指标。它量化了模型准确预测每个实例的所有相关标签的能力。实现较低的覆盖误差表明多标签排名任务的准确性和有效性更高。


相关文章