機器學習中的多標籤排序指標 - 覆蓋率誤差
評估多標籤模型的質量需要使用多標籤排序指標,其中一個指標是覆蓋率誤差,它量化了排序模型覆蓋特定例項所有相關標籤的能力。
多標籤排序任務涉及將多個相關標籤分配給給定例項,例如標記影像或對文件進行分類。在本文中,我們將深入探討覆蓋率誤差的概念,並探討其在評估多標籤排序模型有效性方面的意義。
什麼是覆蓋率誤差?
覆蓋率誤差是機器學習中用於評估多標籤排序模型的指標。它衡量模型覆蓋每個例項所有相關標籤的能力。覆蓋率誤差越低,表示效能越好,零表示完美覆蓋,所有真實標籤都得到了正確預測。
覆蓋率誤差的數學表示式可以定義如下:
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 的覆蓋率誤差表明,與真實標籤相比,模型預測中沒有缺少或不正確的標籤。
結論
總之,覆蓋率誤差是評估機器學習中多標籤排序模型效能的重要指標。它量化了模型準確預測每個例項所有相關標籤的能力。獲得較低的覆蓋率誤差表示在多標籤排序任務中具有更高的準確性和有效性。