DHDataHọc
TheoryLesson 1/85 min read+10 XP

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.

code
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ấy

Họ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ạiNhãnVí dụĐộ đo chính
Phân loạiRời rạcKhách có huỷ không, email có spam khôngPrecision, recall, F1, ROC-AUC
Hồi quyLiên tụcDoanh thu tháng sau, thời gian giao hàngMAE, 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ố.

code
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

code
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=y giữ 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_state cố định để kết quả tái lập được.
  • predict_proba trả 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ánLỗi đắt hơnƯu tiên
Phát hiện gian lậnBỏ sót gian lậnRecall
Gửi ưu đãi giữ chânGửi nhầm ngườiPrecision
Xếp hạng khách tiềm năngThứ tự saiROC-AUC
Chẩn đoán bệnhBỏ sót bệnh nhânRecall, 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

  1. Viết định nghĩa nhãn cho bài toán dự đoán khách huỷ.
  2. Liệt kê ba đặc trưng hợp lệ và một đặc trưng gây rò rỉ.
  3. Dựng baseline DummyClassifier và ghi lại accuracy.
  4. Huấn luyện logistic regression và so sánh ROC-AUC.
  5. 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ứngNguyên nhânCách sửa
Accuracy 95% nhưng vô dụngMất cân bằng lớpDùng precision, recall, PR-AUC
Kết quả đổi mỗi lần chạyKhông đặt random_stateCố định seed
Test có quá ít ca dươngKhông stratifystratify=y
Điểm test cao bất thườngRò rỉ đặc trưngChỉ dùng dữ liệu quá khứ
Không biết mô hình tốt hay khôngKhông có baselineSo 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