多标签排名指标 - 机器学习中的覆盖误差
评估多标签模型的质量需要使用多标签排名指标,其中一个指标是覆盖误差,它量化了排名模型覆盖特定实例的所有相关标签的能力。
多标签排名任务涉及为给定实例分配多个相关标签,例如标记图像或对文档进行分类。在本文中,我们深入探讨覆盖误差的概念,并探讨其在评估多标签排名模型的有效性方面的重要性。
什么是覆盖误差?
覆盖误差是机器学习中用于评估多标签排名模型的指标。它衡量模型覆盖每个实例的所有相关标签的能力。覆盖误差越低,表示性能越好,零表示完美覆盖,所有真实标签均被正确预测。
覆盖误差的数学表达式可以定义如下 −
覆盖误差 = (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 表示与真实标签相比,模型的预测中没有缺失或不正确的标签。
结论
总之,覆盖误差是评估机器学习中多标签排名模型性能的宝贵指标。它量化了模型准确预测每个实例的所有相关标签的能力。实现较低的覆盖误差表明多标签排名任务的准确性和有效性更高。