AI 3 — Machine Learning cổ điển

13 thg 7, 2026 7 lượt xem
#machine-learning
#ai
#regression
#classification

AI 3 — Machine Learning cổ điển

"Machine Learning cổ điển" (classical ML) là tập hợp các thuật toán ra đời trước làn sóng deep learning, nhưng cho đến hôm nay vẫn là lựa chọn mặc định cho dữ liệu dạng bảng (tabular): bảng tính, log giao dịch, hồ sơ khách hàng. Chúng nhanh, dễ giải thích, ít tốn dữ liệu, và trong rất nhiều bài toán thực tế vẫn thắng các mạng nơ-ron sâu. Bài này đi từ ý tưởng nền tảng của từng họ thuật toán đến cách đánh giá mô hình một cách trung thực — phần mà người mới thường làm sai nhất.

Trước khi đi vào từng thuật toán, hãy nắm bức tranh tổng thể: học có giám sát (supervised) học từ dữ liệu đã gán nhãn để dự đoán, còn học không giám sát (unsupervised) tìm cấu trúc ẩn trong dữ liệu không nhãn.

Hồi quy tuyến tính (Linear Regression)

Ý tưởng

Hồi quy tuyến tính giả định rằng đầu ra y là một tổ hợp tuyến tính của các đặc trưng đầu vào:

ŷ = w₁x₁ + w₂x₂ + ... + wₙxₙ + b

Trong đó w là các trọng số (weight) và b là độ chệch (bias). Bài toán học chính là tìm bộ w, b sao cho đường (hay siêu phẳng) khớp với dữ liệu nhất. Ví dụ: dự đoán giá nhà từ diện tích, số phòng, khoảng cách tới trung tâm.

Hàm mất mát MSE

Để biết mô hình "khớp" hay chưa, ta cần đo sai lệch. Hàm mất mát phổ biến là Mean Squared Error (sai số bình phương trung bình):

MSE = (1/n) · Σ (yᵢ − ŷᵢ)²

Bình phương sai số làm mọi sai lệch thành dương và phạt nặng các điểm sai lớn (outlier). Mục tiêu huấn luyện: tìm w, b làm MSE nhỏ nhất.

Trực giác Gradient Descent

Làm sao tìm điểm thấp nhất của MSE? Hãy tưởng tượng MSE là một thung lũng hình bát, còn w là vị trí của bạn trên sườn dốc. Gradient (đạo hàm) cho biết hướng dốc lên; ta đi ngược lại — xuống dốc:

w ← w − η · ∂MSE/∂w

η (learning rate) là độ lớn mỗi bước. Bước quá lớn thì nhảy qua đáy và phân kỳ; quá nhỏ thì hội tụ chậm. Lặp lại cho tới khi gradient gần 0 — ta chạm đáy thung lũng. Đây là động cơ tối ưu dùng chung cho gần như mọi mô hình ML hiện đại, kể cả deep learning.

from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score

model = LinearRegression()
model.fit(X_train, y_train)        # học w, b
y_pred = model.predict(X_test)

print("RMSE:", mean_squared_error(y_test, y_pred, squared=False))
print("R²:", r2_score(y_test, y_pred))

Hồi quy logistic (Logistic Regression)

Dù tên có chữ "hồi quy", đây là thuật toán phân loại. Ý tưởng: lấy đầu ra tuyến tính z = w·x + b rồi ép qua hàm sigmoid để biến thành xác suất trong khoảng (0, 1):

p = σ(z) = 1 / (1 + e^(−z))

Nếu p ≥ 0.5 → lớp 1, ngược lại → lớp 0. Hàm mất mát không còn là MSE mà là cross-entropy (log loss), phạt mạnh khi mô hình tự tin sai. Logistic regression là baseline kinh điển cho mọi bài phân loại nhị phân: spam/không spam, gian lận/hợp lệ, click/không click. Nó nhanh, dễ giải thích (xem dấu và độ lớn của trọng số) và khó overfit.

Cây quyết định & Ensemble

Cây quyết định (Decision Tree)

Cây quyết định chia dữ liệu bằng chuỗi câu hỏi "nếu... thì...". Mỗi nút trong cây chọn một đặc trưng và một ngưỡng để chia dữ liệu thành hai nhánh sao cho mỗi nhánh "thuần" hơn (các điểm cùng lớp gom lại). Độ thuần đo bằng Gini impurity hoặc entropy.

Ưu điểm: trực quan, đọc được như luật, không cần chuẩn hóa dữ liệu. Nhược điểm lớn: overfitting. Một cây đủ sâu sẽ học thuộc lòng từng điểm huấn luyện (mỗi lá chỉ một mẫu) và mất khả năng tổng quát hóa. Ta hạn chế bằng cách giới hạn độ sâu (max_depth), số mẫu tối thiểu mỗi lá (min_samples_leaf), hoặc cắt tỉa (pruning).

Random Forest

Thay vì một cây dễ overfit, Random Forest trồng hàng trăm cây trên các tập con dữ liệu và đặc trưng ngẫu nhiên (bagging), rồi lấy bỏ phiếu đa số (phân loại) hoặc trung bình (hồi quy). Việc trung bình hóa nhiều cây "loạn" độc lập làm giảm phương sai mạnh, cho mô hình ổn định và mạnh mẽ mà gần như không cần tinh chỉnh nhiều.

Gradient Boosting / XGBoost

Boosting tiếp cận khác: xây cây tuần tự, mỗi cây mới tập trung sửa lỗi của các cây trước (học theo phần dư — residual). Kết quả là một tổ hợp rất mạnh. XGBoost, LightGBM, CatBoost là các cài đặt boosting tối ưu, hiện thống trị các cuộc thi dữ liệu bảng và là vũ khí chủ lực trong scoring tín dụng, dự báo nhu cầu, phát hiện gian lận. Đổi lại, chúng cần tinh chỉnh siêu tham số cẩn thận hơn Random Forest.

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier(n_estimators=300, max_depth=12, random_state=42)
rf.fit(X_train, y_train)
print(rf.feature_importances_)   # tầm quan trọng của từng đặc trưng

KNN (K-Nearest Neighbors)

KNN là thuật toán "lười" nhất: nó không huấn luyện gì cả, chỉ lưu toàn bộ dữ liệu. Khi cần dự đoán một điểm mới, nó tìm k điểm gần nhất (theo khoảng cách Euclid) và lấy nhãn phổ biến nhất trong số đó. k nhỏ thì nhạy nhiễu; k lớn thì làm mượt biên quyết định. KNN đơn giản, trực quan, nhưng chậm khi dữ liệu lớn và rất nhạy với việc chuẩn hóa thang đo — bắt buộc scale đặc trưng trước khi dùng, nếu không đặc trưng có đơn vị lớn sẽ áp đảo khoảng cách.

SVM (Support Vector Machine)

Margin

SVM tìm siêu phẳng phân tách hai lớp sao cho lề (margin) — khoảng cách từ siêu phẳng tới các điểm gần nhất — là lớn nhất. Các điểm nằm sát lề gọi là support vector; chúng quyết định toàn bộ ranh giới. Lề rộng nghĩa là mô hình tổng quát hóa tốt hơn, ít nhạy với nhiễu.

Kernel

Khi dữ liệu không tách được bằng một đường thẳng, SVM dùng kernel trick: ánh xạ dữ liệu lên không gian chiều cao hơn — nơi nó trở nên tách tuyến tính được — mà không cần tính tọa độ mới một cách tường minh. Kernel RBF (Gaussian) là lựa chọn phổ biến cho biên phi tuyến. SVM mạnh với dữ liệu chiều cao và tập vừa và nhỏ, nhưng kém hiệu quả khi dữ liệu rất lớn.

K-Means Clustering

Đây là thuật toán không giám sát — không có nhãn. K-Means chia dữ liệu thành k cụm theo nguyên tắc lặp:

  1. Chọn ngẫu nhiên k tâm cụm (centroid).
  2. Gán mỗi điểm vào tâm gần nhất.
  3. Tính lại tâm = trung bình các điểm trong cụm.
  4. Lặp 2–3 cho tới khi tâm ổn định.

Ứng dụng: phân khúc khách hàng, nén ảnh, phát hiện bất thường. Cần chọn k trước (dùng phương pháp elbow hoặc silhouette), và kết quả phụ thuộc khởi tạo — nên dùng k-means++.

from sklearn.cluster import KMeans

km = KMeans(n_clusters=4, init="k-means++", random_state=42)
labels = km.fit_predict(X_scaled)

Đánh giá mô hình

Đây là phần quan trọng nhất và dễ sai nhất. Một mô hình tốt trên giấy có thể vô dụng trong thực tế nếu chọn sai chỉ số.

Phân loại: ma trận nhầm lẫn

Mọi chỉ số phân loại đều bắt nguồn từ confusion matrix:

Dự đoán DươngDự đoán Âm
Thực DươngTP (đúng dương)FN (sót)
Thực ÂmFP (báo nhầm)TN (đúng âm)

Từ đó:

Chỉ sốCông thứcÝ nghĩa
Accuracy(TP+TN)/TổngTỉ lệ dự đoán đúng nói chung
PrecisionTP/(TP+FP)Trong số báo dương, bao nhiêu thật sự dương
RecallTP/(TP+FN)Trong số thật dương, bắt được bao nhiêu
F1-score2·P·R/(P+R)Trung bình điều hòa của precision & recall
ROC-AUCdiện tích dưới ROCKhả năng xếp hạng dương trên âm, không phụ thuộc ngưỡng

Vì sao accuracy gây hiểu lầm khi mất cân bằng lớp

Hãy xét bài toán phát hiện gian lận: trong 100.000 giao dịch chỉ có 100 giao dịch gian lận (0,1%). Một mô hình "ngu" luôn dự đoán "hợp lệ" sẽ đạt accuracy 99,9% — nghe rất ấn tượng nhưng nó bắt được 0 ca gian lận. Accuracy hoàn toàn vô dụng ở đây vì lớp đa số áp đảo phép tính.

Với dữ liệu mất cân bằng, ta phải nhìn:

  • Recall — quan trọng khi bỏ sót tốn kém (sót gian lận, sót bệnh ung thư).
  • Precision — quan trọng khi báo nhầm tốn kém (chặn nhầm giao dịch của khách thật).
  • F1 — khi cần cân bằng cả hai.
  • PR-AUC / ROC-AUC — đánh giá toàn diện qua mọi ngưỡng.

Thực tế phát hiện gian lận luôn là đánh đổi precision–recall: hạ ngưỡng để bắt nhiều gian lận hơn (recall tăng) thì báo nhầm cũng tăng (precision giảm). Ngưỡng được chọn theo chi phí kinh doanh, không phải theo mặc định 0.5.

from sklearn.metrics import classification_report, roc_auc_score, confusion_matrix

y_pred = model.predict(X_test)
y_proba = model.predict_proba(X_test)[:, 1]

print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))   # precision, recall, f1 từng lớp
print("ROC-AUC:", roc_auc_score(y_test, y_proba))

Hồi quy: MAE, RMSE, R²

Chỉ sốÝ nghĩaĐặc điểm
MAESai số tuyệt đối trung bìnhCùng đơn vị y, ít nhạy outlier
RMSECăn của MSEPhạt nặng sai số lớn
Tỉ lệ phương sai giải thích được1 là hoàn hảo, 0 là bằng dự đoán trung bình

Nếu dữ liệu nhiều outlier và bạn không muốn bị chúng chi phối, ưu tiên MAE. Nếu các sai lệch lớn là nghiêm trọng, dùng RMSE.

Bias–Variance Tradeoff

Mọi sai số mô hình tách thành hai nguồn:

  • Bias cao (underfitting): mô hình quá đơn giản, không nắm được quy luật — sai cả trên train lẫn test (ví dụ đường thẳng cho dữ liệu cong).
  • Variance cao (overfitting): mô hình quá phức tạp, học cả nhiễu — tốt trên train nhưng tệ trên test (ví dụ cây quyết định quá sâu).

Mục tiêu là điểm cân bằng "vừa đủ phức tạp". Công cụ kiểm soát: regularization (L1/L2), giới hạn độ phức tạp mô hình, và cross-validation để ước lượng hiệu năng trung thực.

Hyperparameter Tuning

Tham số mô hình (w, b) được học từ dữ liệu; còn siêu tham số (max_depth, n_estimators, k, C, learning rate) phải do ta chọn. Các cách tinh chỉnh:

  • Grid Search: thử mọi tổ hợp trong lưới định trước — chắc chắn nhưng tốn.
  • Random Search: lấy mẫu ngẫu nhiên — thường hiệu quả hơn với cùng ngân sách.
  • Bayesian Optimization (Optuna): dùng kết quả trước để chọn điểm thử tiếp theo thông minh hơn.

Luôn đánh giá bằng cross-validation trên tập train, và chỉ chạm vào tập test một lần cuối để tránh rò rỉ thông tin.

from sklearn.model_selection import GridSearchCV

params = {"max_depth": [6, 12, None], "n_estimators": [100, 300]}
grid = GridSearchCV(RandomForestClassifier(random_state=42),
                    params, scoring="f1", cv=5)
grid.fit(X_train, y_train)
print(grid.best_params_, grid.best_score_)

Tóm tắt

  • Hồi quy tuyến tính khớp một đường thẳng, tối ưu MSE bằng gradient descent — nền tảng của mọi mô hình.
  • Hồi quy logistic dùng sigmoid biến đầu ra thành xác suất để phân loại; là baseline kinh điển.
  • Cây quyết định dễ hiểu nhưng dễ overfit; Random Forest (bagging) và Gradient Boosting/XGBoost (boosting) khắc phục và thống trị dữ liệu bảng.
  • KNN đơn giản, cần chuẩn hóa thang đo; SVM tối đa hóa lề và dùng kernel cho biên phi tuyến.
  • K-Means phân cụm dữ liệu không nhãn.
  • Đánh giá phải đúng chỉ số: accuracy gây hiểu lầm khi lớp mất cân bằng — dùng precision/recall/F1/AUC cho bài toán như phát hiện gian lận.
  • Luôn cân bằng bias–variance và tinh chỉnh siêu tham số bằng cross-validation.

Tự kiểm tra

  1. Tại sao gradient descent đi ngược hướng gradient để giảm hàm mất mát?
  2. Một mô hình phát hiện gian lận đạt accuracy 99,5% nhưng recall 2%. Vì sao nó vô dụng, và bạn nên nhìn chỉ số nào?
  3. Phân biệt bagging (Random Forest) và boosting (XGBoost) — điểm khác cốt lõi là gì?
  4. Khi nào nên chọn MAE thay vì RMSE để đánh giá hồi quy?
  5. Một cây quyết định đạt 100% trên train nhưng 60% trên test. Đây là hiện tượng gì và khắc phục thế nào?
  6. Vì sao KNN và SVM bắt buộc chuẩn hóa đặc trưng còn cây quyết định thì không?

Đọc tiếp

AI 4 — Deep Learning

Bài viết liên quan

Phân biệt AI/ML/DL, các kiểu học máy, quy trình ML end-to-end và thuật ngữ nền tảng.

13 thg 7, 2026 15

Chất lượng dữ liệu, xử lý thiếu/ngoại lai, mã hoá, chuẩn hoá, tạo đặc trưng và tránh data leakage.

13 thg 7, 2026 13

Mô hình ngôn ngữ lớn hoạt động ra sao, token, context window, tham số sinh, và kỹ thuật viết prompt.

13 thg 7, 2026 13

Retrieval-Augmented Generation, vector database, tool calling, agent và MCP để xây ứng dụng LLM thực tế.

13 thg 7, 2026 11