Closeness Evaluation Measure (CEM)

Author

Nguyễn Ngọc Bình

Published

January 1, 2024

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:

Công thức CEM:

\[ CEM_{ORD}(s, g) = \frac{\sum_{d \in D} CIQ_{ORD}(s(d), g(d))}{\sum_{d \in D} CIQ_{ORD}(g(d), g(d))} \]

Trong đó:

  1. $ s $ (System Output):
    • Đâ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”.
  2. $ 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”.
  3. $ 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) $.
  4. $ 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.
  5. $ {d D} CIQ{ORD}(s(d), g(d)) $ (Tổng CIQ của dự đoán):
    • Đâ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.
  6. $ {d D} CIQ{ORD}(g(d), g(d)) $ (Tổng CIQ của chuẩn vàng):
    • Đâ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.
  7. $ CEM_{ORD}(s, g) $ (Closeness Evaluation Measure):
    • 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 MatrixCEM

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

  1. 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.
  2. 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) \]
    • Áp dụng công thức cho từng nhóm:
      • Nhóm 0: \[ \text{prox}(0, 0) = -\log\left(\frac{3}{2 \times 10}\right) = -\log\left(0.15\right) = 0.823 \]
      • Nhóm 1: \[ \text{prox}(1, 1) = -\log\left(\frac{3}{2 \times 10}\right) = -\log\left(0.15\right) = 0.823 \]
      • Nhóm 2: \[ \text{prox}(2, 2) = -\log\left(\frac{4}{2 \times 10}\right) = -\log\left(0.2\right) = 0.699 \]
  3. Công thức tính Proximity giữa các nhóm khác nhau:
    • 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) \]
    • Tính toán cho các cặp nhóm:
      • Giữa nhóm 01: \[ \text{prox}(0, 1) = -\log\left(\frac{\frac{3}{2} + 4}{10}\right) = -\log\left(\frac{1.5 + 4}{10}\right) = -\log(0.55) = 0.260 \]
      • Giữa nhóm 02: \[ \text{prox}(0, 2) = -\log\left(\frac{\frac{3}{2} + 7}{10}\right) = -\log(0.85) = 0.071 \]
      • Giữa nhóm 12: \[ \text{prox}(1, 2) = -\log\left(\frac{\frac{3}{2} + 4}{10}\right) = -\log(0.55) = 0.260 \]
  4. 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

  1. 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 \]
  2. 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 \]
  3. 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 np
import math

# Example ground truth (actual) and system output (predicted) labels
ground_truth = np.array([0, 1, 2, 2, 1, 0, 2, 1, 0, 2])  # Actual labels
system_output = np.array([0, 2, 2, 2, 1, 0, 1, 1, 0, 2])  # Predicted labels

def 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 in range(len(classes)):
        for j in range(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_matrix

def cem_score(system_output, ground_truth, proximity_matrix):
    """
    Calculate the CEM score based on system output and ground truth.
    """
    total_proximity = 0
    max_proximity = 0
    for i in range(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 != 0 else 0
    return cem_value

# Calculate proximity matrix from the ground truth data
proximity_matrix = calculate_proximity(ground_truth)

# Compute the CEM score based on the proximity matrix
cem_value = cem_score(system_output, ground_truth, proximity_matrix)

print(f"CEM Score: {cem_value:.4f}")
CEM Score: 0.8869