data-science · Vietnamese · 15 min
🇺🇸 Read in EnglishĐánh Giá Mô Hình Machine Learning Đúng Cách: Từ Accuracy Đến NDCG
January 26, 2026
Một mô hình đạt 99% accuracy mà không bắt được một giao dịch gian lận nào. Bài này giải thích toàn bộ hệ thống chỉ số đánh giá ML — từ confusion matrix đến NDCG — và cách chọn đúng metric cho bài toán kinh doanh của bạn.
Một mô hình phân loại gian lận đạt 99% accuracy. Nghe có vẻ xuất sắc — cho đến khi bạn nhận ra rằng 99% giao dịch là hợp lệ, và mô hình chỉ đơn giản dự đoán "không gian lận" cho tất cả. Không bắt được một trường hợp gian lận nào. Accuracy 99%, giá trị thực sự: bằng không.
Đây là lý do tại sao việc chọn đúng metric đánh giá quan trọng không kém gì việc chọn đúng mô hình. Mỗi metric là một cách nén thông tin — và mỗi cách nén đều đánh đổi một thứ gì đó. Bài viết này đi qua toàn bộ hệ thống: classification, regression, ranking, clustering, cross-validation, và cuối cùng là một khung quyết định để bạn chọn đúng metric cho từng bài toán cụ thể.
Confusion Matrix: Nền Tảng Của Mọi Thứ
Trước khi nói đến bất kỳ con số nào, cần hiểu rõ bốn ô của confusion matrix. Với bài toán phân loại nhị phân (positive/negative), mô hình có thể mắc hai loại sai:
- True Positive (TP): dự đoán positive, thực tế positive — đúng
- True Negative (TN): dự đoán negative, thực tế negative — đúng
- False Positive (FP) / Type I Error: dự đoán positive, thực tế negative — báo động nhầm
- False Negative (FN) / Type II Error: dự đoán negative, thực tế positive — bỏ sót
Hãy nghĩ đến một ví dụ cụ thể: 1.000 bệnh nhân, trong đó 100 người thực sự mắc bệnh. Mô hình của bạn dự đoán 120 người bị bệnh: 80 người trong số đó đúng là bệnh nhân (TP), 40 người khỏe mạnh bị chẩn đoán nhầm (FP). Trong số 100 người thực sự bệnh, mô hình bỏ sót 20 người (FN). Toàn bộ câu chuyện đánh giá bắt đầu từ bốn con số này.
Như Bishop trong "Pattern Recognition and Machine Learning" đặt nền tảng, và Sokolova & Lapalme phân tích có hệ thống, mọi chỉ số phân loại đều là hàm của bốn ô này. Nắm được confusion matrix là nắm được tất cả.
Classification Metrics
Accuracy — Và Khi Nào Nó Phản Bội Bạn
Accuracy = (TP + TN) / (TP + TN + FP + FN)
Đây là chỉ số trực quan nhất: tỉ lệ dự đoán đúng trên tổng số mẫu. Và đây cũng là chỉ số dễ bị hiểu sai nhất. Accuracy chỉ có ý nghĩa khi các lớp cân bằng. Khi dữ liệu có 99% lớp âm và 1% lớp dương, một mô hình ngốc chỉ nói "không" mọi lúc sẽ đạt accuracy 99% — mà không học được gì.
Precision và Recall — Hai Phía Của Một Sự Đánh Đổi
Precision = TP / (TP + FP)
Trong số tất cả những gì mô hình nói là "positive", bao nhiêu phần trăm thực sự positive? Câu hỏi của Precision: Khi tôi nói có, tôi đúng bao nhiêu lần?
Recall (Sensitivity) = TP / (TP + FN)
Trong số tất cả những mẫu thực sự positive, mô hình tìm ra được bao nhiêu? Câu hỏi của Recall: Tôi đã bắt được bao nhiêu phần trăm các trường hợp thực sự?
Sự đánh đổi giữa hai chỉ số này là cốt lõi của machine learning ứng dụng. Tăng ngưỡng phân loại (threshold) → Precision tăng, Recall giảm. Hạ threshold → ngược lại. Không có điểm tối ưu tuyệt đối — điểm tối ưu phụ thuộc vào bài toán.
Như Davis & Goadrich phân tích trong ICML 2006, đây là mối quan hệ nền tảng không thể tránh khỏi trong phân loại nhị phân.
Bối cảnh kinh doanh quyết định ưu tiên:
| Bài toán | Ưu tiên | Lý do |
|---|---|---|
| Chẩn đoán ung thư | Recall | Bỏ sót ca bệnh (FN) = hậu quả nghiêm trọng |
| Lọc spam | Precision | Mất email hợp lệ (FP) gây phiền hà lớn |
| Phát hiện gian lận | Recall trước, rồi Precision | Bỏ sót gian lận tốn kém; cảnh báo nhầm nhiều = người dùng mất tin tưởng |
| Tìm kiếm tài liệu pháp lý | Recall | Không được bỏ sót tài liệu liên quan |
| Gợi ý sản phẩm | Precision | Gợi ý không liên quan phá hỏng trải nghiệm |
F1-Score và F-Beta
F1 = 2 × (Precision × Recall) / (Precision + Recall)
F1 là trung bình điều hòa (harmonic mean) của Precision và Recall — nó phạt nặng những mô hình quá thiên về một bên. Nếu Precision = 1.0 và Recall = 0.1, F1 = 0.18, không phải 0.55.
F-beta = (1 + β²) × (Precision × Recall) / (β² × Precision + Recall)
Khi β > 1: Recall được coi trọng hơn (y tế, screening). Khi β < 1: Precision được coi trọng hơn (spam filter).
ROC-AUC — Đánh Giá Không Phụ Thuộc Threshold
ROC curve vẽ True Positive Rate (Recall) trên trục y và False Positive Rate (1 - Specificity) trên trục x, tại tất cả các ngưỡng phân loại có thể. Fawcett (2006) đưa ra cách đọc trực quan nhất:
- Đường chéo (AUC = 0.5): mô hình không tốt hơn đoán mò
- AUC = 1.0: phân loại hoàn hảo
- Cách đọc xác suất: AUC = 0.85 nghĩa là nếu lấy ngẫu nhiên một mẫu dương và một mẫu âm, mô hình sẽ cho mẫu dương điểm cao hơn 85% trường hợp
ROC-AUC không phụ thuộc vào threshold, và tương đối ổn định khi dữ liệu mất cân bằng vừa phải.
Khi nào dùng PR-AUC thay vì ROC-AUC? Khi lớp dương rất hiếm (fraud, bệnh hiếm), ROC-AUC có thể tạo cảm giác lạc quan giả — vì TN lớn áp đảo mẫu số của FPR. Trong trường hợp này, PR-AUC (diện tích dưới đường cong Precision-Recall) phản ánh thực tế hơn.
Quy tắc thực tế: Dùng ROC-AUC khi lớp âm cũng quan trọng. Dùng PR-AUC khi chỉ quan tâm đến lớp dương hiếm.
Log Loss — Đánh Giá Xác Suất
Log Loss = -1/N × Σ [y × log(p) + (1 - y) × log(1 - p)]
Log loss phạt nặng những dự đoán tự tin mà sai. Nếu mô hình nói 95% khả năng là gian lận nhưng thực tế không phải, penalty rất cao. Nếu mô hình nói 60%, penalty nhẹ hơn nhiều.
Dùng log loss khi xác suất đầu ra quan trọng — risk scoring, y tế, credit scoring. Log loss = 0 là hoàn hảo; không có giới hạn trên (cao hơn = tệ hơn).
Regression Metrics
MAE — Sai Số Trung Bình Tuyệt Đối
MAE = 1/N × Σ |y_i - ŷ_i|
MAE là trung bình của các sai số tuyệt đối, cùng đơn vị với target. Trực quan, dễ giải thích với stakeholder: "Trung bình mô hình dự đoán sai X nghìn đồng." Vì dùng giá trị tuyệt đối (không bình phương), MAE robust với outlier hơn RMSE.
Dùng MAE khi: outlier trong dữ liệu không đại diện cho thực tế cần quan tâm, và bạn muốn đánh giá sai số trung bình trên tất cả mẫu một cách công bằng.
RMSE — Nhạy Cảm Với Sai Số Lớn
RMSE = √(1/N × Σ (y_i - ŷ_i)²)
RMSE bình phương sai số trước khi lấy trung bình, khiến những sai số lớn bị phạt nặng hơn nhiều so với MAE. Như Willmott & Matsuura (2005) phân tích, RMSE nhạy cảm hơn với outlier và phù hợp hơn khi sai số lớn có hậu quả nghiêm trọng — thiếu hàng tồn kho, lỗi kết cấu công trình.
RMSE cùng đơn vị với target (khác với MSE), nên vẫn có thể giải thích được.
MAPE — So Sánh Theo Tỉ Lệ Phần Trăm
MAPE = 100% × 1/N × Σ |y_i - ŷ_i| / |y_i|
MAPE không phụ thuộc vào đơn vị đo, rất hữu ích khi cần so sánh hiệu suất mô hình trên các sản phẩm hay thị trường có quy mô khác nhau. Đây là ngôn ngữ chung của các team dự báo kinh doanh.
Giới hạn quan trọng: MAPE không xác định khi y_i = 0, và bất đối xứng — overestimate 20% và underestimate 20% trên cùng giá trị thực sẽ cho MAPE khác nhau. Như Hyndman & Koehler (2006) chỉ ra, với chuỗi thời gian nên xem xét MASE (Mean Absolute Scaled Error) thay thế.
R² — Phần Variance Được Giải Thích
R² = 1 - SS_res / SS_tot
R² = 1 là hoàn hảo; R² = 0 nghĩa là mô hình không tốt hơn chỉ đơn giản dự đoán giá trị trung bình; R² < 0 nghĩa là mô hình tệ hơn cả dự đoán trung bình.
Lưu ý quan trọng: R² cao không đảm bảo mô hình tốt. Nếu variance trong dữ liệu lớn, R² có thể cao ngay cả khi sai số tuyệt đối lớn. Luôn kết hợp R² với RMSE hoặc MAE để có bức tranh đầy đủ.
Adjusted R² = 1 - (1 - R²) × (N-1)/(N-k-1) phạt thêm feature không có ích — dùng khi so sánh mô hình với số lượng feature khác nhau.
Ranking Metrics
Với các hệ thống search engine hay recommendation system, câu hỏi không phải "dự đoán đúng không?" mà là "sắp xếp kết quả có tốt không?" Đây là lúc các ranking metrics phát huy.
MRR — Mean Reciprocal Rank
Với mỗi query, tìm vị trí (rank) của kết quả liên quan đầu tiên. Score = 1/rank. Trung bình trên tất cả query.
Ví dụ: Đúng ở vị trí 3 → score = 1/3 = 0.333.
MRR dùng khi chỉ quan tâm đến việc tìm ra kết quả đúng đầu tiên — hệ thống Q&A, tra cứu thực thể.
MAP — Mean Average Precision
Với mỗi query có nhiều tài liệu liên quan, tính AP = trung bình của precision tại mỗi vị trí có tài liệu liên quan. Trung bình AP trên tất cả query = MAP.
MAP dùng khi có nhiều kết quả liên quan cho mỗi query và relevance là nhị phân (liên quan / không liên quan).
NDCG — Normalized Discounted Cumulative Gain
DCG = Σ (2^rel_i - 1) / log₂(i + 1), trong đó rel_i là điểm relevance tại vị trí i.
NDCG = DCG / IDCG, với IDCG là DCG của ranking lý tưởng.
Järvelin & Kekäläinen (2002) thiết kế NDCG để xử lý relevance có nhiều mức độ (không chỉ 0/1), và vị trí càng thấp thì đóng góp càng ít (discounting). NDCG@10 là tiêu chuẩn phổ biến nhất trong các hệ thống tìm kiếm và gợi ý.
| Metric | Loại relevance | Nhiều kết quả? | Nhạy vị trí? | Dùng cho |
|---|---|---|---|---|
| MRR | Nhị phân | Không | Chỉ kết quả đầu | Q&A, tra cứu |
| MAP | Nhị phân | Có | Có | Multi-doc retrieval |
| NDCG | Có mức độ | Có | Tất cả vị trí | Recommender, search |
Với các bạn làm ở Shopee, Tiki, hoặc các platform e-commerce, NDCG@10 là metric bạn sẽ gặp thường xuyên nhất.
Clustering Metrics
Không phải lúc nào cũng có nhãn ground truth để đánh giá clustering. Do đó tồn tại hai loại metrics.
Internal Metrics (không cần nhãn thật)
Silhouette Score: Với mỗi điểm i, tính a(i) = khoảng cách trung bình đến các điểm trong cùng cluster, b(i) = khoảng cách trung bình đến cluster gần nhất khác. s(i) = (b(i) - a(i)) / max(a(i), b(i)).
Giá trị từ -1 đến 1. Gần 1: điểm nằm chắc trong cluster. Gần 0: nằm ở ranh giới. Âm: có thể bị gán nhầm cluster.
Rousseeuw (1987) thiết kế chỉ số này để giúp chọn K tối ưu và so sánh các thuật toán clustering.
Davies-Bouldin Index: Thấp hơn = tốt hơn. Đo tỉ lệ giữa độ phân tán trong cluster và khoảng cách giữa các cluster. Nhanh hơn Silhouette trên dataset lớn.
External Metrics (cần nhãn ground truth)
Adjusted Rand Index (ARI): Điều chỉnh Rand Index theo cơ hội ngẫu nhiên. Khoảng [-1, 1]; 1 = hoàn hảo, 0 = ngẫu nhiên. Luôn dùng ARI thay vì Rand Index thuần vì Rand Index bị thiên vị về phía 1 khi K lớn.
Normalized Mutual Information (NMI): Đo thông tin chung giữa predicted clusters và nhãn thật, chuẩn hóa về [0, 1]. Robust với số lượng cluster khác nhau.
Thực tế: Dùng Silhouette/Davies-Bouldin để chọn K. Dùng ARI/NMI khi có một tập nhãn validation để so sánh.
Cross-Validation: Đánh Giá Trung Thực
Chia dữ liệu một lần thành train/test và đánh giá — đây là cách nhanh nhưng kết quả phụ thuộc nhiều vào may mắn của cách chia. Cross-validation giải quyết vấn đề này.
K-Fold Cross-Validation
Chia dữ liệu thành K phần (fold). Mỗi vòng lặp: train trên K-1 fold, test trên fold còn lại. Xoay đến khi mỗi fold được test một lần. Trung bình K điểm số.
K = 5 hoặc 10 là tiêu chuẩn. Kohavi (1995) cho thấy K=10 thường cho ước lượng tốt nhất về bias-variance.
Stratified K-Fold
Mỗi fold giữ nguyên tỉ lệ các lớp trong dataset gốc. Bắt buộc dùng với dữ liệu mất cân bằng (imbalanced) — một fold không có mẫu dương nào sẽ cho recall không có ý nghĩa.
Time-Series Split (Walk-Forward Validation)
Không bao giờ shuffle dữ liệu chuỗi thời gian. Dữ liệu tương lai không được xuất hiện trong training set của quá khứ. Walk-forward validation: train trên [0, t], test trên [t+1, t+w], mở rộng dần cửa sổ training.
TimeSeriesSplit trong scikit-learn triển khai điều này. Rất nhiều bạn làm time series vẫn dùng K-Fold thông thường và tạo ra data leakage theo thời gian mà không hay biết.
Group K-Fold
Đảm bảo dữ liệu từ cùng một nhóm (cùng user, cùng bệnh viện) không xuất hiện ở cả train lẫn test. Quan trọng với medical data hoặc user-level model.
Sáu Sai Lầm Phổ Biến Khi Đánh Giá Mô Hình
Sai lầm 1: Dùng accuracy với dữ liệu mất cân bằng
Mô hình luôn dự đoán "không gian lận" trên dataset 99/1 đạt accuracy 99%. Không bắt được một ca gian lận nào. Fix: dùng F1, PR-AUC, hoặc recall tại ngưỡng precision cố định.
Sai lầm 2: Data leakage trong cross-validation
Fit StandardScaler trên toàn bộ dataset trước khi chia CV — test fold đã "nhiễm" thông tin từ training. Kết quả đánh giá quá lạc quan.
Fix: Fit scaler chỉ trên training fold, transform test fold. Dùng Pipeline của scikit-learn để tự động hóa điều này.
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', LogisticRegression())
])
scores = cross_val_score(pipeline, X, y, cv=5, scoring='f1')Sai lầm 3: Target leakage — feature là proxy của label
Một feature chứa thông tin trực tiếp về label (ví dụ: diagnosis_code trong mô hình dự đoán disease_present). Mô hình học được câu trả lời từ feature thay vì từ pattern thực sự.
Dấu hiệu: AUC > 0.95 trên bài toán khó, hoặc feature importance tập trung hết vào một feature. Như Kaufman et al. (2012) và Kapoor & Narayanan (2023) ghi lại, đây là một trong những nguyên nhân phổ biến nhất của reproducibility crisis trong ML research.
Sai lầm 4: Đánh giá sai phân phối
Train trên 2019–2022, test trên 2022 nhưng deploy năm 2023 khi distribution đã thay đổi. CV tốt nhưng production tệ.
Fix: Giữ một temporal test set thật sự. Monitor production metrics liên tục.
Sai lầm 5: Cố định vào một metric duy nhất
Chỉ báo AUC mà không báo precision/recall tại ngưỡng hoạt động thực tế. Trong production, bạn chạy tại một threshold cụ thể, không phải toàn bộ ROC curve.
Fix: Báo AUC + precision/recall tại operating threshold + confusion matrix.
Sai lầm 6: Không kiểm tra metric bản thân
Log loss tính trên dữ liệu bị gán nhãn sai, NDCG tính với relevance judgment lỗi. Sanity check metric trên edge cases trước khi train.
Cách Chọn Metric Đúng Cho Bài Toán Của Bạn
Đây là khung quyết định thực tế, theo 5 bước:
Bước 1 — Xác định loại bài toán:
- Phân loại nhị phân → F1, ROC-AUC, PR-AUC, Log Loss
- Phân loại đa lớp → macro/weighted F1, Accuracy (nếu cân bằng)
- Regression → RMSE (nhạy outlier), MAE (robust), MAPE (scale-free), R²
- Ranking/retrieval → NDCG@K, MAP, MRR
- Clustering → Silhouette (không có nhãn), ARI/NMI (có nhãn)
Bước 2 — Xác định chi phí lỗi bất đối xứng:
- FP tốn kém hơn FN? → Ưu tiên Precision
- FN tốn kém hơn FP? → Ưu tiên Recall
- Đối xứng? → F1, Accuracy (nếu cân bằng), RMSE
Bước 3 — Kiểm tra cân bằng lớp:
- Cân bằng → Accuracy + F1 macro
- Mất cân bằng → PR-AUC + F1 weighted hoặc recall tại precision cố định
Bước 4 — Xác suất có quan trọng không?
- Cần xác suất calibrated (risk scoring, y tế) → Log Loss + calibration plot
- Chỉ cần nhãn → Accuracy, F1
Bước 5 — Gắn với KPI kinh doanh:
| Bài toán | Metric chính | Gắn với KPI nào |
|---|---|---|
| Sàng lọc COVID | Recall ≥ 95% | Tỉ lệ phát hiện ca bệnh |
| Phát hiện gian lận | Recall tại Precision ≥ 50% | Chi phí điều tra / ca gian lận bỏ sót |
| Gợi ý e-commerce | NDCG@10 | Click-through rate (A/B test) |
| Dự báo giá nhà | RMSE + MAPE | Chi phí sai lệch định giá |
| Churn prediction | F1 + ROC-AUC | Khả năng của team retention |
Metrics không phải là sự thật — chúng là cách ta xấp xỉ sự thật. Mỗi con số bắt được một khía cạnh, bỏ qua khía cạnh khác. AUC cao không nghĩa là mô hình tốt trong production. Accuracy 99% không nghĩa là bài toán đã được giải. Câu hỏi quan trọng nhất luôn là: metric này phản ánh điều gì thực sự quan trọng với người dùng cuối?
Khi bạn có thể trả lời câu đó, và link được metric kỹ thuật với KPI kinh doanh — lúc đó bạn đang đánh giá mô hình đúng cách.
Tóm tắt:
- Mỗi metric là cách nén thông tin với sự đánh đổi — không có metric hoàn hảo cho mọi bài toán, chọn metric phải bắt đầu từ bài toán kinh doanh
- Accuracy chỉ có ý nghĩa khi các lớp cân bằng; với dữ liệu mất cân bằng, dùng F1, PR-AUC, hoặc recall tại precision cố định
- Với ranking/recommendation: NDCG@K là tiêu chuẩn; với regression: kết hợp RMSE (nhạy sai số lớn) và MAE (robust outlier)
- Data leakage và target leakage là hai nguyên nhân phổ biến nhất khiến metric đẹp trong validation nhưng tệ trong production
- Luôn gắn metric kỹ thuật với một KPI kinh doanh cụ thể — nếu không link được, metric đó không có ý nghĩa thực tiễn
Nguồn tham khảo
- Pattern Recognition and Machine Learning — Bishop (2006)
- Introduction to Information Retrieval — Manning, Raghavan & Schütze (2008)
- The Relationship Between Precision-Recall and ROC Curves — Davis & Goadrich (ICML 2006)
- An Introduction to ROC Analysis — Fawcett (2006)
- Another look at measures of forecast accuracy — Hyndman & Koehler (2006)
- Leakage in data mining — Kaufman et al. (ACM TKDD, 2012)
- Leakage and the Reproducibility Crisis in ML-based Science — Kapoor & Narayanan (Patterns, 2023)
- Cumulated gain-based evaluation of IR techniques (NDCG) — Järvelin & Kekäläinen (ACM TOIS, 2002)
- A study of cross-validation and bootstrap — Kohavi (IJCAI, 1995)
- Data Science for Business — Provost & Fawcett (O'Reilly, 2013)
- Silhouettes — Rousseeuw (1987)
- scikit-learn User Guide — Model evaluation