Mô Hình Hồi Quy Logistic Thứ Tự

1. Mô Hình Hồi Quy Logistic Thứ Tự

  • Khái niệm:
    • Mô hình hồi quy logistic thứ tự là gì?: Hồi quy logistic thứ tự là một phương pháp phân tích thống kê được sử dụng khi biến phụ thuộc có thứ tự, nghĩa là các giá trị của biến phụ thuộc có một thứ tự tự nhiên nhưng không nhất thiết có khoảng cách đều nhau giữa các giá trị. Ví dụ về biến phụ thuộc có thứ tự bao gồm mức độ hài lòng của khách hàng (rất không hài lòng, không hài lòng, trung lập, hài lòng, rất hài lòng) hoặc trình độ học vấn (tiểu học, trung học, đại học).
    • Ví dụ: Giả sử chúng ta muốn nghiên cứu các yếu tố ảnh hưởng đến mức độ hài lòng của khách hàng sử dụng dịch vụ của một công ty. Biến phụ thuộc là mức độ hài lòng của khách hàng với 5 mức độ: “Rất không hài lòng”, “Không hài lòng”, “Trung lập”, “Hài lòng”, “Rất hài lòng”.

2. Mô Hình Hồi Quy Logistic Thứ Tự

  • Công thức mô hình:
    • Trình bày công thức toán học của mô hình hồi quy logistic thứ tự:

      \[ \log\left(\frac{\pi_{ij}}{1 - \pi_{ij}}\right) = \alpha_j + \beta_1 x_{i1} + \beta_2 x_{i2} + \ldots + \beta_p x_{ip} \]

    • Trong đó:

      • \(\pi_{ij} = P(Y_i \leq j)\) là xác suất tích lũy của mức độ \(j\) hoặc thấp hơn.
      • \(\alpha_j\) là các ngưỡng (cutpoints) cho các mức độ khác nhau.
      • \(\beta_1, \beta_2, \ldots, \beta_p\) là các hệ số hồi quy.

So sánh Mô hình Ordinal Logit, Multinomial Logit và Binary Logit

1. Mô hình Binary Logit

  • Đặc điểm:
    • Sử dụng khi biến phụ thuộc chỉ có hai nhóm phân loại.
    • Mô hình tính toán xác suất thành công (1) so với thất bại (0).
    • Công thức mô hình: \[ \log\left(\frac{P(Y=1)}{1 - P(Y=1)}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \ldots + \beta_p X_p \]
    • Xác suất thành công được tính bằng: \[ P(Y=1|X) = \frac{e^{\beta_0 + \beta_1 X_1 + \ldots + \beta_p X_p}}{1 + e^{\beta_0 + \beta_1 X_1 + \ldots + \beta_p X_p}} \]

2. Mô hình Multinomial Logit

  • Đặc điểm:
    • Sử dụng khi biến phụ thuộc có ba hoặc nhiều hơn các nhóm phân loại không có thứ tự.
    • Mô hình tính toán xác suất cho từng nhóm so với một nhóm tham chiếu.
    • Công thức mô hình: \[ \log\left(\frac{P(Y=k)}{P(Y=K)}\right) = \beta_{k0} + \beta_{k1} X_1 + \ldots + \beta_{kp} X_p \]
    • Xác suất cho mỗi nhóm được tính bằng: \[ P(Y=k|X) = \frac{e^{\beta_{k0} + \beta_{k1} X_1 + \ldots + \beta_{kp} X_p}}{1 + \sum_{j=1}^{K-1} e^{\beta_{j0} + \beta_{j1} X_1 + \ldots + \beta_{jp} X_p}} \]

3. Mô hình Ordinal Logit

  • Đặc điểm:
    • Sử dụng khi biến phụ thuộc có nhiều nhóm phân loại có thứ tự.
    • Mô hình tính toán xác suất cho mỗi nhóm phân loại dựa trên thứ tự.
    • Công thức mô hình: \[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \alpha_j + \beta_1 X_1 + \ldots + \beta_p X_p \]
    • Xác suất cho mỗi nhóm phân loại được tính bằng: \[ P(Y = j|X) = P(Y \leq j|X) - P(Y \leq j-1|X) \]

So sánh:

  • Số lượng nhóm phân loại:
    • Binary Logit: 2 nhóm.
    • Multinomial Logit: 3 hoặc nhiều nhóm không có thứ tự.
    • Ordinal Logit: 3 hoặc nhiều nhóm có thứ tự.
  • Cách tính xác suất:
    • Binary Logit tính toán xác suất thành công so với thất bại.
    • Multinomial Logit tính toán xác suất cho từng nhóm so với một nhóm tham chiếu.
    • Ordinal Logit tính toán xác suất cho mỗi nhóm phân loại dựa trên thứ tự.
  • Đặc điểm dữ liệu:
    • Binary Logit thường được sử dụng cho các biến phụ thuộc có hai trạng thái như có hoặc không.
    • Multinomial Logit được sử dụng khi biến phụ thuộc có ba hoặc nhiều hơn các nhóm không có thứ tự.
    • Ordinal Logit thích hợp khi biến phụ thuộc có nhiều nhóm có thứ tự.

Prediction

Mô hình Logit

Xác suất của một quan sát cho $ y_j = i $ là: \[ p_{ij} = \Pr(y_j = i) = \Pr(\kappa_{i-1} < x_j \beta + u \leq \kappa_i) = \frac{1}{1 + \exp(-\kappa_i + x_j \beta)} - \frac{1}{1 + \exp(-\kappa_{i-1} + x_j \beta)} \]

Trong đó: - $ _0 $ được định nghĩa là $ -$ và $ _k $ là $ +$.

Mô hình Probit

Xác suất của một quan sát cho $ y_j = i $ là: \[ p_{ij} = \Pr(y_j = i) = \Pr(\kappa_{i-1} < x_j \beta + u \leq \kappa_i) = = \Phi(\kappa_i - x_j \beta) - \Phi(\kappa_{i-1} - x_j \beta) \]

Trong đó: - $ () $ là hàm phân phối tích lũy chuẩn (standard normal cumulative distribution function).

Hàm Log-Likelihood

Hàm log-likelihood là: \[ \ln L = \sum_{j=1}^N Wj \sum_{i=1}^k l_i(y_j) \ln p_{ij} \]

Trong đó: - $ w_j $ là một trọng số tùy chọn. - $ l_i(y_j) $ : \[ l_i(y_j) = \begin{cases} 1 & \text{nếu } y_j = i \\ 0 & \text{ngược lại} \end{cases} \]

Nguồn: rologit

Cách giải thích kết quả của mô hình ordinal logistic

Để minh họa cách giải thích kết quả của mô hình ordinal logistic, hãy xem xét một ví dụ cụ thể. Giả sử chúng ta đã chạy một mô hình ordinal logistic để dự đoán mức độ hài lòng của khách hàng (1: Rất không hài lòng, 2: Không hài lòng, 3: Bình thường, 4: Hài lòng, 5: Rất hài lòng) dựa trên hai biến độc lập: thời gian chờ đợi (WaitTime) và chất lượng dịch vụ (ServiceQuality).

Dưới đây là kết quả từ mô hình ordinal logistic:

                            Coefficient    Std. Error     Z-value    P-value
Intercept 1 (cutpoint 1)        -2.50          0.30       -8.33      <0.001
Intercept 2 (cutpoint 2)        -1.50          0.25       -6.00      <0.001
Intercept 3 (cutpoint 3)        -0.50          0.20       -2.50       0.012
Intercept 4 (cutpoint 4)         1.00          0.15        6.67      <0.001
WaitTime                        -0.75          0.10       -7.50      <0.001
ServiceQuality                   1.20          0.08       15.00      <0.001

Giải thích Kết quả

1. Các Hệ số Cắt (Cutpoints)

  • Intercept 1 (cutpoint 1) = -2.50:
    • Đây là điểm cắt giữa mức độ hài lòng “Rất không hài lòng” (1) và “Không hài lòng hoặc cao hơn” (2, 3, 4, 5).
    • Giá trị âm cho thấy rằng với giá trị trung bình của các biến độc lập (WaitTime và ServiceQuality), khả năng là khách hàng sẽ không hài lòng hơn là rất không hài lòng.
  • Intercept 2 (cutpoint 2) = -1.50:
    • Đây là điểm cắt giữa mức độ hài lòng “Không hài lòng” (2) và “Bình thường hoặc cao hơn” (3, 4, 5).
    • Giá trị âm nhưng lớn hơn -2.50, cho thấy rằng với giá trị trung bình của các biến độc lập, khả năng là khách hàng sẽ bình thường hoặc cao hơn là không hài lòng.
  • Intercept 3 (cutpoint 3) = -0.50:
    • Đây là điểm cắt giữa mức độ hài lòng “Bình thường” (3) và “Hài lòng hoặc cao hơn” (4, 5).
    • Giá trị gần bằng 0 cho thấy rằng với giá trị trung bình của các biến độc lập, khả năng là khách hàng sẽ hài lòng hoặc cao hơn là bình thường.
  • Intercept 4 (cutpoint 4) = 1.00:
    • Đây là điểm cắt giữa mức độ hài lòng “Hài lòng” (4) và “Rất hài lòng” (5).
    • Giá trị dương cho thấy rằng với giá trị trung bình của các biến độc lập, khả năng là khách hàng sẽ rất hài lòng hơn là hài lòng.

2. Các Hệ số Hồi quy

  • WaitTime = -0.75:
    • Hệ số này âm, cho thấy rằng thời gian chờ đợi dài hơn sẽ làm giảm mức độ hài lòng của khách hàng.
    • Cụ thể, mỗi đơn vị tăng thêm trong thời gian chờ đợi sẽ làm giảm log-odds của việc khách hàng đạt mức độ hài lòng cao hơn so với mức độ hài lòng hiện tại.
    • Hệ số này có ý nghĩa thống kê (P-value < 0.001), cho thấy rằng thời gian chờ đợi có ảnh hưởng đáng kể đến mức độ hài lòng của khách hàng.
  • ServiceQuality = 1.20:
    • Hệ số này dương, cho thấy rằng chất lượng dịch vụ tốt hơn sẽ tăng mức độ hài lòng của khách hàng.
    • Cụ thể, mỗi đơn vị tăng thêm trong chất lượng dịch vụ sẽ tăng log-odds của việc khách hàng đạt mức độ hài lòng cao hơn so với mức độ hài lòng hiện tại.
    • Hệ số này cũng có ý nghĩa thống kê (P-value < 0.001), cho thấy rằng chất lượng dịch vụ có ảnh hưởng đáng kể đến mức độ hài lòng của khách hàng.

Cách Tính Xác Suất

Giả sử chúng ta muốn tính xác suất rằng một khách hàng với thời gian chờ đợi là 3 đơn vị và chất lượng dịch vụ là 4 đơn vị sẽ thuộc vào từng mức độ hài lòng.

  • Đầu tiên, chúng ta tính giá trị tiềm ẩn \(Y^*\): \[ Y^* = -0.75 \times 3 + 1.20 \times 4 = -2.25 + 4.8 = 2.55 \]

  • Sau đó, chúng ta tính xác suất cho từng mức độ hài lòng:

    \[ P(Y \leq 1) = \frac{1}{1 + \exp(-(-2.50 - 2.55))} = \frac{1}{1 + \exp(5.05)} \approx 0.006 \]

    \[ P(Y \leq 2) = \frac{1}{1 + \exp(-(-1.50 - 2.55))} = \frac{1}{1 + \exp(4.05)} \approx 0.017 \]

    \[ P(Y \leq 3) = \frac{1}{1 + \exp(-(-0.50 - 2.55))} = \frac{1}{1 + \exp(3.05)} \approx 0.045 \]

    \[ P(Y \leq 4) = \frac{1}{1 + \exp(-(1.00 - 2.55))} = \frac{1}{1 + \exp(1.55)} \approx 0.175 \]

    \[ P(Y = 5) = 1 - P(Y \leq 4) = 1 - 0.175 = 0.825 \]

Tóm lại

  • Xác suất rằng khách hàng rất không hài lòng: 0.6%
  • Xác suất rằng khách hàng không hài lòng: 1.7% - 0.6%
  • Xác suất rằng khách hàng bình thường: 4.5% - 1.7%
  • Xác suất rằng khách hàng hài lòng: 17.5% - 4.5%
  • Xác suất rằng khách hàng rất hài lòng: 82.5%

Đánh giá mô hình

  1. Cohen’s Kappa:
    • Sử dụng: Với mô hình có biến phụ thuộc là một biến định danh (nominal variable) và muốn đánh giá mức độ chính xác của mô hình dự báo.
    • Ví dụ: Đánh giá phân loại giữa hai bác sĩ về chẩn đoán bệnh.
  2. Weighted Cohen’s Kappa hoặc Kendall’s Tau:
    • Sử dụng: Với mô hình có biến phụ thuộc là một biến thứ bậc (ordinal variable).
    • Weighted Cohen’s Kappa: Điều chỉnh cho trọng số khác nhau của sự không chính xác của kết quả dự báo để phản ánh mức độ nghiêm trọng của các sai lệch dự đoán.
    • Kendall’s Tau: Được sử dụng để đánh giá mức độ tương quan và độ chính xác của dự báo.
    • Ví dụ: Đánh giá mức độ hài lòng của khách hàng trên thang điểm từ 1 đến 5.
  3. Pearson’s Correlation:
    • Sử dụng: Với mô hình có biến phụ thuộc là một biến định lượng và muốn biết mức độ tương quan giữa kết quả thực tế và dự báo.
    • Ví dụ: So sánh kết quả của hai phương pháp đo lường huyết áp.
  4. Fleiss’ Kappa:
    • Sử dụng: Khi bạn có nhiều hơn hai mẫu phụ thuộc danh nghĩa (nominal dependent samples) và muốn đánh giá mức độ đồng thuận giữa nhiều mô hình dự báo.
    • Ví dụ: Đánh giá sự đồng thuận giữa nhiều bác sĩ về chẩn đoán bệnh trong một tập hợp các trường hợp.

Image Description

Quadratic Weighted Kappa (QWK).

1. Cohen’s Kappa

\[ \kappa = \frac{p_0 - p_e}{1 - p_e} \]

  • \(p_0\): Xác suất quan sát đồng thuận (tỷ lệ các giá trị dự đoán trùng với giá trị thực tế).
  • \(p_e\): Xác suất đồng thuận ngẫu nhiên (tính dựa trên ma trận đồng thuận và xác suất của từng nhãn).

2. Quadratic Weighted Kappa (QWK)

\[ QWK = 1 - \frac{\sum_{i,j} W_{ij} O_{ij}}{\sum_{i,j} W_{ij} E_{ij}} \]

  • \(O_{ij}\): Ma trận quan sát (confusion matrix), với \(O_{ij}\) là số lượng trường hợp mà giá trị thực tế là \(i\) và giá trị dự đoán là \(j\).
  • \(E_{ij}\): Ma trận kỳ vọng, được tính dựa trên xác suất của các nhãn.
  • \(W_{ij}\): Ma trận trọng số, tính dựa trên khoảng cách giữa các nhãn \(i\)\(j\), thường được tính như sau:

\[ W_{ij} = \frac{(i - j)^2}{(N - 1)^2} \]

trong đó \(N\) là số lượng nhãn.

3. Khoảng Giá Trị:

  • QWK có giá trị dao động từ -1 đến 1:
    • 1: Đồng thuận hoàn hảo giữa dự báo và thực tế.
    • 0: Không có sự đồng thuận nào ngoài mức ngẫu nhiên.
    • < 0: Sự đồng thuận kém hơn mức ngẫu nhiên (phản đồng thuận).

4. Ý Nghĩa:

  • 1: Mô hình dự báo hoàn toàn khớp với thực tế.
  • 0.81 - 1.00: Đồng thuận gần như hoàn hảo giữa dự báo và thực tế.
  • 0.61 - 0.80: Đồng thuận đáng kể.
  • 0.41 - 0.60: Đồng thuận khá.
  • 0.21 - 0.40: Đồng thuận vừa phải.
  • 0.01 - 0.20: Đồng thuận nhẹ.
  • 0: Không có sự đồng thuận.
  • < 0: Đồng thuận kém hơn ngẫu nhiên, mô hình hoặc đánh giá có vấn đề nghiêm trọng.

Ví dụ Minh Họa:

Giả sử chúng ta có dự báo và giá trị thực tế trên thang điểm từ 1 đến 5 như sau:

Thực tế Dự báo
1 1
2 2
3 3
4 4
5 5

Trong trường hợp này, QWK sẽ bằng 1, biểu thị sự đồng thuận hoàn hảo giữa dự báo và thực tế.

Tuy nhiên, nếu có một số sự khác biệt như:

Thực tế Dự báo
1 2
2 2
3 3
4 5
5 4

QWK sẽ phản ánh mức độ đồng thuận kém hơn giữa dự báo và thực tế.

QWK là một chỉ số quan trọng trong việc đánh giá mô hình dự báo trong các bài toán phân loại thứ bậc, đặc biệt khi các hạng mục có thứ tự. Nó giúp chúng ta hiểu rõ hơn về mức độ tương đồng giữa dự báo của mô hình và giá trị thực tế, qua đó cải thiện chất lượng mô hình.

Ví dụ 2:

Thực tế (Actual) Dự đoán (Predicted)
Rất không hài lòng (1) Rất không hài lòng (1)
Không hài lòng (2) Không hài lòng (2)
Trung lập (3) Trung lập (3)
Hài lòng (4) Trung lập (3)
Rất hài lòng (5) Rất hài lòng (5)
Rất không hài lòng (1) Không hài lòng (2)
Không hài lòng (2) Rất không hài lòng (1)
Trung lập (3) Hài lòng (4)
Hài lòng (4) Rất hài lòng (5)
Rất hài lòng (5) Hài lòng (4)

1. Cohen’s Kappa

Bước 1: Tạo ma trận đồng thuận (confusion matrix).

\[ \begin{array}{c|ccccc} & 1 & 2 & 3 & 4 & 5 \\ \hline 1 & 1 & 1 & 0 & 0 & 0 \\ 2 & 1 & 1 & 0 & 0 & 0 \\ 3 & 0 & 0 & 1 & 1 & 0 \\ 4 & 0 & 0 & 1 & 0 & 1 \\ 5 & 0 & 0 & 0 & 1 & 1 \\ \end{array} \]

Bước 2: Tính xác suất quan sát đồng thuận \(p_0\) và xác suất đồng thuận ngẫu nhiên \(p_e\).

  • \(p_0 = \frac{1 + 1 + 1 + 0 + 1}{10} = \frac{4}{10} = 0.4\)

  • Tính xác suất của từng nhãn:

    • \(P(\text{Actual} = 1) = \frac{2}{10}, P(\text{Predicted} = 1) = \frac{1}{10}\)
    • \(P(\text{Actual} = 2) = \frac{2}{10}, P(\text{Predicted} = 2) = \frac{1}{10}\)
    • \(P(\text{Actual} = 3) = \frac{2}{10}, P(\text{Predicted} = 3) = \frac{2}{10}\)
    • \(P(\text{Actual} = 4) = \frac{2}{10}, P(\text{Predicted} = 4) = \frac{2}{10}\)
    • \(P(\text{Actual} = 5) = \frac{2}{10}, P(\text{Predicted} = 5) = \frac{2}{10}\)
  • \(p_e = (0.2 \times 0.1) + (0.2 \times 0.1) + (0.2 \times 0.2) + (0.2 \times 0.2) + (0.2 \times 0.2) = 0.02 + 0.02 + 0.04 + 0.04 + 0.04 = 0.16\)

Bước 3: Tính Cohen’s Kappa.

\[ \kappa = \frac{p_0 - p_e}{1 - p_e} = \frac{0.4 - 0.16}{1 - 0.16} = \frac{0.24}{0.84} \approx 0.286 \]

3. Quadratic Weighted Kappa (QWK)

Bước 1: Tạo ma trận đồng thuận (confusion matrix).

\[ \begin{array}{c|ccccc} & 1 & 2 & 3 & 4 & 5 \\ \hline 1 & 1 & 1 & 0 & 0 & 0 \\ 2 & 1 & 1 & 0 & 0 & 0 \\ 3 & 0 & 0 & 1 & 1 & 0 \\ 4 & 0 & 0 & 1 & 0 & 1 \\ 5 & 0 & 0 & 0 & 1 & 1 \\ \end{array} \]

Bước 2: Tạo ma trận trọng số dựa trên khoảng cách giữa các nhãn.

$$ \[\begin{array}{c|ccccc} & 1 & 2 & 3 & 4 & 5 \\ \hline 1 & 0 & 0.0625 & 0.25 & 0.5625 & 1 \\ 2 & 0.0625 & 0 & 0.0625 & 0.25 & 0.5625 \\ 3 & 0.25 & 0.0625 & 0 & 0.0625 & 0.25 \\ 4 & 0.5625 & 0.25 & 0.0625 & 0 & 0.0625 \\ 5 & 1 & 0.5625 & 0.25 & 0.0625 & 0 \\ \end{array}\]

$$

Bước 3: Tạo ma trận kỳ vọng dựa trên xác suất của các nhãn.

\[ \begin{array}{c|ccccc} & 1 & 2 & 3 & 4 & 5 \\ \hline 1 & 0.1 & 0.1 & 0.1 & 0.1 & 0.1 \\ 2 & 0.1 & 0.1 & 0.1 & 0.1 & 0.1 \\ 3 & 0.2 & 0.2 & 0.2 & 0.2 & 0.2 \\ 4 & 0.2 & 0.2 & 0.2 & 0.2 & 0.2 \\ 5 & 0.2 & 0.2 & 0.2 & 0.2 & 0.2 \\ \end{array} \]

Bước 4: Tính QWK.

\[ QWK = 1 - \frac{\sum_{i,j} W_{ij} O_{ij}}{\sum_{i,j} W_{ij} E_{ij}} \]

\[ \sum_{i,j} W_{ij} O_{ij} = 1 \times 0 + 1 \times 0.0625 + 1 \times 0 + 0 \times 0.0625 + 1 \times 0 + 0 \times 0.0625 + 1 \times 0.25 + 1 \times 0.0625 + 0 \times 0.0625 + 1 \times 0.0625 = 0.625 \]

\[ \sum_{i,j} W_{ij} E_{ij} = 0.1 \times 0 + 0.1 \times 0.0625 + 0.1 \times 0.25 + 0.1 \times 0.5625 + 0.1 \times 1 + 0.1 \times 0.0625 + 0.1 \times 0 + 0.1 \times 0.0625 + 0.1 \times 0.25 + 0.1 \times 0.5625 + 0.2 \times 0.25 + 0.2 \times 0.0625 + 0.2 \times 0 + 0.2 \times 0.0625 + 0.2 \times 0.25 + 0.2 \times 0.25 + 0.2 \times 0.0625 + 0.2 \times 0 + 0.2 \times 0.0625 + 0.2 \times 0.25 + 0.2 \times 0.5625 + 0.2 \times 0.25 + 0.2 \times 0.0625 + 0.2 \times 0 + 0.2 \times 0.0625 = 1.5 \]

\[ QWK = 1 - \frac{0.625}{1.5} = 1 - 0.4167 = 0.5833 \]

So sánh trọng số Linear, Quadratic của hệ số kappa của Cohen (Cohen’s kappa coefficient)

Trong đánh giá các mô hình phân loại thứ bậc, hai loại trọng số thường được sử dụng là trọng số tuyến tính (linear weights) và trọng số bậc hai (quadratic weights). Các trọng số này ảnh hưởng đến cách tính toán độ sai lệch giữa các dự đoán và giá trị thực tế.

Công thức Tính Trọng số

  • Linear Weight: \[ W_{ij} = \frac{|i - j|}{N - 1} \] Trong đó:
    • \(i\)\(j\) là các nhãn.
    • \(N\) là tổng số nhãn.
  • Quadratic Weight: \[ W_{ij} = \frac{(i - j)^2}{(N - 1)^2} \] Trong đó:
    • \(i\)\(j\) là các nhãn.
    • \(N\) là tổng số nhãn.

So sánh Trọng số Linear và Quadratic cho các giá trị phân loại

Giả sử chúng ta có các giá trị phân loại từ 0 đến 4:

Thực tế Dự báo
0 0
1 0
2 0
3 0
4 0

Trọng số Linear

Với \(N = 5\):

\[ W_{ij}^{\text{linear}} = \frac{|i - j|}{4} \]

Thực tế (\(i\)) Dự báo (\(j\)) \(\|i - j\|\) Trọng số Linear
0 0 0 0
1 0 1 0.25
2 0 2 0.5
3 0 3 0.75
4 0 4 1

Trọng số Quadratic

Với \(N = 5\):

\[ W_{ij}^{\text{quadratic}} = \frac{(i - j)^2}{16} \]

Thực tế (\(i\)) Dự báo (\(j\)) \((i - j)^2\) Trọng số Quadratic
0 0 0 0
1 0 1 0.0625
2 0 4 0.25
3 0 9 0.5625
4 0 16 1

Nhận xét

  • Linear Weights: Trọng số tăng tuyến tính với sự khác biệt giữa nhãn thực tế và nhãn dự đoán. Điều này có nghĩa là mỗi đơn vị sai lệch sẽ có một mức độ ảnh hưởng tương đương.
  • Quadratic Weights: Trọng số tăng bậc hai với sự khác biệt giữa nhãn thực tế và nhãn dự đoán. Điều này có nghĩa là các sai lệch lớn hơn sẽ bị phạt nặng hơn rất nhiều so với các sai lệch nhỏ hơn.

Kết luận

  • Linear Weights: Phù hợp hơn trong các trường hợp mà mọi sự khác biệt giữa các nhãn đều quan trọng như nhau.
  • Quadratic Weights: Phù hợp hơn trong các trường hợp mà các sai lệch lớn cần được phạt nặng hơn, phản ánh mức độ nghiêm trọng của các dự đoán sai lệch lớn hơn.
import pandas as pd
from sklearn.model_selection import train_test_split
import numpy as np

# Tải dữ liệu
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv"
data = pd.read_csv(url, sep=';')

# Kiểm tra dữ liệu
print(data.head())
print(data.info())

# Chia dữ liệu thành tập huấn luyện và tập kiểm tra
X = data.drop('quality', axis=1)
y = data['quality'] - 3  # Điều chỉnh các giá trị chất lượng

# Chia dữ liệu thành tập huấn luyện và tập kiểm tra
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Hiển thị một số thông tin về tập huấn luyện và tập kiểm tra
print(f"X_train shape: {X_train.shape}, y_train shape: {y_train.shape}")
print(f"X_test shape: {X_test.shape}, y_test shape: {y_test.shape}")

# Chuyển đổi biến mục tiêu thành dạng ordinal
y_train = y_train.astype('category')
y_test = y_test.astype('category')
   fixed acidity  volatile acidity  citric acid  residual sugar  chlorides  \
0            7.4              0.70         0.00             1.9      0.076   
1            7.8              0.88         0.00             2.6      0.098   
2            7.8              0.76         0.04             2.3      0.092   
3           11.2              0.28         0.56             1.9      0.075   
4            7.4              0.70         0.00             1.9      0.076   

   free sulfur dioxide  total sulfur dioxide  density    pH  sulphates  \
0                 11.0                  34.0   0.9978  3.51       0.56   
1                 25.0                  67.0   0.9968  3.20       0.68   
2                 15.0                  54.0   0.9970  3.26       0.65   
3                 17.0                  60.0   0.9980  3.16       0.58   
4                 11.0                  34.0   0.9978  3.51       0.56   

   alcohol  quality  
0      9.4        5  
1      9.8        5  
2      9.8        5  
3      9.8        6  
4      9.4        5  
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1599 entries, 0 to 1598
Data columns (total 12 columns):
 #   Column                Non-Null Count  Dtype  
---  ------                --------------  -----  
 0   fixed acidity         1599 non-null   float64
 1   volatile acidity      1599 non-null   float64
 2   citric acid           1599 non-null   float64
 3   residual sugar        1599 non-null   float64
 4   chlorides             1599 non-null   float64
 5   free sulfur dioxide   1599 non-null   float64
 6   total sulfur dioxide  1599 non-null   float64
 7   density               1599 non-null   float64
 8   pH                    1599 non-null   float64
 9   sulphates             1599 non-null   float64
 10  alcohol               1599 non-null   float64
 11  quality               1599 non-null   int64  
dtypes: float64(11), int64(1)
memory usage: 150.0 KB
None
X_train shape: (1279, 11), y_train shape: (1279,)
X_test shape: (320, 11), y_test shape: (320,)
import statsmodels.api as sm
from statsmodels.miscmodels.ordinal_model import OrderedModel

# Xây dựng mô hình Ordinal Logistic Regression
model = OrderedModel(y_train, X_train, distr='logit')
result = model.fit(method='bfgs')

# In kết quả
print(result.summary())
c:\Users\binhnn2\anaconda3\envs\rdm\lib\site-packages\statsmodels\miscmodels\ordinal_model.py:206: Warning: the endog has ordered == False, risk of capturing a wrong order for the categories. ordered == True preferred.
  warnings.warn("the endog has ordered == False, "
Optimization terminated successfully.
         Current function value: 0.966817
         Iterations: 90
         Function evaluations: 94
         Gradient evaluations: 94
                             OrderedModel Results                             
==============================================================================
Dep. Variable:                quality   Log-Likelihood:                -1236.6
Model:                   OrderedModel   AIC:                             2505.
Method:            Maximum Likelihood   BIC:                             2588.
Date:                Fri, 05 Jul 2024                                         
Time:                        16:28:50                                         
No. Observations:                1279                                         
Df Residuals:                    1263                                         
Df Model:                          11                                         
========================================================================================
                           coef    std err          z      P>|z|      [0.025      0.975]
----------------------------------------------------------------------------------------
fixed acidity            0.0783      0.091      0.859      0.390      -0.100       0.257
volatile acidity        -3.1342      0.449     -6.987      0.000      -4.013      -2.255
citric acid             -0.6750      0.520     -1.299      0.194      -1.693       0.343
residual sugar           0.0359      0.054      0.664      0.506      -0.070       0.142
chlorides               -4.8182      1.462     -3.295      0.001      -7.684      -1.952
free sulfur dioxide      0.0185      0.008      2.371      0.018       0.003       0.034
total sulfur dioxide    -0.0125      0.003     -4.676      0.000      -0.018      -0.007
density                 -2.5943     75.908     -0.034      0.973    -151.372     146.183
pH                      -0.9766      0.669     -1.459      0.145      -2.288       0.335
sulphates                2.5650      0.397      6.463      0.000       1.787       3.343
alcohol                  0.8942      0.095      9.401      0.000       0.708       1.081
0/1                     -2.4053     74.344     -0.032      0.974    -148.117     143.306
1/2                      0.5993      0.169      3.548      0.000       0.268       0.930
2/3                      1.3067      0.044     30.034      0.000       1.221       1.392
3/4                      1.0376      0.042     24.546      0.000       0.955       1.120
4/5                      1.1218      0.091     12.268      0.000       0.943       1.301
========================================================================================
# Các giá trị \tau
num_of_thresholds = 5
model.transform_threshold_params(result.params[-num_of_thresholds:])
array([       -inf, -2.40532186, -0.58442067,  3.10969434,  5.93215937,
        9.00252064,         inf])
# Dự đoán trên tập kiểm tra
pred_proba = result.predict(X_test)
pred_one_hot = np.eye(len(set(y)))[np.round(pred_proba).astype(int)]

# Chuyển đổi one-hot encoding sang mảng một chiều
pred = np.argmax(pred_one_hot, axis=1)[:,1]

# Chuyển đổi lại y_test thành dạng int để phù hợp với các hàm đánh giá
y_test_int = y_test.astype(int).to_numpy()
from sklearn.metrics import cohen_kappa_score, confusion_matrix
from scipy.stats import spearmanr
# Đảm bảo kích thước phù hợp
if len(pred) == len(y_test_int):
    # Đánh giá mô hình sử dụng QWK
    qwk = cohen_kappa_score(y_test_int, pred, weights='quadratic')
    print("Quadratic Weighted Kappa: ", qwk)

    # Đánh giá mô hình sử dụng Spearman's Rank Correlation
    spearman_corr, _ = spearmanr(y_test_int, pred)
    print("Spearman's Rank Correlation: ", spearman_corr)

    # Đánh giá mô hình sử dụng Cohen's Kappa
    cohen_kappa = cohen_kappa_score(y_test_int, pred)
    print("Cohen's Kappa: ", cohen_kappa)
else:
    print("Error: The size of y_test and pred do not match.")
Quadratic Weighted Kappa:  0.17843809134148214
Spearman's Rank Correlation:  0.35484507423547046
Cohen's Kappa:  0.2695153974695631

Các bước thực hiện mô hình có biến phụ thuộc dạng thứ bậc

  • Xác định nhãn
  • Chia train/test: Stratify
  • Chọn biến: RFECV (by kappa), Spearman Correlation
  • Thuật toán sử dụng: Logistic, RandomForest, Xgboost, LightGBM
  • Hàm loss: tùy chỉnh hàm loss: kappa loss
  • Đánh giá mô hình: Cohen’s kappa coefficient

Tham khảo

  • Cohen’s Kappa:
    • Bài viết này trên trang DATAtab cung cấp một hướng dẫn chi tiết về cách tính toán và sử dụng chỉ số Kappa của Cohen. Chỉ số này được sử dụng để đo lường mức độ đồng thuận giữa hai hoặc nhiều người đánh giá trong các nhiệm vụ phân loại. Hướng dẫn bao gồm cả lý thuyết cơ bản về chỉ số Kappa và cách tính toán nó với ví dụ minh họa.
  • Weighted Cohen’s Kappa:
    • Bài viết này giải thích chi tiết về chỉ số Weighted Cohen’s Kappa, một mở rộng của Cohen’s Kappa để xử lý các dữ liệu phân loại có thứ tự. Nội dung bao gồm các công thức tính toán cho trọng số tuyến tính và trọng số bậc hai, cùng với các ví dụ minh họa cụ thể để giúp hiểu rõ hơn về cách áp dụng chỉ số này trong thực tế.
  • Wine Quality EDA, Prediction, and Deploy:
    • Notebook này trên Kaggle của Lus Fernando Torres thực hiện phân tích khám phá dữ liệu (EDA), xây dựng mô hình dự đoán chất lượng rượu vang và triển khai mô hình. Nó bao gồm các bước xử lý dữ liệu, khám phá dữ liệu trực quan, xây dựng và đánh giá các mô hình học máy khác nhau, cũng như hướng dẫn triển khai mô hình để sử dụng thực tế.
  • 1st Place Solution - RAPIDS & XGBoost:
    • Đây là notebook của người chiến thắng giải nhất trong một cuộc thi Kaggle, sử dụng RAPIDS và XGBoost để xây dựng mô hình. Notebook này chi tiết các bước và chiến lược mà tác giả sử dụng để đạt được kết quả tốt nhất trong cuộc thi, bao gồm xử lý dữ liệu, lựa chọn đặc trưng, và tinh chỉnh mô hình.
  • PS S03E05 Pytorch NN Modeling:
    • Notebook này trên Kaggle của Ryanirl tập trung vào việc xây dựng mô hình mạng nơ-ron nhân tạo (NN) bằng PyTorch cho tập dữ liệu của một cuộc thi Kaggle (PS S03E05). Nội dung bao gồm các bước từ chuẩn bị dữ liệu, xây dựng và huấn luyện mô hình, đến đánh giá và tinh chỉnh mô hình.
  • S3E5 XGB, LGB, Cat:
    • Notebook của Tetsutani trên Kaggle thực hiện so sánh giữa ba mô hình học máy phổ biến: XGBoost, LightGBM, và CatBoost trên tập dữ liệu của cuộc thi S3E5. Nó bao gồm các bước chuẩn bị dữ liệu, huấn luyện từng mô hình, và đánh giá hiệu suất của chúng để tìm ra mô hình tốt nhất.
  • Drop Features Reduction with t-SNE Model:
    • Notebook này của David H Guerrero trên Kaggle trình bày cách giảm chiều dữ liệu bằng phương pháp t-SNE và chọn lọc đặc trưng dựa trên tầm quan trọng của chúng. Tác giả sử dụng phương pháp t-SNE để trực quan hóa dữ liệu và quyết định loại bỏ những đặc trưng không cần thiết, nhằm cải thiện hiệu suất mô hình.
  • Ordinal Logistic Regression Solution:
    • Notebook của Ronen Nakash trên Kaggle giải thích cách xây dựng mô hình hồi quy logistic thứ bậc để giải quyết các bài toán phân loại thứ bậc. Nội dung bao gồm các bước từ chuẩn bị dữ liệu, xây dựng và huấn luyện mô hình, đến đánh giá và tinh chỉnh mô hình, giúp hiểu rõ hơn về việc áp dụng hồi quy logistic thứ bậc trong thực tế.
  • Ordinal Regression - Statsmodels:
    • Bài viết trên trang Statsmodels cung cấp hướng dẫn chi tiết về cách sử dụng lớp OrderedModel cho hồi quy thứ bậc với các phân phối khác nhau (probit, logit, custom). Nội dung bao gồm các bước tải dữ liệu, xây dựng mô hình, diễn giải các hệ số, tính toán các ngưỡng, dự đoán và đánh giá hiệu suất mô hình.

Một số code thực hành

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import accuracy_score, cohen_kappa_score
import warnings
import lightgbm as lgb
# Suppress warnings
warnings.filterwarnings('ignore', category=UserWarning)
# Load the dataset
url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv'
data = pd.read_csv(url, sep=';')

# Define features and target
X = data.drop('quality', axis=1)
y = data['quality'] - 3

# Split the data into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Standardize the features
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

# Convert the data into LightGBM Dataset
dtrain = lgb.Dataset(X_train_scaled, label=y_train)
dtest = lgb.Dataset(X_test_scaled, label=y_test, reference=dtrain)

# Set the parameters for LightGBM
params = {
    'objective': 'multiclass',
    'num_class': len(np.unique(y)),  # Number of classes
    'metric': 'multi_logloss',
    'max_depth': 6,
    'learning_rate': 0.1,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'seed': 42,
    'verbose': -1
}

# Train the LightGBM model
bst = lgb.train(params, dtrain, num_boost_round=100, valid_sets=[dtest])

# Predict on the test set
y_pred_prob = bst.predict(X_test_scaled, num_iteration=bst.best_iteration)
y_pred = np.argmax(y_pred_prob, axis=1)

# Evaluate the model
accuracy = accuracy_score(y_test, y_pred)
kappa = cohen_kappa_score(y_test, y_pred)
qwk = cohen_kappa_score(y_test, y_pred, weights='quadratic')

print(f'Test Accuracy: {accuracy:.2f}')
print(f'Cohen\'s Kappa: {kappa:.2f}')
print(f'Quadratic Weighted Kappa: {qwk:.2f}')
Test Accuracy: 0.68
Cohen's Kappa: 0.48
Quadratic Weighted Kappa: 0.66

Sử dụng kappa evaluation function thay cho multi_logloss

# Custom kappa evaluation function
def kappa_eval(preds, train_data):
    y_true = train_data.get_label()
    y_pred = np.argmax(preds.reshape(len(np.unique(y_true)), -1), axis=0)
    kappa = cohen_kappa_score(y_true, y_pred, weights='quadratic')
    return 'kappa', kappa, True

# Convert the data into LightGBM Dataset
dtrain = lgb.Dataset(X_train_scaled, label=y_train)
dtest = lgb.Dataset(X_test_scaled, label=y_test, reference=dtrain)

# Set the parameters for LightGBM
params = {
    'objective': 'multiclass',
    'num_class': len(np.unique(y)),  # Number of classes
    'metric': 'multi_logloss',  # Default metric
    'max_depth': 6,
    'learning_rate': 0.1,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'seed': 42,
    'verbose': -1
}

# Train the LightGBM model with custom kappa evaluation
bst = lgb.train(params, dtrain, num_boost_round=100, valid_sets=[dtest], feval=kappa_eval)

# Predict on the test set
y_pred_prob = bst.predict(X_test_scaled, num_iteration=bst.best_iteration)
y_pred = np.argmax(y_pred_prob, axis=1)

# Evaluate the model
accuracy = accuracy_score(y_test, y_pred)
kappa = cohen_kappa_score(y_test, y_pred)
qwk = cohen_kappa_score(y_test, y_pred, weights='quadratic')

print(f'Test Accuracy: {accuracy:.2f}')
print(f'Cohen\'s Kappa: {kappa:.2f}')
print(f'Quadratic Weighted Kappa: {qwk:.2f}')
Test Accuracy: 0.68
Cohen's Kappa: 0.48
Quadratic Weighted Kappa: 0.66

Chia dữ liệu thành 3 tập sử dụng kappa evaluation function thay cho multi_logloss

# Split the data into train, eval, and test sets (60% train, 20% eval, 20% test)
X_temp, X_test, y_temp, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_train, X_eval, y_train, y_eval = train_test_split(X_temp, y_temp, test_size=0.25, random_state=42)  # 0.25 * 0.8 = 0.2

# Standardize the features
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_eval_scaled = scaler.transform(X_eval)
X_test_scaled = scaler.transform(X_test)

# Custom kappa evaluation function
def kappa_eval(preds, train_data):
    y_true = train_data.get_label()
    y_pred = np.argmax(preds.reshape(len(np.unique(y_true)), -1), axis=0)
    kappa = cohen_kappa_score(y_true, y_pred, weights='quadratic')
    return 'kappa', kappa, True

# Convert the data into LightGBM Datasets
dtrain = lgb.Dataset(X_train_scaled, label=y_train)
deval = lgb.Dataset(X_eval_scaled, label=y_eval, reference=dtrain)
dtest = lgb.Dataset(X_test_scaled, label=y_test, reference=dtrain)

# Set the parameters for LightGBM
params = {
    'objective': 'multiclass',
    'num_class': len(np.unique(y)),  # Number of classes
    'metric': 'multi_logloss',  # Default metric
    'max_depth': 6,
    'learning_rate': 0.1,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'seed': 42,
    'verbose': -1
}

# Train the LightGBM model with custom kappa evaluation
bst = lgb.train(params, dtrain, num_boost_round=100, valid_sets=[deval], feval=kappa_eval)

# Predict on the test set
y_pred_prob = bst.predict(X_test_scaled, num_iteration=bst.best_iteration)
y_pred = np.argmax(y_pred_prob, axis=1)

# Evaluate the model
accuracy = accuracy_score(y_test, y_pred)
kappa = cohen_kappa_score(y_test, y_pred)
qwk = cohen_kappa_score(y_test, y_pred, weights='quadratic')

print(f'Test Accuracy: {accuracy:.2f}')
print(f'Cohen\'s Kappa: {kappa:.2f}')
print(f'Quadratic Weighted Kappa: {qwk:.2f}')
Test Accuracy: 0.65
Cohen's Kappa: 0.44
Quadratic Weighted Kappa: 0.60

Thay metric = ‘custom’

# Set the parameters for LightGBM
params = {
    'objective': 'multiclass',
    'num_class': len(np.unique(y)),  # Number of classes
    'metric': 'custom',  # Default metrics
    'max_depth': 6,
    'learning_rate': 0.1,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'seed': 42,
    'verbose': -1
}

# Train the LightGBM model with custom kappa evaluation
bst = lgb.train(params, dtrain, num_boost_round=100, valid_sets=[deval], feval=kappa_eval)

# Predict on the test set
y_pred_prob = bst.predict(X_test_scaled, num_iteration=bst.best_iteration)
y_pred = np.argmax(y_pred_prob, axis=1)

# Evaluate the model
accuracy = accuracy_score(y_test, y_pred)
kappa = cohen_kappa_score(y_test, y_pred)
qwk = cohen_kappa_score(y_test, y_pred, weights='quadratic')

print(f'Test Accuracy: {accuracy:.2f}')
print(f'Cohen\'s Kappa: {kappa:.2f}')
print(f'Quadratic Weighted Kappa: {qwk:.2f}')
Test Accuracy: 0.65
Cohen's Kappa: 0.44
Quadratic Weighted Kappa: 0.60