Khóa học
Các thuật toán machine learning (ML) ngày càng được dùng để tự động hóa các tác vụ lặp lại và nhận diện các mẫu ẩn trong dữ liệu. Tuy nhiên, chúng vốn mang tính xác suất, nghĩa là dự đoán không phải lúc nào cũng đúng. Do đó, bạn cần một cách để ước lượng độ tin cậy của mô hình ML nhằm xây dựng niềm tin vào các hệ thống như vậy.
Các chỉ số đánh giá như accuracy, precision, recall, mean squared error (MSE), mean absolute percentage error (MAPE), v.v. thường được dùng để đo lường hiệu năng mô hình. Mỗi chỉ số giúp bạn nhìn nhận hiệu năng theo những tiêu chí và góc độ khác nhau.
Những chỉ số này cũng đảm bảo mô hình liên tục cải thiện trong việc học nhiệm vụ đã định. Suy cho cùng, nếu bạn không thể đo lường, bạn cũng không thể cải thiện hiệu năng của hệ thống ML.
Accuracy là một chỉ số dễ hiểu và hoạt động tốt với bộ dữ liệu cân bằng, tức là nơi các lớp được đại diện đồng đều. Tuy nhiên, các hiện tượng ngoài đời thực không phân bố đều; vì vậy rất khó tìm được bộ dữ liệu cân bằng. Accuracy chủ yếu xét việc đa số mẫu có được nhận diện đúng hay không, bất kể chúng thuộc lớp nào. Với các sự kiện hiếm nhưng quan trọng như giao dịch gian lận hay nhấp vào một lượt hiển thị quảng cáo, accuracy có thể làm sai lệch đánh giá về một mô hình chỉ dự đoán tất cả là lớp âm, tức là không gian lận hoặc không có nhấp chuột. Do những hạn chế như vậy, accuracy không phải là chỉ số phù hợp nhất. Vậy, chúng ta nên dùng chỉ số nào để đo hiệu năng mô hình?
Precision và recall là những chỉ số được dùng rộng rãi để đánh giá hiệu năng của mô hình phân loại mất cân bằng, chẳng hạn như dự đoán khách hàng rời bỏ.
Giải thích về Precision và Recall
Precision phản ánh độ tin cậy khi mô hình dự đoán lớp dương là dương, trong khi recall đo lường mức độ mô hình nhận diện được số lượng mẫu thuộc lớp dương trong tập dữ liệu. Lưu ý rằng lớp dương là lớp mà bạn quan tâm.
Về mặt thực nghiệm, precision và recall được hiểu rõ nhất qua ma trận nhầm lẫn (confusion matrix) gồm bốn khái niệm chính:
- True Positive (TP): Số lượng mẫu lớp dương được nhận diện đúng
- False Positive (FP): Số lượng mẫu lớp âm bị nhận diện sai thành lớp dương
- True Negative (TN): Số lượng mẫu lớp âm được nhận diện đúng
- False Negative (FN): Số lượng mẫu lớp dương bị nhận diện sai thành lớp âm

Minh họa do Tác giả thực hiện
Precision và Recall là biểu thức toán học của bốn khái niệm này, trong đó:
Precision là tỷ lệ TP trên tổng số dự đoán dương (TP+FP). Recall là tỷ lệ TP trên tổng số mẫu dương thực tế (TP+FN).
Có thể diễn đạt gọn hơn bằng ký hiệu sau để làm nổi bật sự khác nhau giữa hai chỉ số. Về bản chất, cả hai có cùng mẫu số ở tử số, tức là phần giao giữa các mẫu dương thực tế và các mẫu được dự đoán là dương, tức TP.

Hình ảnh của Shruti Saxena
Điểm khác biệt nằm ở mẫu số, nơi Precision xét tất cả dự đoán dương (TP+FP), còn Recall xét các mẫu dương thực tế (TP+FN).
Trực giác đằng sau Precision và Recall
Có lý do vì sao ma trận nhầm lẫn lại có tên như vậy – quả thật gây nhầm lẫn khi bạn lần đầu cố gắng nắm bắt các khái niệm này.
Vậy hãy nội tại hóa khái niệm bằng một ví dụ. Giả sử bạn sở hữu một nhà máy thép, nơi quặng sắt được luyện để tách sắt và trộn lẫn với các khoáng chất, nguyên tố khác (đôi khi ngoài ý muốn). Tập trung vào phần tách chiết, bạn có vài lựa chọn về độ tinh khiết của kim loại thu được và lượng hao phí tạo ra trong quá trình như sau:
Kịch bản 1: Bạn muốn ưu tiên độ tinh khiết của sắt thu được, bất kể lượng kim loại bị hao phí.
Kịch bản 2: Bạn muốn tối đa hóa hiệu suất, tức lượng sắt thu được trên mỗi đơn vị quặng, không xét đến độ tinh khiết của kim loại.
Kịch bản 3: Bạn muốn dung hòa cả hai, tức giữ độ tinh khiết sắt thu được càng cao càng tốt đồng thời giảm hao phí (tối đa hóa lượng sắt thu được trên mỗi đơn vị quặng).
Hãy coi lò cao hay lò hồ quang điện như các phương án mô hình hóa đem lại các kết quả khác nhau (độ tinh khiết và hao phí). Giả sử một phương pháp cho sắt tinh khiết 97,5% và mất 4% sắt vào bùn thải. Khi đó, ta có thể định nghĩa precision là phần sắt tinh khiết trong kim loại thu được, tức 97,5%, còn recall là lượng sắt thu được trên tổng lượng sắt có trong quặng, là 96% (4% sắt bị hao phí).

Minh họa do Tác giả thực hiện
Giả sử bạn chọn phương pháp thứ hai vì muốn sắt tinh khiết hơn từ lò, đồng nghĩa với việc hao phí nhiều hơn trong quá trình tách chiết. Giả sử nếu tăng độ tinh khiết sắt thêm 0,5% lên 98%, lượng hao phí kim loại tăng 11%. Nghĩa là giá trị recall tương ứng với precision 98% trở thành 85%. Việc đánh đổi recall để đổi lấy precision cao hơn và ngược lại cho thấy mối quan hệ nghịch giữa precision và recall.
Sẽ thật tuyệt nếu bạn biết tất cả các giá trị precision và các giá trị recall tương ứng để có thể đưa ra quyết định phù hợp nhất với mục tiêu của mình?
Đường cong precision-recall giúp bạn đưa ra lựa chọn đó, và bạn sẽ hiểu sâu hơn ở các phần tiếp theo. Nhưng trước khi làm điều đó, hãy cùng hiểu một khái niệm quan trọng là ngưỡng (threshold), cốt lõi của đường cong PR.
Khái niệm về Ngưỡng (Threshold)
Hãy lấy ví dụ về nhận diện giao dịch gian lận để hiểu cách ngưỡng (hay điểm cắt) hoạt động. Bảng dưới có bốn giao dịch với ID từ 1 đến 4; một giao dịch có thể là gian lận hoặc bình thường. Mô hình phát hiện gian lận đưa ra xác suất giao dịch là gian lận (được tô vàng), đồng thời hàm ý xác suất giao dịch bình thường.
Một giao dịch được dự đoán là gian lận nếu xác suất đầu ra lớn hơn ngưỡng đã chọn trong cột Xác suất giao dịch gian lận, ngược lại sẽ được coi là giao dịch bình thường.
|
Mã giao dịch |
Xác suất giao dịch gian lận |
Xác suất giao dịch bình thường |
Có gian lận không? (Ngưỡng = 0,9) |
Có gian lận không? (Ngưỡng = 0,5) |
Có gian lận không? (Ngưỡng = 0,4) |
|
1 |
0,3 |
0,7 |
Không |
Không |
Không |
|
2 |
0,4 |
0,6 |
Không |
Không |
Có |
|
3 |
0,6 |
0,4 |
Không |
Có |
Có |
|
4 |
0,95 |
0,05 |
Có |
Có |
Có |
Khi áp dụng một ngưỡng nghiêm ngặt như 0,9, ba giao dịch đầu được đánh dấu là bình thường, còn giao dịch cuối được xem là gian lận. Ngưỡng cao như vậy thể hiện sự tự tin trong dự đoán, dẫn đến kịch bản precision cao. Đổi lại, bạn hy sinh recall của mô hình khi bỏ sót một số giao dịch gian lận.
Tình huống như vậy không mong muốn dù Precision cao. Bạn có đoán được vì sao không?
Bởi vì doanh nghiệp phải chịu chi phí cao hơn khi bỏ sót nhận diện gian lận – vốn là mục đích cốt lõi của việc xây dựng mô hình. Lưu ý rằng chi phí của một giao dịch gian lận cao hơn nhiều so với chi phí liên quan đến giao dịch bình thường bị chặn nhầm, tức FP.
Bây giờ, xét ở đầu kia của phổ với ngưỡng thấp 0,4, đánh dấu ba giao dịch cuối là gian lận. Một ngưỡng rộng rãi như vậy sẽ chặn đa số giao dịch, có thể khiến nhiều khách hàng khó chịu. Chưa kể gánh nặng bổ sung lên nhân sự để xử lý các giao dịch bị gắn cờ và xác định trường hợp gian lận thực sự.
Vì vậy, doanh nghiệp phải xác định các chỉ số mục tiêu và giá trị mong muốn để dung hòa, xét đến các chi phí sau:
- Chi phí khi nhận diện giao dịch gian lận thành bình thường (False Negatives)
- Chi phí khi nhận diện giao dịch bình thường thành gian lận (False Positive)
Quay lại định nghĩa precision, bạn sẽ thấy false positive nằm ở mẫu số của biểu thức toán học, nghĩa là giảm thiểu false positive sẽ tối đa hóa precision. Tương tự, giảm thiểu false negative sẽ tối đa hóa recall của mô hình.
Do đó, việc một giao dịch được dự đoán là gian lận hay bình thường phụ thuộc phần lớn vào giá trị ngưỡng.
Đường cong Precision-Recall là gì?
Đường cong precision-recall giúp bạn quyết định ngưỡng dựa trên các giá trị precision và recall mong muốn. Nó cũng hữu ích khi so sánh hiệu năng các mô hình khác nhau bằng cách tính “Diện tích dưới đường cong Precision-Recall”, viết tắt là AUC.
Như đã giải thích qua ma trận nhầm lẫn, một mô hình phân loại nhị phân sẽ tạo ra TP, FP, TN và FN cho các giá trị ngưỡng khác nhau; mỗi giá trị ngưỡng sẽ cho ra một cặp precision và recall tương ứng.
Vẽ recall trên trục x và precision tương ứng trên trục y tạo ra đường cong PR với độ dốc âm. Nó thể hiện sự đánh đổi giữa precision (giảm FP) và recall (giảm FN) đối với một mô hình. Do mối quan hệ nghịch giữa precision và recall, đường cong thường phi tuyến, hàm ý rằng tăng một chỉ số sẽ làm giảm chỉ số còn lại, nhưng mức giảm có thể không tỷ lệ thuận.

Hình ảnh từ StackExchange
Giả sử một tổ chức chọn giá trị recall tối thiểu chấp nhận được là 98%. Precision đạt 30% tại điểm giao nhau được đánh dấu bằng ngôi sao “Ngưỡng thấp, Precision thấp, Recall cao.”
Hai điểm cực trị còn lại biểu diễn các trường hợp khi ngưỡng:
- Quá thấp dẫn đến Recall cao – chi phí nhân sự và khách hàng khó chịu
- Quá cao dẫn đến Precision cao – chi phí giao dịch gian lận và mất uy tín.
Sử dụng đường cong PR
Bên cạnh việc quyết định ngưỡng phù hợp với chỉ số kinh doanh, diện tích dưới đường cong của các đường cong precision-recall từ nhiều mô hình/thuật toán có thể dùng để so sánh hiệu năng. Việc so sánh mô hình bằng PR curve đặc biệt hữu ích hơn là dùng riêng lẻ precision, recall, hay thậm chí F1 score (trung bình điều hòa của Precision và Recall).

Hình ảnh từ Stackoverflow
Các chỉ số như vậy phụ thuộc vào ngưỡng, trong đó thay đổi ngưỡng sẽ làm thay đổi phân bố TP, FP và FN. Hai mô hình khác nhau có thể thể hiện khác nhau tại một ngưỡng nhất định, khiến PR curve trở thành lựa chọn vững vàng để so sánh mô hình. Biểu đồ trên minh họa hai đường cong PR từ hai thuật toán khác nhau trên một bộ dữ liệu cho trước – AUC của thuật toán hai lớn hơn AUC của thuật toán một, khiến nó trở thành lựa chọn tốt hơn cho bài toán.
Triển khai Đường cong Precision-Recall trong Python
Giờ khi đã biết đường cong precision-recall là gì và dùng để làm gì, hãy xem cách tạo đường cong precision-recall trong Python.
Bước 1: Import các gói Python cần thiết
Hãy xem bộ dữ liệu mô hình cho phát hiện ung thư vú, trong đó “lớp 1” đại diện cho chẩn đoán ung thư và “lớp 0” đại diện cho không có ung thư.
Lệnh import đầu tiên nạp bộ dữ liệu từ “sklearn.datasets” bao gồm biến độc lập và biến mục tiêu. Vì đây là bộ dữ liệu mô hình có thể được hầu hết thuật toán học tốt, chúng tôi chọn thuật toán Naive Bayes, import là “GaussianNB” từ sklearn.
Lệnh import tiếp theo “Precision_Recall_curve” xuất ra các ngưỡng khác nhau và các giá trị Precision và Recall tương ứng.
from sklearn.datasets import load_breast_cancer
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import precision_recall_curve
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
Bước 2: Chuẩn bị dữ liệu train và test
Các biến độc lập được lưu trong khóa “data” và biến mục tiêu trong khóa “target” bên trong dictionary “data”. Dữ liệu sau đó được tách thành tập train và test bằng cách truyền đối số test_size với giá trị 0,3.
# Load model breast cancer data
data = load_breast_cancer()
X = data['data']
y = data['target']
Hãy xem phân bố của lớp dương và lớp âm, tức các trường hợp ung thư vú và không ung thư vú.
import numpy as np
unique, counts = np.unique(y, return_counts=True)
plt.pie(counts, labels=unique, autopct='%.0f%%');

Chia dữ liệu thành tập train và test bằng phương thức train_test_split từ module model_selection của sklearn.
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
Bước 3: Huấn luyện mô hình
Dữ liệu huấn luyện được truyền làm đối số cho GaussianNB() để bắt đầu huấn luyện mô hình. Đối tượng mô hình đã fit sau đó được dùng để dự đoán dưới dạng xác suất trên tập train và test.
# Fit a Naive Bayes model
clf = GaussianNB().fit(X_train, y_train)
Bước 4: Tạo dự đoán
Tạo xác suất dự đoán bằng dữ liệu huấn luyện và kiểm thử để dùng tính Precision và Recall tại các giá trị ngưỡng khác nhau.
# Predict probability
y_prob_train = clf.predict_proba(X_train)[:,1]
y_prob_test = clf.predict_proba(X_test)[:,1]
Bước 5: Vẽ đường cong PR
Phương thức Precision_Recall_curve() nhận hai đầu vào – các xác suất từ tập train, tức y_prob_train, và các giá trị nhãn thực tế, và trả về ba giá trị là Precision, Recall và thresholds.
precision, recall, thresholds = precision_recall_curve(y_train, y_prob_train)
plt.fill_between(recall, precision)
plt.ylabel("Precision")
plt.xlabel("Recall")
plt.title("Train Precision-Recall curve");
Các vector precision và recall được dùng để vẽ đường cong PR tại các ngưỡng khác nhau như bên dưới:

Đường cong PR do Tác giả tạo
Đường cong Precision-Recall có tốt hơn ROC không?
Đường cong ROC tương tự PR nhưng vẽ True Positive Rate (TPR) so với False Positive Rate (FPR) tại các ngưỡng khác nhau. Chúng ta đã biết TPR, đó chỉ là tên khác của recall. Vậy hãy tập trung vào FPR, chỉ số biểu thị số lượng phân loại sai từ lớp âm. Tiếp tục ví dụ về gian lận, FPR đại diện cho tỷ lệ phần trăm các giao dịch bình thường bị đánh dấu là gian lận.

Hình ảnh của Albert Um
Đến giờ, ta hiểu rằng recall, hay TPR, là điểm chung giữa PR và ROC; khác biệt chính là precision so với FPR. Hãy xem vì sao PR cung cấp thông tin hữu ích hơn.
Đó là vì đường cong P-R mang lại những insight có ý nghĩa hơn về lớp quan tâm so với ROC. Lấy ví dụ dự đoán giao dịch gian lận. Trong các bộ dữ liệu mất cân bằng, True Negative (TN) thường rất lớn, khiến FPR trở nên rất nhỏ. Nhưng điều đó có nói lên gì về hiệu năng mô hình trong việc dự đoán một giao dịch là gian lận không?
Không! Ngược lại, dùng Precision như một trong các chỉ số mô tả hiệu năng mô hình trên lớp dương (giao dịch gian lận). Điều này cho biết mô hình thận trọng hay rộng rãi trong việc gắn nhãn giao dịch gian lận.
Điểm hạn chế lớn thứ hai của ROC là sự “miễn nhiễm” với dữ liệu mất cân bằng. Từ hình trên, bạn có thể thấy FPR là chỉ số chỉ dành cho lớp âm, nghĩa là thay đổi trong FP được kỳ vọng tỷ lệ thuận với thay đổi trong FP+TN (tất cả mẫu âm). Do đó, nếu phân bố dữ liệu cơ bản thay đổi, ROC không thay đổi đáng kể. Sự không nhạy với phân bố lớp này khiến PR trở thành lựa chọn tốt hơn ROC.
Kết luận
Precision và recall là những chỉ số đánh giá chủ chốt để đo hiệu năng các mô hình phân loại machine learning. Tuy nhiên, sự đánh đổi giữa hai chỉ số phụ thuộc vào ưu tiên kinh doanh và được giải quyết tốt nhất thông qua đường cong PR. Bài viết đã giải thích cách diễn giải đường cong PR và chọn ngưỡng phù hợp với mục tiêu kinh doanh. Ngoài ra, bài viết còn minh họa từng bước cách vẽ bằng Python. Chúng tôi cũng đã thảo luận vì sao PR cung cấp nhiều thông tin hơn ROC.