机器学习中的多标签排序指标 - 覆盖率误差
评估多标签模型的质量需要使用多标签排序指标,其中一个指标是覆盖率误差,它量化了排序模型覆盖特定实例所有相关标签的能力。
多标签排序任务涉及将多个相关标签分配给给定实例,例如标记图像或对文档进行分类。在本文中,我们将深入探讨覆盖率误差的概念,并探讨其在评估多标签排序模型有效性方面的意义。
什么是覆盖率误差?
覆盖率误差是机器学习中用于评估多标签排序模型的指标。它衡量模型覆盖每个实例所有相关标签的能力。覆盖率误差越低,表示性能越好,零表示完美覆盖,所有真实标签都得到了正确预测。
覆盖率误差的数学表达式可以定义如下:
Coverage Error = (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) # Example usage 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("Coverage Error:", error)
输出
Coverage 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.6666666666666666
因此,示例中的覆盖率误差为 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) # Load the Iris dataset iris = load_iris() # Data cleaning and preprocessing X = iris.data y = iris.target.reshape(-1, 1) # Convert labels to binary form mlb = MultiLabelBinarizer() y = mlb.fit_transform(y) # Split the dataset into train and test sets X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Example usage error = coverage_error(y_test, y_test) print("Coverage Error:", error)
Coverage Error: 0.0
在上面的示例中,覆盖率误差为 0.0,这意味着多标签排序模型完美地覆盖了 Iris 数据集测试集中每个实例的所有相关标签。0.0 的覆盖率误差表明,与真实标签相比,模型预测中没有缺少或不正确的标签。
结论
总之,覆盖率误差是评估机器学习中多标签排序模型性能的重要指标。它量化了模型准确预测每个实例所有相关标签的能力。获得较低的覆盖率误差表示在多标签排序任务中具有更高的准确性和有效性。