4. True/False Positive/Negative 5. Precision với Recall 5.4. Precision-recall cho bài toán phân lớp nhiều lớp

Bạn hoàn toàn có thể download toàn bộ source code dưới dạng Jupyter Notebook trên đây.

Bạn đang xem: Roc curve là gì

1. Giới thiệu

Khi thi công một quy mô Machine Learning, chúng ta cần một phép nhận xét để xem mô hình sử dụng có công dụng không và để so sánh tài năng của các mô hình. Trong nội dung bài viết này, tôi sẽ reviews các phương pháp đánh giá các quy mô classification.

Hiệu năng của một quy mô thường được review dựa trên tập dữ liệu kiểm demo (test data). Cầm cố thể, trả sử đầu ra output của mô hình khi đầu vào là tập kiểm demo được biểu hiện bởi vector y_pred - là vector dự kiến đầu ra cùng với mỗi thành phần là class được dự kiến của một điểm tài liệu trong tập kiểm thử. Ta cần so sánh giữa vector dự kiến y_pred này cùng với vector class thật của dữ liệu, được diễn tả bởi vector y_true.

Ví dụ với câu hỏi có 3 lớp tài liệu được gán nhãn là 0, 1, 2. Trong việc thực tế, các class rất có thể có nhãn bất kỳ, không nhất thiết là số, và không độc nhất thiết bước đầu từ 0. Bọn họ hãy tạm đưa sử những class được đặt số từ 0 đến C-1 trong trường hợp gồm C lớp dữ liệu. Bao gồm 10 điểm dữ liệu trong tập kiểm demo với những nhãn thực sự được biểu hiện bởi y_true = <0, 0, 0, 0, 1, 1, 1, 2, 2, 2>. Giả sử cỗ phân lớp bọn họ đang cần review dự đoán nhãn cho các điểm này là y_pred = <0, 1, 0, 2, 1, 1, 0, 2, 1, 2>.

Có rất nhiều cách đánh giá một quy mô phân lớp. Tuỳ vào những bài xích toán khác biệt mà chúng ta sử dụng các phương pháp khác nhau. Các phương pháp thường được sử dụng là: accuracy score, confusion matrix, ROC curve, Area Under the Curve, Precision & Recall, F1 score, top R error, etc.

Trong Phần 1 này, tôi sẽ trình diễn về accuracy score, confusion matrix, ROC curve, và Area Under the Curve. Các phương thức còn lại sẽ được trình bày trong Phần 2.

2. Accuracy

Cách dễ dàng và hay được dùng nhất là accuracy (độ chính xác). Cách review này đơn giản và dễ dàng tính tỉ lệ thân số điểm được dự kiến đúng và tổng số điểm vào tập tài liệu kiểm thử.

Trong lấy ví dụ này, ta hoàn toàn có thể đếm được gồm 6 điểm tài liệu được dự đoán đúng trên tổng số 10 điểm. Vậy ta tóm lại độ đúng đắn của quy mô là 0.6 (hay 60%). Để ý rằng đấy là bài toán cùng với chỉ 3 class, phải độ bao gồm xác nhỏ dại nhất vẫn là khoảng 1/3, khi toàn bộ các điểm được dự kiến là thuộc vào một class như thế nào đó.


from __future__ import print_functionimport numpy as np def acc(y_true, y_pred): correct = np.sum(y_true == y_pred) return float(correct)/y_true.shape<0>y_true = np.array(<0, 0, 0, 0, 1, 1, 1, 2, 2, 2>)y_pred = np.array(<0, 1, 0, 2, 1, 1, 0, 2, 1, 2>)print("accuracy = ", acc(y_true, y_pred))

3. Confusion matrix

Cách tính thực hiện accuracy như sinh sống trên chỉ cho họ biết được bao nhiêu tỷ lệ lượng tài liệu được phân loại đúng mà không chỉ có ra được cụ thể mỗi nhiều loại được phân loại như thế nào, lớp làm sao được phân một số loại đúng nhiều nhất, và tài liệu thuộc lớp nào hay bị phân các loại nhầm vào lớp khác. Để hoàn toàn có thể đánh giá được những giá trị này, bọn họ sử dụng một ma trận được call là confusion matrix.

Về cơ bản, confusion matrix thể hiện tất cả bao nhiêu điểm dữ liệu thực sự thuộc vào một class, và được dự đoán là rơi vào một trong những class. Để làm rõ hơn, hãy coi bảng bên dưới đây:


Total: 10 | Predicted | Predicted | Predicted | | as: 0 | as: 1 | as: 2 | -----------|-----------|-----------|-----------|--- True: 0 | 2 | 1 | 1 | 4 -----------|-----------|-----------|-----------|--- True: 1 | 1 | 2 | 0 | 3 -----------|-----------|-----------|-----------|--- True: 2 | 0 | 1 | 2 | 3 -----------|-----------|-----------|-----------|---
Có tổng cộng 10 điểm dữ liệu. Bọn họ xét ma trận sản xuất bởi các giá trị trên vùng 3x3 trung trọng điểm của bảng.

Ma trận thu được được điện thoại tư vấn là confusion matrix. Nó là 1 trong ma trận vuông với kích cỡ mỗi chiều bằng con số lớp dữ liệu. Giá trị tại hàng trang bị i, cột sản phẩm j là con số điểm lẽ ra nằm trong vào class i dẫu vậy lại được dự kiến là trực thuộc vào class j. Như vậy, chú ý vào hàng trước tiên (0), ta rất có thể thấy được rằng trong số bốn điểm thực sự thuộc lớp 0, chỉ bao gồm hai điểm được phân một số loại đúng, nhị điểm còn sót lại bị phân một số loại nhầm vào lớp 1 với lớp 2.

Chú ý: Có một vài tài liệu định nghĩa ngược lại, tức cực hiếm tại cột thứ i, hàng đồ vật j là con số điểm lẽ ra thuộc vào class i tuy nhiên lại được dự kiến là ở trong vào class j. Khi đó ta sẽ tiến hành confusion matrix là ma trận chuyển vị của confusion matrix như cách tôi vẫn làm. Tôi chọn cách này vì đây đó là cách thư viện sklearn sử dụng.

Chúng ta hoàn toàn có thể suy ra tức thì rằng tổng các bộ phận trong toàn ma trận này chính là số điểm vào tập kiểm thử. Các phần tử trên đường chéo của ma trận là số điểm được phân nhiều loại đúng của mỗi lớp dữ liệu. Từ đây hoàn toàn có thể suy ra accuracy chính bởi tổng các bộ phận trên đường chéo chia mang lại tổng các bộ phận của toàn ma trận. Đoạn code dưới đây mô tả phương pháp tính confusion matrix:


def my_confusion_matrix(y_true, y_pred): N = np.unique(y_true).shape<0> # number of classes cm = np.zeros((N, N)) for n in range(y_true.shape<0>): cm, y_pred> += 1 return cm cnf_matrix = my_confusion_matrix(y_true, y_pred)print("Confusion matrix:")print(cnf_matrix)print(" Accuracy:", np.diagonal(cnf_matrix).sum()/cnf_matrix.sum())
Cách màn trình diễn trên trên đây của confusion matrix nói một cách khác là unnormalized confusion matrix, tức ma confusion matrix chưa chuẩn chỉnh hoá. Để bao gồm cái nhìn được rõ hơn, ta hoàn toàn có thể dùng normalized confuion matrix, tức confusion matrix được chuẩn chỉnh hoá. Để gồm normalized confusion matrix, ta mang mỗi hàng của unnormalized confusion matrix sẽ tiến hành chia mang lại tổng các thành phần trên mặt hàng đó. Như vậy, ta có nhận xét rằng tổng các thành phần trên một sản phẩm của normalized confusion matrix luôn bằng 1. Điều này thường không đúng trên từng cột. Dưới đó là cách tính normalized confusion matrix:


normalized_confusion_matrix = cnf_matrix/cnf_matrix.sum(axis = 1, keepdims = True)print(" Confusion matrix (with normalizatrion:)")print(normalized_confusion_matrix)

import matplotlib.pyplot as pltimport itertoolsdef plot_confusion_matrix(cm, classes, normalize=False, title="Confusion matrix", cmap=plt.cm.Blues): """ This function prints & plots the confusion matrix. Normalization can be applied by setting `normalize=True`. """ if normalize: cm = cm.astype("float") / cm.sum(axis=1, keepdims = True) plt.imshow(cm, interpolation="nearest", cmap=cmap) plt.title(title) plt.colorbar() tick_marks = np.arange(len(classes)) plt.xticks(tick_marks, classes, rotation=45) plt.yticks(tick_marks, classes) fmt = ".2f" if normalize else "d" thresh = cm.max() / 2. For i, j in itertools.product(range(cm.shape<0>), range(cm.shape<1>)): plt.text(j, i, format(cm, fmt), horizontalalignment="center", color="white" if cm > thresh else "black") plt.tight_layout() plt.ylabel("True label") plt.xlabel("Predicted label")# Plot non-normalized confusion matrixclass_names = <0, 1, 2>plt.figure()plot_confusion_matrix(cnf_matrix, classes=class_names, title="Confusion matrix, without normalization")# Plot normalized confusion matrixplt.figure()plot_confusion_matrix(cnf_matrix, classes=class_names, normalize=True, title="Normalized confusion matrix")plt.show()
*
*

Với các bài toán với rất nhiều lớp dữ liệu, cách biểu diễn bằng màu sắc này rất hữu ích. Các ô color đậm thể hiện những giá trị cao. Một tế bào hình xuất sắc sẽ cho một confusion matrix bao gồm các thành phần trên đường chéo chính có mức giá trị lớn, các phần tử còn lại có giá trị nhỏ. Nói cách khác, khi biểu diễn bằng màu sắc sắc, đường chéo có color càng đậm so với phần sót lại sẽ càng tốt. Từ nhị hình trên ta thấy rằng confusion matrix đã chuẩn chỉnh hoá sở hữu nhiều tin tức hơn. Sự khác nhau được thấy sinh sống ô bên trên cùng mặt trái. Lớp dữ liệu 0 được phân nhiều loại không thực sự xuất sắc nhưng vào unnormalized confusion matrix, nó vẫn có màu đậm như nhì ô sót lại trên đường chéo chính.

4. True/False Positive/Negative

4.1. True/False Positive/Negative

Cách reviews này hay được áp dụng cho các bài toán phân lớp gồm hai lớp dữ liệu. Ví dụ hơn, trong nhì lớp dữ liệu này có một lớp nghiêm trọng hơn lớp tê và rất cần được dự đoán thiết yếu xác. Ví dụ, trong bài xích toán khẳng định có căn bệnh ung thư hay là không thì việc không bị sót (miss) đặc biệt quan trọng hơn là vấn đề chẩn đoán nhầm âm tính thành dương tính. Trong bài xích toán khẳng định có mìn dưới lòng đất hay là không thì việc bỏ sót nghiêm trọng hơn việc báo rượu cồn nhầm khôn xiết nhiều. Tuyệt trong vấn đề lọc thư điện tử rác thì bài toán cho nhầm email đặc trưng vào thùng rác nghiêm trọng hơn việc khẳng định một thư điện tử rác là e-mail thường.

Trong những việc này, tín đồ ta thường khái niệm lớp tài liệu quan trọng hơn cần được xác định chính xác là lớp Positive (P-dương tính), lớp sót lại được call là Negative (N-âm tính). Ta khái niệm True Positive (TP), False Positive (FP), True Negative (TN), False Negative (FN) dựa trên confusion matrix chưa chuẩn hoá như sau:


| Predicted | Predicted | | as Positive | as Negative |------------------|---------------------|---------------------| Actual: Positive | True Positive (TP) | False Negative (FN) |------------------|---------------------|---------------------| Actual: Negative | False Positive (FP) | True Negative (TN) |------------------|---------------------|---------------------|
Người ta thường lưu ý đến TPR, FNR, FPR, TNR (R - Rate) dựa vào normalized confusion matrix như sau:


| Predicted | Predicted | | as Positive | as Negative |------------------|--------------------|--------------------| Actual: Positive | TPR = TP/(TP + FN) | FNR = FN/(TP + FN) |------------------|--------------------|--------------------| Actual: Negative | FPR = FP/(FP + TN) | TNR = TN/(FP + TN) |------------------|--------------------|--------------------|
False Positive Rate nói một cách khác là False Alarm Rate (tỉ lệ báo động nhầm), False Negative Rate còn gọi là Miss Detection Rate (tỉ lệ vứt sót). Trong việc dò mìn, thà báo nhầm còn hơn bỏ sót, tức là ta gồm thể chấp nhận False Alarm Rate cao để dành được Miss Detection Rate thấp.

Chú ý::

Việc biết một cột của confusion matrix này đã suy ra được cột còn sót lại vì tổng các hàng luôn bằng 1 cùng chỉ gồm hai lớp dữ liệu.

4.2. Receiver Operating Characteristic curve

Trong một trong những bài toán, vấn đề tăng hay sút FNR, FPR hoàn toàn có thể được tiến hành bằng việc chuyển đổi một ngưỡng (threshold) làm sao đó. Rước ví dụ khi ta áp dụng thuật toán Logistic Regression, áp ra output của mô hình có thể là những lớp cứng 0 tốt 1, hoặc cũng có thể là những giá trị thể hiện tỷ lệ để tài liệu đầu vào trực thuộc vào lớp 1. Khi sử dụng thư viện sklearn Logistic Regression, ta rất có thể lấy được các giá trị xác xuất này bằng phương thức predict_proba(). Mặc định, ngưỡng được áp dụng là 0.5, có nghĩa là một điểm dữ liệu x đang được dự kiến rơi vào lớp 1 nếu giá trị predict_proba(x) to hơn 0.5 cùng ngược lại.

Nếu bây giờ ta coi lớp một là lớp Positive, lớp 0 là lớp Negative, thắc mắc đặt ra là làm núm nào để tăng mức độ báo nhầm (FPR) để giảm mức độ bỏ sót (FNR)? để ý rằng tăng FNR đồng nghĩa tương quan với việc giảm TPR vì chưng tổng của chúng luôn bằng 1.

Một kỹ thuật đơn giản là ta cầm giá trị threshold tự 0.5 xuống một số bé dại hơn. Chẳng hạn nếu tìm threshold = 0.3, thì đều điểm được dự kiến có xác suất đầu ra to hơn 0.3 đã được dự kiến là ở trong lớp Positive. Nói cách khác, tỉ lệ các điểm được phân các loại là Positive đã tăng lên, kéo theo cả False Positive Rate và True Positive Rate cùng tăng lên (cột trước tiên trong ma trận tăng lên). Từ phía trên suy ra cả FNR và TNR rất nhiều giảm.

Ngược lại, nếu như ta muốn bỏ sót còn rộng báo nhầm, tất nhiên là tại mức độ như thế nào đó, như bài xích toán khẳng định email rác chẳng hạn, ta đề xuất tăng threshold lên một số lớn hơn 0.5. Lúc đó, đa số các điểm dữ liệu sẽ được dự kiến thuộc lớp 0, tức Negative, và cả TNF cùng FNR phần đông tăng lên, tức TPR cùng FPR sút xuống.

Như vậy, ứng với mỗi giá trị của threshold, ta đang thu được một cặp (FPR, TPR). Biểu diễn các điểm (FPR, TPR) trên đồ gia dụng thị khi biến đổi threshold từ bỏ 0 cho tới 1 ta đang thu được một mặt đường được call là Receiver Operating Characteristic curve tuyệt ROC curve. (Chú ý rằng khoảng giá trị của threshold không duy nhất thiết trường đoản cú 0 tới 1 trong số bài toán tổng quát. Khoảng giá trị này yêu cầu được bảo đảm có trường thích hợp TPR/FPR nhận giá trị lớn nhất hay nhỏ tuổi nhất mà lại nó có thể đạt được).

Xem thêm: Giải Bài Tập Vật Lý 12 Bài 14, : Mạch Có R, L, C Mắc Nối Tiếp

Dưới đấy là một ví dụ như với hai lớp dữ liệu. Lớp trước tiên là lớp Negative có 20 điểm dữ liệu, 30 điểm sót lại thuộc lớp Positive. Giả sử quy mô đang xét cho các đầu ra của tài liệu (xác suất) được lưu ở phát triển thành scores.


# generate simulated datan0, n1 = 20, 30score0 = np.random.rand(n0)/2label0 = np.zeros(n0, dtype = int)score1 = np.random.rand(n1)/2 + .2label1 = np.ones(n1, dtype = int)scores = np.concatenate((score0, score1))y_true = np.concatenate((label0, label1))print("True labels:")print(y_true)print(" Scores:")print(scores)
Nhìn chung, các điểm trực thuộc lớp 1 bao gồm score cao hơn. Thư viện sklearn đã giúp bọn họ tính các thresholds cũng như FPR cùng TPR tương ứng:


from sklearn.metrics import roc_curve, aucfpr, tpr, thresholds = roc_curve(y_true, scores, pos_label = 1)print("Thresholds:")print(thresholds)