9  Đánh giá mô hình

Author

An Le

10 Các chỉ số cho kết cục định tính (Classification)

Trước khi tính các chỉ số đánh giá mô hình cho kết cục định tính, chúng ta cần nắm rõ các thành phần chính để tính ra các chỉ số đó, một khái niệm phải ghi nhớ là Confusion Matrix (Fawcett 2006):

  • True Positive (TP): Dự báo có dịch, thực tế có dịch.
  • True Negative (TN): Dự báo không dịch, thực tế không dịch.
  • False Positive (FP): Dự báo có dịch, thực tế không dịch (hay còn gọi là dương tính giả).
  • False Negative (FN): Dự báo không dịch, thực tế có dịch (hay còn gọi là âm tính giả).

10.1 Các chỉ số đánh giá dựa trên Confusion Matrix

10.1.1 Accuracy

Độ chính xác là tỷ lệ phần trăm các trường hợp được mô hình dự đoán đúng trên tổng số các trường hợp được đánh giá. Cho biết mô hình “đoán đúng” được bao nhiêu phần trăm (Fawcett 2006).

Caution

Tuy nhiên, cần thận trọng sử dụng khi bộ dữ liệu mất cân bằng (ví dụ số tuần không có dịch chiếm 90%, chỉ cần mô hình luôn đoán “không có dịch” thì Accuracy vẫn đạt 90% nhưng mô hình hoàn toàn vô dụng, nghĩa là nói đại cũng đúng nên mô hình không cần thiết).

\[Accuracy=\frac{TP+TN}{TP+TN+FP+FN}\]

Ví dụ: Mô hình cảnh báo sớm dịch TCM tại cộng đồng dự báo cho 100 phường/xã. Nếu mô hình dự báo đúng 80 phường (bao gồm cả đoán đúng phường có dịch và đoán đúng phường không có dịch) thì Accuracy của mô hình là 80%.

10.1.2 Recall (Senstivity)

Độ nhạy đo lường khả năng mô hình “bắt” được các trường hợp dương tính thật (Fawcett 2006). Trong dịch tễ, đây thường là chỉ số quan trọng nhất cho việc cảnh báo sớm, vì việc bỏ sót một ca bệnh có thể dẫn đến bùng phát dịch đối với các bệnh có hệ số lây nhiễm cao như Sởi.

\[Recall=\frac{TP}{TP+TN}\]

Ví dụ: Trong hệ thống trí tuệ nhân tạo sàng lọc ca nhiễm COVID-19 qua ảnh X-quang, nếu thực tế có 100 bệnh nhân mắc bệnh, nhưng mô hình chỉ nhận diện được 85 người thì độ nhạy là 85%.

10.1.3 Specificity

Độ đặc hiệu đo lường khả năng mô hình nhận diện đúng các trường hợp “không dịch” (Fawcett 2006). Một mô hình có độ đặc hiệu cao sẽ giúp hạn chế tối đa các trường hợp cảnh báo giả. Trong y tế, điều này giúp tránh lãng phí nguồn lực chống dịch.

\[Recall=\frac{TN}{TN+FP}\]

Ví dụ: Sử dụng test nhanh để sàng lọc một loại virus mới. Nếu có 100 người thực sự khỏe mạnh, nhưng test lại cho rằng 5 người dương tính thì độ đặc hiệu là 95%.

10.1.4 Precision (Positive Predictive Value-PPV)

Giá trị tiên đoán dương trả lời câu hỏi Khi mô hình phát tín hiệu cảnh báo có dịch, chúng ta có thể tin tưởng được bao nhiêu phần trăm?. Nó bị kéo giảm nặng nề nếu mô hình tung ra quá nhiều cảnh báo giả (Fawcett 2006).

\[Precision=\frac{TP}{TP+FP}\]

Ví dụ: Nếu mô hình dự báo 10 chuyến bay nhập cảnh có nguy cơ cao, nhưng thực tế rà soát chỉ có 6 chuyến bay mang mầm bệnh thì Precision đạt 60%.

10.1.5 Negative Predictive Value - NPV

Giá tri jtieen đoán âm trả lời câu hỏi Khi mô hình báo không dịch, chúng ta có thể tin tưởng được bao nhiêu phần trăm? Trong sàng lọc cộng đồng, nếu NPV thấp người được dự báo âm tính vẫn có nguy cơ mang mầm bệnh đi lây lan (Fawcett 2006).

\[NPV=\frac{TN}{TN+FN}\]

10.1.6 F1-Score

Là chỉ số được tính từ Precision và Recall, được sử dụng để tìm điểm cân bằng giữa việc không bỏ sót ca bệnh và không báo động giả quá nhiều, đặc biệt khi dữ liệu mất cân bằng (Fawcett 2006).

\[Recall=2\times\frac{Precision\times{Recall}}{Precision + Recall}\]

Ví dụ:: Dự báo biến chứng nặng ở bệnh nhân tay chân miệng. Cần F1-Score cao để đảm bảo vừa bắt được ca nặng, vừa không chuyển nhầm ca nhẹ gây quá tải.

Confusion Matrix
80%
Accuracy
80%
Recall
80%
Specific
80%
Precision
80%
NPV
80%
F1-Score

10.2 Các chỉ số đánh giá dựa trên xác suất

10.2.1 ROC Curve

ROC là đường cong biểu diễn tỷ lệ True Positive Rate (Recall) và False Positive Rate (1 - Specificity) ở mọi ngưỡng cắt (threshold) (Hosmer Jr, Lemeshow, and Sturdivant 2013). AUC là diện tích dưới đường cong ROC. Trên thực tế, giá trị AUC = 0.5 là đoán mò nên không có ý nghĩa, AUC = 1.0 là hoàn hảo nhưng thực tế thì không bao giờ có.

\[AUC = \int_{0}^{1} TPR(FPR) \, d(FPR)\]

Theo các tác giả Hosmer và Lemshow (Hosmer Jr, Lemeshow, and Sturdivant 2013), thì AUC được phân thành các ngưỡng:

  • AUC = 0.5: Không có sự khác biệt (hên xui).

  • 0.5 < AUC < 0.7: Kém, không khác biệt nhiều so với hên xui.

  • 0.7 <= AUC < 0.8: Chấp nhận được.

  • 0.8 <= AUC < 0.9: Tốt.

  • AUC >= 0.9: Rất tốt.

10.2.2 Brier Score

Đo lường sai số bình phương giữa xác suất dự báo và kết cục thực tế (1: Có dịch, 0: Không dịch). Brier Score dao động từ 0 đến 1, điểm càng thấp mô hình dự báo xác suất càng sát với thực tế (Steyerberg 2019).

\[BS=\frac{1}{N}\sum_{i=1}^{N}(p_i-o_i)^2\]

(Trong đó \(p_i\) là xác suất, \(o_i \in \{0, 1\}\) là kết cục thực tế).

Ví dụ: Dự báo “Xác suất bùng dịch tả là 80%”. Thực tế có bùng dịch (\(o=1\)). Sai số của lần dự báo này là \((0.80 - 1)^2 = 0.04\).

Điều chỉnh xác suất dự báo bùng phát dịch

Brier Score
0.100 (Càng thấp càng tốt)
Đường cong ROC AUC = 0.875

10.3 Thực hành

Code
df <- tibble(
  obs = factor(c(1, 0, 0, 1, 0, 0, 1, 0, 0, 0)),
  pred = factor(c(1, 0, 0, 0, 0, 1, 1, 0, 0, 0))
)

acc <- yardstick::accuracy(df, truth = obs, estimate = pred)
recall <- yardstick::sens(df, truth = obs, estimate = pred)
spec <- yardstick::spec(df, truth = obs, estimate = pred)
precision <- yardstick::ppv(df, truth = obs, estimate = pred)
npv <- yardstick::npv(df, truth = obs, estimate = pred)
f1_score <- yardstick::f_meas(df, truth = obs, estimate = pred)

data.frame(acc$.estimate, recall$.estimate, spec$.estimate, precision$.estimate, npv$.estimate, f1_score$.estimate) %>% 
  rename("Accuracy" = acc..estimate,
         "Recall" = recall..estimate,
         "Specificity" = spec..estimate,
         "Precision" = precision..estimate,
         "NPV" = npv..estimate,
         "F1-Score" = f1_score..estimate) %>% 
  knitr::kable()
Accuracy Recall Specificity Precision NPV F1-Score
0.8 0.8571429 0.6666667 0.8571429 0.6666667 0.8571429
Code
obs_p <- c(1, 0, 1, 1, 0, 0, 0, 1, 1, 0)
pred_p <- c(0.9, 0.1, 0.8, 0.4, 0.3, 0.5, 0.4, 0.6, 0.7, 0.7)
brier_score <- mean((pred_p - obs_p)^2)
print(paste0("Brier score = ",brier_score))
[1] "Brier score = 0.166"
Code
roc_obj <- roc(obs_p, pred_p, quiet = TRUE)
auc_val <- round(auc(roc_obj), 3)
ci_vals <- ci.auc(roc_obj)
ci_lower <- round(ci_vals[1], 3)
ci_upper <- round(ci_vals[3], 3)
print(paste0("AUC = ", auc_val, " (95% CIs: ", ci_lower, " - ", ci_upper, ")"))
[1] "AUC = 0.84 (95% CIs: 0.583 - 1)"
Chỉ số Ý nghĩa
Accuracy Tỷ lệ dự báo đúng tổng thể (đoán đúng vùng có dịch và đoán đúng vùng an toàn).
Recall (Sensitivity) Khả năng bắt trúng các đợt bùng phát, hạn chế tối đa việc bỏ lọt ổ dịch.
Specificity Khả năng nhận diện đúng các khu vực an toàn, hạn chế các báo động giả.
Precision (PPV) Sự tự tin khi hệ thống phát tín hiệu cảnh báo (báo có dịch bao nhiêu lần thì trúng bấy nhiêu).
NPV Sự tự tin khi hệ thống dự báo "không có dịch".
F1-Score Trung bình điều hòa, điểm cân bằng giữa việc phát hiện ổ dịch (Recall) và tránh báo động nhầm (Precision).
Brier Score Đo lường mức độ sai lệch của con số xác suất dự báo bùng dịch.
AUC Năng lực phân tách và xếp hạng mức độ rủi ro giữa vùng sắp có dịch và vùng an toàn.

11 Các chỉ số đánh giá cho kết cục định lượng (Regression)

11.1 Đo lường sai số tuyệt đối và bình phương

11.1.1 Mean Absolute Error - MAE

Sai số tuyệt đối trung bình là giá trị trung bình tuyệt đối của sự chênh lệch giữa dự báo và thực tế. Đây là chỉ số trực quan nhất vì nó có cùng đơn vị với biến mục tiêu. Nó cho biết, trung bình mỗi lần dự đoán, mô hình của bạn bị lệch so với thực tế bao nhiêu đơn vị. MAE khá “lành tính” và không bị khuếch đại bởi các giá trị ngoại lai (outliers) (Hyndman and Athanasopoulos 2018).

\[MAE=\frac{1}{n}\sum_{i=1}^{n}|y_i-\hat{y}_i|\]

Ví dụ: Mô hình dự báo số ca Sởi cho 22 quận/huyện. Nếu MAE = 15 ca, nghĩa là trung bình cứ ở mỗi quận, con số dự báo của bạn đang lệch 15 ca so với số liệu ghi nhận thực tế trên hệ thống giám sát.

11.1.2 Root Mean Squared Error - RMSE

Căn bậc hai sai số toàn phương trung bình là giá trị căn bậc hai của MSE để đưa chỉ số sai số về lại cùng đơn vị đo lường ban đầu. Nó mang đầy đủ đặc tính của MSE nhưng dễ diễn giải hơn (Hyndman and Athanasopoulos 2018).

\[RMSE=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2}\]

Ví dụ: Giả sử dự báo sai 2 ca ở 10 quận, RMSE thường nhỏ, nhưng nếu dự báo sai 20 ca ở 1 quận, RMSE sẽ rất lớn.

11.2 Đo lường sai số phần trăm

11.2.1 Mean Percentage Error - MPE

Sai số phần trăm trung bình cho biết sai số tính bằng phần trăm nhưng giữ nguyên dấu (không lấy trị tuyệt đối). Chỉ số này chẩn đoán xem hệ thống có bị sai lệch (bias) hay không, theo dõi xu hướng dự báo quá cao (over-forecasting, MPE âm) hay dự báo quá thấp (under-forecasting, MPE dương) (Hyndman and Athanasopoulos 2018).

\[MPE=\frac{100\%}{n}\sum_{i=1}^{n}\frac{y_i-\hat{y}_i}{y_i}\]

Ví dụ: Nếu MPE = +20% thì mô hình đang gặp tình trạng “dự báo thiếu” (Under-forecast), thực tế có 100 ca mà nó hay đoán 80 ca. Nhưng nếu MPE = -20% thì thực tế 100 ca mà nó toàn rú lên 120 ca (Over-forecast). MPE gần 0% không có nghĩa là mô hình dự báo đúng, mà chỉ là tổng số lần dự báo thiếu và đoán quá mức đang bằng nhau.

11.2.2 Mean Absolute Percentage Error - MAPE

Sai số phần trăm tuyệt đối trung bình đo lường sai số bằng phần trăm tuyệt đối, giống với MPE nhưng thêm trị tuyệt đối (Hyndman and Athanasopoulos 2018; Chai and Draxler 2014).

\[MAPE=\frac{100\%}{n}\sum_{i=1}^{n}\left|\frac{y_i-\hat{y}_i}{y_i}\right|\]

Ví dụ: Vì có trị tuyệt tối nên nếu MAPE = 10% nghĩa là dù ở quận 100 ca hay 50 ca, thì cứ cộng trừ khoảng 10% sai số để dự trù nguồn lực.

11.3 Mức độ phù hợp của mô hình

R-squared (\(R^2\)) là hệ số xác định cho biết tỷ lệ phương sai của biến mục tiêu được giải thích bởi mô hình (Chicco, Warrens, and Jurman 2021). Hệ số \(R^2\) có thể được sử dụng cho cả kết cục định lượng và định tính.

Tip

Hệ số \(R^2\) có thể nằm trong khoảng giá trị (−∞, 1].

Caution

Nếu \(R^2\) < 0 thì có thể:

  • Chọn sai mô hình: Ví dụ đợt bùng phát COVID-19 tăng trưởng theo hàm mũ (exponential) nhưng mô hình lại áp dụng một đường thẳng tuyến tính (linear) để fit dữ liệu.

  • Mô hình bị overfitting: vấn đề cần lưu ý khi sử dụng mô hình ML, nếu việc train quá mức dẫn đến dự báo trên tệp dữ liệu mới hoàn toàn sai nên \(R^2\) có thể tiến tới âm vô cực.

\[R^2=1-\frac{RSS}{TSS}=\frac{\sum_{i=1}^{n}(y_i-\hat{y}_i)^2}{\sum_{i=1}^{n}(y_i-\bar{y})^2}\]

Trong đó:\(TSS\) (Total Sum of Squares) là sai số bằng giá trị trung bình của dữ liệu thực tế (một đường ngang horizontal line). \(RSS\) (Residual Sum of Squares) là sai số của cái mô hình dự báo xây dựng.

Ví dụ: Nghiên cứu tác động của mật độ dân số, nhiệt độ và lượng mưa đến số ca mắc sởi. Nếu tính ra \(R^2 = 0.75\), ta có thể khẳng định 3 yếu tố này giải thích được 75% lý do số ca mắc tăng/giảm, 25% còn lại do các yếu tố ngẫu nhiên khác.

Điều chỉnh Kịch bản Dự báo
Lố (Over)ChuẩnHụt (Under)
Bám sát thực tếSai số cao
Bình thườngSai thảm họa 1 quận
Chỉ số mô hình
MAE: 0.0 ca
RMSE: 0.0 ca

MAPE: 0.0 %
MPE: 0.0 %
(Cân bằng)

R²: 100.0 %
Dự báo (Predicted)
Thực tế (Actual)
y = x (Hoàn hảo)
Đường Mô hình

11.4 Thực hành

Code
df <- data.frame(
  obs = c(15, 20, 25, 30, 40),
  pred  = c(12, 22, 23, 31, 35)
)

mae  <- yardstick::mae(df, obs, pred)
rmse <- yardstick::rmse(df, obs, pred)
mpe <- yardstick::mpe(df, obs, pred)
mape <- yardstick::mape(df, obs, pred)
r2 <- yardstick::rsq(df, obs, pred)

results <- data.frame(
  Index = c("MAE", "RMSE", "MPE", "MAPE", "R-squared"),
  Value = c(mae$.estimate, rmse$.estimate, mpe$.estimate, mape$.estimate, r2$.estimate)
)

results$Value <- round(results$Value, 2)

knitr::kable(results)
Index Value
MAE 2.60
RMSE 2.93
MPE 5.43
MAPE 10.77
R-squared 0.91
Chỉ số Ý nghĩa
MAE Sai số trung bình mang cùng đơn vị đo lường thực tế, ít bị lệch bởi ca dị biệt.
MSE Phạt rất nặng các lần dự báo sai lệch quá lớn. Đơn vị bị bình phương.
RMSE Giữ nguyên đặc tính phạt lỗi lớn của MSE nhưng đưa về lại đơn vị thực tế.
MPE Đo lường sự thiên lệch (Bias) bằng %. Biết được mô hình hay đoán vống hay đoán hụt.
MAPE Sai số quy đổi ra tỷ lệ phần trăm (%), không quan tâm đến quy mô dữ liệu lớn nhỏ.
R-squared Tỷ lệ biến thiên của dịch bệnh được giải thích bởi các yếu tố đầu vào.