机器学习 覆盖误差
评估多标签模型的质量需要使用多标签排序度量,其中之一就是覆盖误差,它量化了排序模型在特定实例上覆盖所有相关标签的能力。
多标签排序任务涉及给定实例分配多个相关标签,例如标记图像或对文档进行分类。在本文中,我们深入探讨了覆盖误差的概念,并探讨了它在评估多标签排序模型有效性方面的重要性。
什么是覆盖误差
覆盖误差是一种用于评估多标签排序模型的度量指标。它衡量了模型在每个实例上覆盖所有相关标签的能力。较低的覆盖误差表示更好的性能,其中零表示完美覆盖,即所有真实标签都被正确预测。
覆盖误差的数学表达式可以定义如下 –
Coverage Error = (1/N) * Σ |Yi - Ŷi|
在哪里 –
N
代表评估集中实例的总数。-
Yi
表示第i个实例的真实标签集。 -
Ŷi
表示第i个实例的预测标签集。 -
|Yi - Ŷ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个实例在模型的预测中与真实标签相比缺少一个标签。
使用内置的数据集(鸢尾花)的程序 –
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的覆盖错误率表示模型的预测与真实标签相比不存在缺失或错误的标签。
结论
总之,覆盖错误率是评估机器学习中多标记排序模型性能的有价值指标。它量化了模型准确预测每个实例的所有相关标签的能力。较低的覆盖错误率表示多标记排序任务中的更高准确性和效果。