Menu
CoddyTech

Đường cong ROC

Thuộc phần Học có giám sát trong hành trình Machine Learning của Coddy. Bài học 25 trên 58.

Mỗi ngưỡng cho ta một mức độ thu hồi và số lần báo động giả riêng. Đường cong ROC thể hiện tất cả cùng lúc:

Đường cong bậc thang màu xanh lam đi lên từ góc dưới bên trái đến góc trên bên phải, cao hơn hẳn đường chéo màu xám nét đứt biểu thị việc tung đồng xu. Các chấm màu cam đánh dấu các ngưỡng 0.8, 0.5 và 0.2, di chuyển lên trên và sang phải. Phần diện tích bên dưới được tô màu: AUC = 0.914

Trục ngang: tỷ lệ dương tính giả, tỷ lệ bệnh nhân khỏe mạnh bị đánh dấu. Trục dọc: độ thu hồi. Ngưỡng thấp hơn tiến dần về phía (1, 1).

from sklearn.metrics import roc_curve, roc_auc_score

proba = model.predict_proba(X_test)[:, 1]
fpr, tpr, thresholds = roc_curve(y_test, proba)  # tpr là độ thu hồi
ax.plot(fpr, tpr)
print(f"{roc_auc_score(y_test, proba):.3f}")

Lệnh này in ra 0.914, chỉ số AUC: diện tích dưới đường cong. 1 là hoàn hảo, 0.5 tương đương tung đồng xu. Đường cong cao hơn phát hiện được nhiều trường hợp hơn với cùng số cảnh báo giả.

challenge icon

Thử thách

Trung bình

Một trang trại anh đào đốt lửa chống sương giá vào những đêm có thể bị đóng băng. Phần code khởi đầu huấn luyện hai mô hình dự đoán sương giá, logistic và knn, rồi thiết lập biểu đồ.

  1. Viết hàm (function) draw_roc(model, name): hàm này vẽ đường cong ROC của mô hình trên ax, gắn nhãn name và in AUC như bên dưới.
  2. Gọi hàm này cho cả hai mô hình, thêm đường chéo nét đứt có nhãn coin toss và chú giải, rồi hiển thị biểu đồ.

Với các mô hình dự đoán sạt lở đất:

logistic AUC: 0.869
k-NN AUC: 0.924

Sau đó, Coddy mô tả biểu đồ của bạn. Biểu đồ của Coddy trông như thế này:

Các đường cong ROC có tiêu đề Cảnh báo sạt lở đất: đường cong logistic màu xanh dạng bậc thang và đường cong k-NN màu cam có ít góc gấp, cả hai đều nằm cao hơn nhiều so với đường chéo nét đứt màu xanh lá cây có nhãn tung đồng xu, cùng với chú giải

Tự làm thử

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import roc_curve, roc_auc_score

# Mỗi hàng ứng với một đêm mùa xuân tại vườn anh đào: 1 trong frost nghĩa là sương giá hình thành trước bình minh
nights = pd.read_csv("frost.csv")
features = ["temp_6pm_c", "humidity_pct", "wind_kmh", "cloud_pct"]
X_train, X_test, y_train, y_test = train_test_split(
    nights[features], nights["frost"], test_size=0.25, random_state=0, stratify=nights["frost"])
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# Hai mô hình dự đoán sương giá
logistic = LogisticRegression(max_iter=1000)
logistic.fit(X_train, y_train)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)

fig, ax = plt.subplots()
ax.set_title("Frost Warnings")
ax.set_xlabel("False positive rate")
ax.set_ylabel("Recall")

# Viết code bên dưới
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Học có giám sát

Tự luyện tập: Trình biên dịch Python online