End-to-End ML Project
Dự án ML từ đầu đến cuối
Bạn có kiến thức. Giờ là dự án thật.
Từ câu hỏi kinh doanh → dữ liệu → mô hình → triển khai → theo dõi. Đây là bản đồ bạn cần trong đầu trước mọi dự án ML — không có nó, bạn sẽ đi lạc ngay ở tuần thứ hai.
Bài này đưa bạn đi qua 8 giai đoạn, kèm một case study Shopee thật — từ yêu cầu mơ hồ của sếp đến mô hình chạy production và tự phục hồi khi dữ liệu đổi.
Sếp giao dự án 2 tháng dự đoán đơn hủy Shopee. Bạn có dữ liệu 12 triệu đơn. Bước đi đầu tiên ĐÚNG nhất là gì?
Hình minh họa
Bấm vào từng hình chữ nhật để mở case study mini: đầu vào, đầu ra, đoạn code ngắn, và bài học chính. Đường nét đứt màu xanh ở dưới là vòng retrain — model không bao giờ là đích đến.
Bấm các ô để chọn giai đoạn · mũi tên xanh: vòng retrain từ monitoring về feature engineering
Giai đoạn 1 / 8
Xác định bài toán
Biến câu hỏi kinh doanh mơ hồ thành bài toán ML rõ ràng.
Đầu vào
Câu hỏi sếp: “Làm sao giảm đơn hủy?”
Đầu ra
ML task: phân loại nhị phân + metric + baseline.
Nếu không chốt target và metric ngay bây giờ, mọi thứ phía sau sẽ đi chệch.
# spec.yaml — bản cam kết với sếp trước khi code
target: don_bi_huy_trong_24h
ml_task: binary_classification
metric_chinh: pr_auc # ưu tiên recall cho class positive
metric_phu: recall@precision=0.8
baseline: du_doan_luon_khong_huy # ~92% accuracy vẫn 0 recall
quyet_dinh_trien_khai: recall >= 0.65 @ precision 0.80Đọc đoạn code trên bằng tiếng Việt
Đây chưa phải code — là bản spec. Viết ra rõ ràng target, metric chính, baseline, và ngưỡng để ra quyết định. Nếu không có dòng này, sau 2 tháng sếp sẽ hỏi “kết quả thế nào?” và bạn không biết trả lời sao.
Dự án thật: “Dự đoán đơn hàng bị hủy trên Shopee”
Đội data 1 engineer, 2 tháng, mục tiêu giảm rò rỉ doanh thu vì đơn hủy. Bạn sẽ thấy mọi số liệu, mọi quyết định, mọi cú vấp.
Sếp: ‘Đơn hủy tuần qua tăng 18%. Làm gì đó đi.’
Bạn không nhảy vào code. Bạn hỏi lại: hủy ở đâu? hủy lúc nào? hủy vì lý do gì? Sau 2 buổi họp, các bên đồng ý: ưu tiên đơn hủy trong 24h đầu, do người mua tự hủy (không phải shop). Chốt metric PR-AUC vì dữ liệu hủy rất lệch (~8% positive).
Thấy chưa — 8 giai đoạn không phải lý thuyết. Mỗi ô là một quyết định cụ thể, một con số, một tình huống. Giá trị không nằm ở mô hình LightGBM, mà nằm ở việc bạn có hiểu sếp, có chạy EDA, có slice error, có monitor drift hay không. Engineer ML giỏi = người biết đi hết vòng lặp này, không phải người biết nhiều thuật toán nhất.
Mô hình đã deploy 2 tuần; accuracy rớt 2 điểm phần trăm, precision rớt 17 điểm. Đâu là nhóm nguyên nhân KHẢ THI nhất? (Chọn đáp án đầy đủ nhất.)
Bạn có 4 tuần để làm dự án dự đoán đơn hủy. Phân bổ thời gian nào HỢP LÝ nhất?
Giải thích
Dự án ML không phải chuỗi tuyến tính — nó là vòng lặp. Bạn có thể hình dung bằng một phép lặp đơn giản: mỗi lần monitoring phát hiện drift, bạn quay về feature engineering hoặc data collection, rồi đi lại từ đó đến deploy.
Vòng tròn ở cuối nhắc bạn: không có ‘xong’. Một mô hình sống trung bình 3–12 tháng trước khi cần retrain lớn. Nếu bạn chỉ làm đến Deploy rồi dừng, mô hình sẽ thầm lặng ‘thối rữa’.
Checklist trước khi báo cáo sếp ‘dự án xong’
Tám dòng bên dưới là đủ — không cần dài hơn. Thiếu một dòng là một rủi ro mà bạn đang đẩy sang tương lai.
Có spec viết tay về target + metric + baseline.
Snapshot dataset có version theo ngày/commit.
Notebook EDA với 5 phát hiện lớn nhất.
Pipeline đóng gói mọi phép biến đổi.
Cross-validation có σ, không chỉ một lần split.
Slice error theo segment quan trọng.
Canary rollout + rollback plan viết rõ.
Dashboard drift + alert khi metric rớt >10%.
Bảng ‘5 cú vấp kinh điển’ — đọc để đừng vấp lần nữa
| Cái bẫy | Triệu chứng | Nguyên nhân | Cách tránh |
|---|---|---|---|
| Data leakage | Offline metric cao bất thường (PR-AUC > 0.95 cho bài khó). | Fit scaler/encoder trên toàn bộ data, target encoding không CV. | Luôn dùng Pipeline. Fit trên train, transform trên test. |
| Train/serve skew | Model tốt offline nhưng sai lệch khi deploy. | Transform pandas offline, SQL online → logic khác nhau. | Dùng chung 1 Pipeline cho cả train và serve (joblib save). |
| Metric ảo | Accuracy 99% nhưng không bắt được positive nào. | Dữ liệu lệch + chọn accuracy cho imbalanced classification. | Dùng PR-AUC, recall@precision, F1 của class minority. |
| Không baseline | Không biết LightGBM 0.82 AUC là tốt hay bình thường. | Nhảy thẳng vào mô hình phức tạp. | Luôn có LogisticRegression hoặc heuristic làm điểm so sánh. |
| Deploy xong rồi quên | Model ‘thối rữa’ âm thầm, sếp phát hiện sau 3 tháng. | Không monitor drift, không alert khi metric rớt. | Dashboard drift + cron retrain + Slack alert. |
Bộ xương ‘ML Pipeline’ — tối thiểu bạn cần biết viết
Ba đoạn code dưới đây là mẫu xương sống. Mỗi đoạn dưới 15 dòng và đi kèm giải thích ngay dưới — bạn có thể copy-adapt cho dự án đầu tay của mình.
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import GradientBoostingClassifier
pre = ColumnTransformer([
("num", StandardScaler(), num_cols),
("cat", OneHotEncoder(handle_unknown="ignore"), cat_cols),
])
pipe = Pipeline([
("pre", pre),
("clf", GradientBoostingClassifier(random_state=42)),
])Đọc code bằng tiếng Việt
Toàn bộ bước biến đổi (scale số, one-hot cột chữ) và mô hình được gói chung vào một Pipeline. Khi bạn gọi pipe.fit(X_train) , nội bộ sẽ tự fit scaler chỉ trên train, transform rồi train model. Khi pipe.predict(X_test), scaler dùng tham số đã fit — không bị data leakage. Đây là thói quen bắt buộc cho mọi dự án ML.
import joblib
# Lưu sau khi fit xong trên tập train
pipe.fit(X_train, y_train)
joblib.dump(pipe, "model_v1.pkl")
# Sau này (kể cả trên server khác):
loaded = joblib.load("model_v1.pkl")
proba = loaded.predict_proba(X_new)[:, 1]Đọc code bằng tiếng Việt
joblib.dump lưu nguyên cả Pipeline (bao gồm preprocessing) chứ không chỉ model. Khi load lại, predict_proba tự động chạy đủ chuỗi: scale → one-hot → predict. Đây là cách duy nhất đáng tin để đảm bảo transform online giống hệt offline — tránh train/serve skew.
An toàn: chỉ joblib.load / pickle.load trên file do chính bạn tạo hoặc nguồn đã xác minh. File .pkl lạ có thể chạy code Python tuỳ ý khi load (supply-chain attack trên HuggingFace / Kaggle là thật). Dùng picklescan hoặc convert sang safetensors trước.
from fastapi import FastAPI
from pydantic import BaseModel
import joblib, pandas as pd
app = FastAPI()
model = joblib.load("model_v1.pkl")
class Order(BaseModel):
gmv_vnd: float; hour_of_day: int
city: str; device: str
@app.post("/predict")
def predict(o: Order):
df = pd.DataFrame([o.dict()])
return {"cancel_proba": float(model.predict_proba(df)[0, 1])}Đọc code bằng tiếng Việt
FastAPI dựng API chỉ vài dòng. pydantic kiểm tra input trước khi chạy — nếu thiếu trường hoặc sai kiểu, trả lỗi rõ ràng thay vì mô hình crash. model.predict_proba trả về xác suất; chia tiếp theo ngưỡng của sản phẩm (0.5 mặc định, hoặc điều chỉnh theo yêu cầu recall/precision).
Các tài nguyên liên quan để đào sâu:
- Tiền xử lý dữ liệu — chi tiết về missing values, scaling, encoding.
- Feature engineering — kỹ thuật tạo và chọn đặc trưng.
- Đánh giá và chọn mô hình — PR-AUC, cross-validation, chọn ngưỡng.
- Python cho ML — pandas, sklearn, matplotlib nền tảng.
- Dự án ML là vòng lặp 8 giai đoạn — Framing → Data → EDA → Features → Train → Eval → Deploy → Monitor — không phải chuỗi tuyến tính.
- Bắt đầu ở Framing: chốt target, metric, baseline trước khi chạm dữ liệu. Thiếu bước này là đi lạc.
- Data work (EDA + Features) chiếm >50% thời gian — và thường là đòn bẩy lớn nhất cho chất lượng.
- Luôn đóng gói preprocessing + model vào một Pipeline, lưu joblib — tránh train/serve skew, tránh leakage.
- Đánh giá phải slice theo segment; accuracy một con số cho imbalanced là dối lòng.
- Deploy xong chưa xong — monitoring drift + retrain loop mới là đích đến thật sự.
Bài này là capstone của hành trình Student — bạn đã có bản đồ, case study, và bộ xương code để triển khai. Nhưng một ML engineer chuyên nghiệp còn cần: feature store, CI/CD cho model, vector database, LLM-in-production, guardrails, và nhiều thứ MLOps khác. Nếu bạn muốn đi tiếp, chuyển sang lộ trình AI Engineer — nơi bạn sẽ học cách đóng gói mọi thứ thành hệ thống sản xuất cho nhóm hàng triệu người dùng.
Gợi ý các chủ đề mở đầu: feature engineering, đánh giá mô hình.
Ghi nhớ cuối: dự án ML đầu tay sẽ KHÔNG đẹp. Bạn sẽ sai metric, bị leakage ít nhất một lần, quên monitoring. Điều đó bình thường. Cái khiến bạn khác người là: lần thứ hai bạn sẽ không mắc cùng lỗi đó. Bản đồ 8 giai đoạn ở trên là la bàn — đem theo bên mình cho dự án đầu tiên, rồi bạn sẽ tự biết khi nào cần cập nhật.
Sáu câu cuối để chốt toàn bộ bản đồ. Mỗi câu đều gắn với một giai đoạn trong pipeline — nếu làm sai, hãy đọc lại đúng giai đoạn đó.
Kiểm tra hiểu biết
Bước ĐẦU TIÊN của một dự án ML thực chiến là gì?