Công thức Closeness Evaluation Measure (CEM) là một công cụ được thiết kế để đánh giá các hệ thống phân loại thứ tự (ordinal classification), đặc biệt khi các nhãn có tính thứ tự và các lỗi phân loại có mức độ nghiêm trọng khác nhau. Công thức này dựa trên lý thuyết đo lường (Measurement Theory) và lý thuyết thông tin (Information Theory). Để hiểu rõ hơn, chúng ta sẽ phân tích từng thành phần trong công thức của CEM:
Đây là đầu ra dự đoán của hệ thống cho mỗi đối tượng (item). Hệ thống phân loại sẽ gán nhãn dự đoán $ s(d) $ cho mỗi đối tượng $ d $ trong tập dữ liệu $ D $.
Ví dụ: Nếu hệ thống dự đoán rằng một đối tượng thuộc lớp “Trung bình”, thì $ s(d) $ sẽ là nhãn “Trung bình”.
$ g $ (Gold Standard):
Đây là nhãn thật (chuẩn vàng) mà đối tượng thực sự thuộc về, được cung cấp bởi tập dữ liệu chuẩn. Nhãn chuẩn vàng này được coi là kết quả chính xác mà hệ thống cần dự đoán.
Ví dụ: Đối tượng thực sự thuộc lớp “Tốt”, thì $ g(d) $ sẽ là nhãn “Tốt”.
$ D $ (Dataset):
Đây là tập dữ liệu bao gồm tất cả các đối tượng $ d $ cần được phân loại. Mỗi đối tượng có nhãn dự đoán $ s(d) $ từ hệ thống và nhãn chuẩn $ g(d) $.
$ CIQ_{ORD}(s(d), g(d)) $ (Closeness Information Quantity - Lượng thông tin về độ gần gũi):
Thành phần quan trọng này đo lường “độ gần gũi” giữa nhãn dự đoán $ s(d) $ và nhãn chuẩn $ g(d) $.
Nó được định nghĩa bằng lý thuyết thông tin: $ CIQ_{ORD}(a, b) = -(P(x b x a)) $, trong đó $ P(x b x a) $ là xác suất tìm thấy một đối tượng giữa hai nhãn $ a $ và $ b $ dựa trên sự phân bố của các đối tượng trong các lớp.
Nếu các nhãn dự đoán gần với nhãn thật (ví dụ, “Trung bình” dự đoán thành “Tốt”), giá trị CIQ sẽ thấp, tức là lỗi nhẹ. Nếu nhãn dự đoán cách xa nhãn thật (ví dụ, “Tốt” dự đoán thành “Kém”), giá trị CIQ sẽ cao, tức là lỗi nặng hơn.
Ví dụ: Giả sử:
$ s(d) = “Trung bình” $, $ g(d) = “Tốt” $.
Giá trị CIQ sẽ phản ánh khoảng cách giữa hai nhãn này dựa trên phân bố của dữ liệu.
Đây là tổng giá trị CIQ cho tất cả các đối tượng trong tập dữ liệu, đánh giá độ gần gũi của tất cả các dự đoán so với nhãn chuẩn.
Thành phần này phản ánh tổng thể hiệu suất của hệ thống dự đoán: nếu các dự đoán của hệ thống thường xuyên gần với nhãn thật, tổng CIQ sẽ nhỏ; nếu các dự đoán sai lệch lớn, tổng CIQ sẽ lớn.
Đây là tổng giá trị CIQ của hệ thống hoàn hảo (gold standard), tức là hệ thống mà mọi dự đoán đều chính xác.
Thành phần này đại diện cho giá trị CIQ tối thiểu, khi mọi dự đoán đều trùng khớp với nhãn thật. Do đó, nó là giá trị “chuẩn” mà các hệ thống phân loại khác so sánh.
CEM được tính bằng tỷ lệ giữa tổng CIQ của hệ thống dự đoán và tổng CIQ của hệ thống hoàn hảo (chuẩn vàng). Công thức này chuẩn hóa tổng CIQ của dự đoán để phản ánh mức độ chính xác tương đối của hệ thống so với hệ thống lý tưởng.
Nếu hệ thống có các dự đoán gần đúng với nhãn thật, giá trị CEM sẽ gần với 1 (càng chính xác thì giá trị càng cao). Nếu các dự đoán sai lệch nhiều, giá trị CEM sẽ nhỏ.
Tóm tắt các thành phần chính:
CIQ (Closeness Information Quantity): Đo lường khoảng cách giữa nhãn dự đoán và nhãn thật theo lý thuyết thông tin.
Tổng CIQ của dự đoán: Tổng CIQ cho mọi đối tượng, phản ánh tổng thể hiệu suất dự đoán của hệ thống.
Tổng CIQ của chuẩn vàng: Giá trị chuẩn để so sánh, phản ánh hiệu suất của hệ thống hoàn hảo.
CEM: Tỷ lệ giữa tổng CIQ của dự đoán và chuẩn vàng, thể hiện mức độ chính xác của hệ thống.
Đặc điểm của CEM:
Phù hợp với phân loại thứ tự: CEM đánh giá sự khác biệt giữa các nhãn có tính thứ tự, ví dụ như đánh giá mức độ “nặng nhẹ” của các lỗi dự đoán.
CEM càng cao (gần 1), hệ thống càng chính xác, dự đoán gần với nhãn thật.
CEM càng thấp, hệ thống dự đoán sai nhiều và cách xa so với nhãn thật.
Các bước thực hiện tính toán Proximity Matrix và CEM
Bước 1: Dữ liệu ví dụ
Giả sử bạn có tập dữ liệu sau:
Mẫu
Nhãn thực tế (Ground Truth)
Nhãn dự đoán (System Output)
1
0
0
2
1
2
3
2
2
4
2
2
5
1
1
6
0
0
7
2
1
8
1
1
9
0
0
10
2
2
Các nhóm phân loại là: 0 = tiêu cực, 1 = trung lập, 2 = tích cực.
Bước 2: Tính toán ma trận Proximity
Xác định số lượng phần tử trong mỗi nhóm:
Nhóm 0: 3 phần tử.
Nhóm 1: 3 phần tử.
Nhóm 2: 4 phần tử.
Tổng số phần tử: 10.
Công thức tính Proximity cho nhóm với chính nó:
Proximity của nhóm với chính nó được tính bằng công thức: \[
\text{prox}(i, i) = -\log\left(\frac{\text{số lượng phần tử trong nhóm i}}{2 \times \text{tổng số phần tử}}\right)
\]
Proximity giữa hai nhóm khác nhau được tính bằng công thức: \[
\text{prox}(i, j) = -\log\left(\frac{\frac{\text{số lượng phần tử trong nhóm i}}{2} + \text{tổng số phần tử nằm giữa nhóm i và nhóm j}}{\text{tổng số phần tử}}\right)
\]
Giữa nhóm 0 và 2: \[
\text{prox}(0, 2) = -\log\left(\frac{\frac{3}{2} + 7}{10}\right) = -\log(0.85) = 0.071
\]
Giữa nhóm 1 và 2: \[
\text{prox}(1, 2) = -\log\left(\frac{\frac{3}{2} + 4}{10}\right) = -\log(0.55) = 0.260
\]
Ma trận Proximity:
Sau khi tính toán, ma trận Proximity Matrix sẽ như sau:
Group
Class 0
Class 1
Class 2
0
0.823
0.260
0.071
1
0.260
0.823
0.260
2
0.071
0.260
0.699
Bước 3: Tính điểm CEM
Tính tổng proximity (tính trên các dự báo đúng):
Tính Confusion Matrix:
Group
Class 0
Class 1
Class 2
0
3
0
0
1
0
2
1
2
0
1
3
Lấy từng phần tử trong Proximity Matrix nhân với từng phần tử trong Confusion Matrix : \[
\text{Tổng proximity} = 0.823 * 3 + 0.823 * 2 + 0.260 * 1 + + 0.260 * 1 + 0.699 * 3 = 6.732
\]
Tính tổng proximity tối đa (khi tất cả các dự đoán là chính xác):
Chỉ sử dụng các giá trị trên đường chéo chính (khi dự đoán đúng với nhãn thực tế): \[
\text{Tổng proximity tối đa} = 0.823 * 3 + .823 * 3 + 0.699 * 4 = 7.733
\]
Tính điểm CEM: \[
\text{CEM} = \frac{\text{Tổng proximity}}{\text{Tổng proximity tối đa}} = \frac{6.732}{7.733} = 0.871
\]
Kết quả cuối cùng
Ma trận Proximity:
Group
Class 0
Class 1
Class 2
0
0.823
0.260
0.071
1
0.260
0.823
0.260
2
0.071
0.260
0.699
Điểm CEM: 0.871 (hoặc 87.1%).
import numpy as npimport math# Example ground truth (actual) and system output (predicted) labelsground_truth = np.array([0, 1, 2, 2, 1, 0, 2, 1, 0, 2]) # Actual labelssystem_output = np.array([0, 2, 2, 2, 1, 0, 1, 1, 0, 2]) # Predicted labelsdef calculate_proximity(ground_truth):""" Calculate the proximity between the classes based on their distribution. """ classes, counts = np.unique(ground_truth, return_counts=True) total_items =len(ground_truth) proximity_matrix = np.zeros((len(classes), len(classes)))for i inrange(len(classes)):for j inrange(len(classes)):if i == j:# Proximity of the class with itself proximity_matrix[i, j] =-math.log(counts[i] / (2* total_items))else:# Proximity of two different classes ni = counts[i] nj = counts[j] total_between =sum(counts[min(i, j):max(i, j)]) # Total items between classes proximity_matrix[i, j] =-math.log((ni /2+ total_between) / total_items)return proximity_matrixdef cem_score(system_output, ground_truth, proximity_matrix):""" Calculate the CEM score based on system output and ground truth. """ total_proximity =0 max_proximity =0for i inrange(len(system_output)): pred_class = system_output[i] true_class = ground_truth[i] total_proximity += proximity_matrix[pred_class, true_class] max_proximity += proximity_matrix[true_class, true_class] # When prediction is perfect# CEM score is the ratio of total proximity to max proximity cem_value = total_proximity / max_proximity if max_proximity !=0else0return cem_value# Calculate proximity matrix from the ground truth dataproximity_matrix = calculate_proximity(ground_truth)# Compute the CEM score based on the proximity matrixcem_value = cem_score(system_output, ground_truth, proximity_matrix)print(f"CEM Score: {cem_value:.4f}")