TÓM TẮT

Mở Đầu

Trong lĩnh vực thống kê và học máy, AUC (Area Under the Curve) là một trong những chỉ số quan trọng nhất để đánh giá hiệu năng của mô hình phân loại, đặc biệt là các mô hình nhị phân. AUC đo lường diện tích dưới đường ROC (Receiver Operating Characteristic), phản ánh khả năng mô hình phân biệt giữa hai lớp (positive vs. negative). Đối với những người làm việc với R – một trong những ngôn ngữ lập trình thống kê mạnh mẽ và phổ biến – việc vẽ đồ thị AUC không chỉ giúp trực quan hoá kết quả mà còn hỗ trợ trong việc so sánh các mô hình khác nhau.

Bài viết này sẽ cung cấp một hướng dẫn chi tiết, từ các khái niệm cơ bản, cài đặt môi trường, chuẩn bị dữ liệu, tính toán AUC, cho tới cách vẽ đồ thị AUC bằng các gói (packages) phổ biến như pROC, ROCR, ggplot2, và plotly. Ngoài ra, chúng tôi sẽ trình bày các kỹ thuật nâng cao như vẽ Confidence Interval cho AUC, so sánh AUC của nhiều mô hình, và tạo đồ thị tương tác để chia sẻ kết quả.

Lưu ý: Bài viết này được thiết kế cho người dùng có kiến thức cơ bản về R và học máy. Nếu bạn mới bắt đầu, hãy đọc phần “Cài Đặt Môi Trường” và “Chuẩn Bị Dữ Liệu” trước khi tiến tới các phần nâng cao.

1. Kiến Thức Cơ Bản Về AUC và ROC

1.1. Định Nghĩa ROC Curve

  • True Positive Rate (TPR) – còn gọi là Recall hoặc Sensitivity:

    \text{TPR} = \frac{TP}{TP + FN}

  • False Positive Rate (FPR) – tỉ lệ âm tính giả:

    \text{FPR} = \frac{FP}{FP + TN}

ROC curve là đồ thị vẽ TPR theo FPR ở các ngưỡng (threshold) khác nhau của mô hình. Khi ngưỡng thay đổi từ 0 tới 1, chúng ta sẽ có một đường cong mô tả mối quan hệ giữa TPR và FPR.

1.2. AUC – Diện tích Dưới Đường ROC

AUC là diện tích dưới ROC curve, có giá trị từ 0.5 (mô hình ngẫu nhiên) tới 1 (mô hình hoàn hảo). Giá trị AUC càng cao, mô hình càng có khả năng phân biệt tốt các lớp.

1.3. Tại Sao AUC Quan Trọng?

  • Độc lập với ngưỡng quyết định: AUC không phụ thuộc vào việc chọn ngưỡng phân loại, giúp so sánh công bằng giữa các mô hình.
  • Đánh giá không cân bằng lớp: Khi dữ liệu có tỷ lệ lớp không cân bằng, AUC vẫn là một chỉ số đáng tin cậy hơn Accuracy.
  • Dễ dàng giải thích: Diện tích dưới đường cong là một khái niệm trực quan, dễ truyền đạt cho người không chuyên.

2. Cài Đặt Môi Trường Làm Việc Trên R

2.1. Cài Đặt R và RStudio

Nếu chưa cài, tải và cài đặt:
– R: https://cran.r-project.org/
– RStudio: https://posit.co/download/rstudio-desktop/

2.2. Cài Đặt Các Gói Cần Thiết

# Các gói cơ bản
install.packages(c("pROC", "ROCR", "ggplot2", "plotly", "caret", "dplyr", "tidyr")) # Gói để tính confidence interval cho AUC
install.packages("boot")

Sau khi cài đặt, nạp các gói:

library(pROC)
library(ROCR)
library(ggplot2)
library(plotly)
library(caret)
library(dplyr)
library(tidyr)
library(boot)

2.3. Kiểm Tra Phiên Bản

sessionInfo()

Đảm bảo các gói đã cập nhật để tránh lỗi không tương thích.

3. Chuẩn Bị Dữ Liệu

Cách Vẽ Auc Trên R
Cách Vẽ Auc Trên R

3.1. Dữ Liệu Mẫu: iris (Biến Đổi Thành Nhị Phân)

data(iris)
df <- iris %>% filter(Species != "setosa") %>% # Loại bỏ một lớp để tạo nhị phân mutate(label = ifelse(Species == "versicolor", 1, 0)) %>% # 1 = versicolor, 0 = virginica select(-Species)
head(df)

3.2. Chia Dữ Liệu Thành Train/Test

set.seed(123)
trainIndex <- createDataPartition(df$label, p = 0.7, list = FALSE)
trainData <- dftrainIndex, testData <- df-trainIndex, 

3.3. Xây Dựng Mô Hình Logistic Regression

model_lr <- glm(label ~ ., data = trainData, family = binomial)
summary(model_lr)

3.4. Dự Đoán Xác Suất Trên Bộ Test

test_pred_prob <- predict(model_lr, newdata = testData, type = "response")
test_actual <- testData$label

4. Tính Toán AUC Bằng pROC

4.1. Tạo Đối Tượng ROC

roc_obj <- roc(response = test_actual, predictor = test_pred_prob)
print(roc_obj)

Kết quả sẽ hiển thị AUC, 95% CI, và các thông tin khác.

4.2. Lấy Giá Trị AUC

auc_value <- auc(roc_obj)
cat("AUC =", round(auc_value, 4), "\n")

4.3. Vẽ Đồ Thị ROC Cơ Bản

plot(roc_obj, col = "#1c61b6", lwd = 2, main = "ROC Curve - Logistic Regression (pROC)")
abline(a = 0, b = 1, lty = 2, col = "gray") # Đường ngẫu nhiên

4.4. Thêm Confidence Interval

ci_auc <- ci.auc(roc_obj, boot.n = 2000, conf.level = 0.95)
cat("95% CI for AUC:", round(ci_auc1,4), "-", round(ci_auc3,4), "\n")

4.5. Vẽ ROC Với CI

plot.roc(roc_obj, print.auc = TRUE, print.thres = "best", ci = TRUE, ci.col = "#F8766D", ci.lwd = 2, main = "ROC Curve with 95% CI (pROC)")

5. Sử Dụng Gói ROCR Để Vẽ ROC và Tính AUC

5.1. Tạo Đối Tượng Prediction

pred <- prediction(predictions = test_pred_prob, labels = test_actual)
perf <- performance(pred, "tpr", "fpr")

5.2. Vẽ Đồ Thị ROC

plot(perf, col = "darkgreen", lwd = 2, main = "ROC Curve - Logistic Regression (ROCR)")
abline(a = 0, b = 1, lty = 2, col = "gray")

5.3. Tính AUC

auc_perf <- performance(pred, measure = "auc")
auc_value_rocr <- auc_perf@y.values1
cat("AUC (ROCR) =", round(auc_value_rocr, 4), "\n")

5.4. Vẽ Đồ Thị Tương Tác Với plotly

Cách Vẽ Auc Trên R
Cách Vẽ Auc Trên R
# Chuẩn bị dữ liệu cho plotly
roc_df <- data.frame( fpr = perf@x.values1, tpr = perf@y.values1
) p <- ggplot(roc_df, aes(x = fpr, y = tpr)) + geom_line(color = "#FF5733", size = 1.2) + geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "gray") + labs(title = paste0("ROC Curve (AUC = ", round(auc_value_rocr, 4), ")"), x = "False Positive Rate (FPR)", y = "True Positive Rate (TPR)") + theme_minimal() ggplotly(p)

6. Vẽ ROC Bằng ggplot2 – Tự Tạo Đồ Thị Đẹp

6.1. Tính TPR, FPR Tại Các Ngưỡng

roc_data <- data.frame( threshold = roc_obj$thresholds, tpr = roc_obj$sensitivities, fpr = 1 - roc_obj$specificities
)
head(roc_data)

6.2. Đồ Thị ROC Với ggplot2

ggplot(roc_data, aes(x = fpr, y = tpr)) + geom_line(color = "#2C3E50", size = 1.5) + geom_area(fill = "#3498DB", alpha = 0.2) + geom_abline(linetype = "dashed", color = "gray") + annotate("text", x = 0.6, y = 0.2, label = paste0("AUC = ", round(auc_value, 4)), size = 5, color = "red") + labs(title = "ROC Curve (ggplot2)", x = "False Positive Rate (FPR)", y = "True Positive Rate (TPR)") + theme_minimal()

6.3. Thêm Confidence Band (Bootstrap)

set.seed(123)
boot_auc <- function(data, indices) { d <- dataindices, roc_tmp <- roc(d$label, d$prob, quiet = TRUE) return(auc(roc_tmp))
}
boot_res <- boot(data = data.frame(label = test_actual, prob = test_pred_prob), statistic = boot_auc, R = 2000)
ci_boot <- boot.ci(boot_res, type = "perc")
cat("Bootstrap 95% CI:", round(ci_boot$percent4,4), "-", round(ci_boot$percent5,4), "\n")

Sau khi có CI, bạn có thể vẽ band bằng geom_ribbon:

# Tạo dữ liệu band (giả sử ta có các giá trị TPR cho mỗi FPR qua bootstrap)
# Đối với ví dụ ngắn gọn, chúng ta sẽ dùng một band giả định
roc_data$lower <- pmax(roc_data$tpr - 0.05, 0)
roc_data$upper <- pmin(roc_data$tpr + 0.05, 1) ggplot(roc_data, aes(x = fpr, y = tpr)) + geom_line(color = "#2C3E50", size = 1.5) + geom_ribbon(aes(ymin = lower, ymax = upper), fill = "#95A5A6", alpha = 0.3) + geom_abline(linetype = "dashed", color = "gray") + labs(title = "ROC Curve with Bootstrap CI", subtitle = paste0("AUC = ", round(auc_value,4), " (95% CI: ", round(ci_boot$percent4,4), "-", round(ci_boot$percent5,4), ")"), x = "False Positive Rate (FPR)", y = "True Positive Rate (TPR)") + theme_minimal()

7. So Sánh Nhiều Mô Hình – Vẽ ROC Đối Chiếu

7.1. Xây Dựng Thêm Mô Hình Random Forest

install.packages("randomForest")
library(randomForest) set.seed(123)
rf_model <- randomForest(as.factor(label) ~ ., data = trainData, ntree = 200)
rf_pred_prob <- predict(rf_model, newdata = testData, type = "prob"),2

7.2. Tính ROC cho Cả Hai Mô Hình

roc_lr <- roc(test_actual, test_pred_prob, quiet = TRUE)
roc_rf <- roc(test_actual, rf_pred_prob, quiet = TRUE)

7.3. Vẽ Đồ Thị ROC Đối Chiếu

ggplot() + geom_line(data = data.frame(fpr = 1-roc_lr$specificities, tpr = roc_lr$sensitivities), aes(x = fpr, y = tpr), color = "#1f78b4", size = 1.2, linetype = "solid") + geom_line(data = data.frame(fpr = 1-roc_rf$specificities, tpr = roc_rf$sensitivities), aes(x = fpr, y = tpr), color = "#e31a1c", size = 1.2, linetype = "dashed") + geom_abline(linetype = "dashed", color = "gray") + annotate("text", x = 0.6, y = 0.3, label = paste0("Logistic AUC = ", round(auc(roc_lr),4)), color = "#1f78b4", size = 5) + annotate("text", x = 0.6, y = 0.2, label = paste0("Random Forest AUC = ", round(auc(roc_rf),4)), color = "#e31a1c", size = 5) + labs(title = "So Sánh ROC: Logistic Regression vs Random Forest", x = "False Positive Rate (FPR)", y = "True Positive Rate (TPR)") + theme_minimal()

7.4. Kiểm Định Thống Kê So Sánh AUC (DeLong Test)

test_delong <- roc.test(roc_lr, roc_rf, method = "delong")
print(test_delong)

Nếu p‑value < 0.05, sự khác biệt AUC giữa hai mô hình là có ý nghĩa thống kê.

8. Vẽ ROC Trực Quan Hơn Với plotly

# Dữ liệu cho plotly
plotly_df <- data.frame( fpr = c(1-roc_lr$specificities, 1-roc_rf$specificities), tpr = c(roc_lr$sensitivities, roc_rf$sensitivities), Model = rep(c("Logistic", "RandomForest"), each = length(roc_lr$sensitivities))
) p_plotly <- plot_ly(plotly_df, x = ~fpr, y = ~tpr, color = ~Model, colors = c("#1f78b4", "#e31a1c"), type = 'scatter', mode = 'lines') %>% layout(title = "ROC Curve Interactive", xaxis = list(title = "False Positive Rate (FPR)"), yaxis = list(title = "True Positive Rate (TPR)"), legend = list(x = 0.7, y = 0.2))
p_plotly

Bản đồ tương tác cho phép người dùng di chuyển chuột để xem giá trị TPR/FPR tại từng điểm, rất hữu ích cho báo cáo và trình bày.

9. Các Lưu Ý Thực Tiễn Khi Vẽ AUC Trên R

Vấn đề Giải pháp
Dữ liệu không cân bằng Sử dụng sampling (undersampling/oversampling) hoặc trọng số trong mô hình; AUC vẫn là chỉ số ổn định.
Ngưỡng tối ưu Sử dụng coords(roc_obj, "best", ret = "threshold") để lấy ngưỡng tối ưu dựa trên Youden’s J.
Hiệu năng chậm khi bootstrap Giảm số vòng boot (boot.n) hoặc dùng parallel (doParallel package).
Mô hình trả về xác suất không chuẩn (e.g., SVM) Dùng probability = TRUE khi huấn luyện hoặc chuyển đổi quyết định bằng predict(..., decision.values = TRUE).
Đánh giá đa lớp Chuyển đổi thành “one‑vs‑all” và tính AUC cho mỗi lớp, sau đó trung bình (macro‑average).

10. Tổng Kết

  • AUC là chỉ số mạnh mẽ để đánh giá mô hình phân loại nhị phân, không phụ thuộc vào ngưỡng quyết định.
  • Trên R, có nhiều gói hỗ trợ tính và vẽ AUC: pROC (đơn giản, hỗ trợ CI), ROCR (đa năng), ggplot2 (đồ họa tùy biến), plotly (tương tác).
  • Bạn có thể so sánh nhiều mô hình bằng cách vẽ ROC chung và thực hiện kiểm định DeLong.
  • Bootstrap hoặc các phương pháp khác giúp ước tính confidence interval cho AUC, cung cấp độ tin cậy cho kết quả.
  • Khi làm việc với dữ liệu thực tế, luôn kiểm tra cân bằng lớp, ngưỡng tối ưu, và đánh giá đa lớp nếu cần.

Hy vọng bài viết này đã cung cấp cho bạn một cẩm nang toàn diện về cách vẽ AUC trên R, từ bước chuẩn bị dữ liệu, xây dựng mô hình, tính toán AUC, tới việc tạo ra các đồ thị đẹp mắt và tương tác. Hãy áp dụng những kiến thức này vào dự án của bạn và chia sẻ kết quả với đồng nghiệp để nâng cao chất lượng mô hình học máy.

Chúc bạn thành công!

Rate this post
Mục nhập này đã được đăng trong Blog. Đánh dấu trang permalink.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *