Bài toán học có giám sát
Bạn sẽ học được
- Phân biệt học có giám sát và không giám sát.
- Xác định nhãn, đặc trưng và độ đo trước khi chọn mô hình.
- Phân biệt bài toán phân loại và hồi quy.
- Dựng baseline trước khi huấn luyện mô hình phức tạp.
- Hiểu vì sao accuracy thường là độ đo tồi.
Khái niệm cốt lõi
Học có giám sát là tìm một hàm ánh xạ từ đặc trưng X sang nhãn y, dựa trên các cặp (X, y) đã biết.
Dữ liệu huấn luyện: (x₁, y₁), (x₂, y₂), ..., (xₙ, yₙ)
Mục tiêu: tìm f sao cho f(x) ≈ y với dữ liệu chưa thấyHọc không giám sát không có nhãn: phân cụm, giảm chiều, phát hiện bất thường. Bài này tập trung vào có giám sát vì đó là phần lớn công việc thực tế.
Hai loại bài toán
| Loại | Nhãn | Ví dụ | Độ đo chính |
|---|---|---|---|
| Phân loại | Rời rạc | Khách có huỷ không, email có spam không | Precision, recall, F1, ROC-AUC |
| Hồi quy | Liên tục | Doanh thu tháng sau, thời gian giao hàng | MAE, RMSE, R² |
Chọn sai loại bài toán là lỗi tốn kém nhất vì mọi bước sau đều sai theo. Một bài toán "dự đoán khách hàng có huỷ" là phân loại, dù đầu ra cuối cùng có thể là xác suất.
Xác định nhãn trước
Câu hỏi đầu tiên không phải "dùng mô hình gì" mà là "nhãn là gì và đo lúc nào".
Ví dụ dự đoán khách huỷ:
- Nhãn: khách không phát sinh giao dịch trong 30 ngày tới.
- Thời điểm đo: cuối ngày hiện tại.
- Đặc trưng: chỉ dùng dữ liệu có trước thời điểm đo.
Nếu định nghĩa nhãn mơ hồ, mô hình sẽ học đúng thứ bạn mô tả nhưng sai thứ bạn cần.
Đặc trưng và rò rỉ
Đặc trưng phải có sẵn tại thời điểm dự đoán.
Ví dụ: dự đoán khách huỷ vào ngày 1/6. Đặc trưng "số ngày kể từ giao dịch cuối" tính đến 1/6 là hợp lệ. Đặc trưng "tổng chi tiêu tháng 6" là rò rỉ — thông tin tương lai.
Đây là lỗi phổ biến và nguy hiểm vì mô hình cho kết quả rất đẹp trên tập test, rồi thất bại khi triển khai.
Baseline trước, mô hình sau
Luôn có một baseline đơn giản để so sánh. Với phân loại mất cân bằng, baseline là dự đoán lớp đa số.
from sklearn.dummy import DummyClassifier
from sklearn.metrics import accuracy_score
baseline = DummyClassifier(strategy="most_frequent")
baseline.fit(X_train, y_train)
print(accuracy_score(y_test, baseline.predict(X_test)))Với 5% khách huỷ, baseline này đạt accuracy 95% mà không học được gì. Bất kỳ mô hình nào có accuracy thấp hơn 95% đều tệ hơn "đoán tất cả không huỷ".
Đó là lý do accuracy không dùng được ở đây. Cần độ đo khác.
Ví dụ chạy được
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import roc_auc_score
df = pd.read_csv("customers.csv")
X = df.drop(columns=["churned", "customer_id"])
y = df["churned"]
X_train, X_test, y_train, y_test = train_test_split(
X,
y,
test_size=0.2,
stratify=y,
random_state=42,
)
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
proba = model.predict_proba(X_test)[:, 1]
print("ROC-AUC:", round(roc_auc_score(y_test, proba), 3))Ba điểm cần chú ý:
stratify=ygiữ tỷ lệ lớp giống nhau ở hai tập. Với dữ liệu mất cân bằng, không có nó tập test có thể có quá ít ca dương.random_statecố định để kết quả tái lập được.predict_probatrả xác suất; ngưỡng quyết định chọn sau, không phải lúc huấn luyện.
Chọn độ đo theo mục tiêu kinh doanh
Không có độ đo tốt nhất cho mọi bài toán. Câu hỏi là loại lỗi nào đắt hơn.
| Bài toán | Lỗi đắt hơn | Ưu tiên |
|---|---|---|
| Phát hiện gian lận | Bỏ sót gian lận | Recall |
| Gửi ưu đãi giữ chân | Gửi nhầm người | Precision |
| Xếp hạng khách tiềm năng | Thứ tự sai | ROC-AUC |
| Chẩn đoán bệnh | Bỏ sót bệnh nhân | Recall, sau đó precision |
Với dữ liệu mất cân bằng nặng, ROC-AUC có thể lạc quan; PR-AUC (precision-recall) phản ánh đúng hơn.
Lỗi thường gặp
- Chọn độ đo sau khi thấy kết quả: tự lừa mình.
- Dùng accuracy cho dữ liệu mất cân bằng: mô hình đoán lớp đa số trông rất tốt.
- Định nghĩa nhãn mơ hồ: mô hình học sai mục tiêu.
- Đưa đặc trưng tương lai: rò rỉ dữ liệu.
- Không có baseline: không biết mô hình có đáng dùng không.
- Huấn luyện trên toàn bộ dữ liệu rồi mới chia: không còn tập test độc lập.
Thực hành
- Viết định nghĩa nhãn cho bài toán dự đoán khách huỷ.
- Liệt kê ba đặc trưng hợp lệ và một đặc trưng gây rò rỉ.
- Dựng baseline
DummyClassifiervà ghi lại accuracy. - Huấn luyện logistic regression và so sánh ROC-AUC.
- Chọn độ đo phù hợp cho bài toán phát hiện gian lận.
Lỗi thường gặp
| Triệu chứng | Nguyên nhân | Cách sửa |
|---|---|---|
| Accuracy 95% nhưng vô dụng | Mất cân bằng lớp | Dùng precision, recall, PR-AUC |
| Kết quả đổi mỗi lần chạy | Không đặt random_state | Cố định seed |
| Test có quá ít ca dương | Không stratify | stratify=y |
| Điểm test cao bất thường | Rò rỉ đặc trưng | Chỉ dùng dữ liệu quá khứ |
| Không biết mô hình tốt hay không | Không có baseline | So với DummyClassifier |
Tóm tắt
- Học có giám sát học ánh xạ từ đặc trưng sang nhãn.
- Phân loại và hồi quy dùng độ đo khác nhau.
- Định nghĩa nhãn và thời điểm đo trước khi làm gì khác.
- Baseline trước, mô hình sau.
- Accuracy không dùng được khi lớp mất cân bằng.
Use ← → to move between lessons