AI 2 — Dữ liệu & Feature Engineering
Vì sao "garbage in, garbage out"
Trong học máy, mô hình chỉ học được những gì dữ liệu mang lại. Một thuật toán hiện đại nhất, được tinh chỉnh kỹ lưỡng, vẫn sẽ cho dự đoán tệ nếu dữ liệu đầu vào sai lệch, thiếu sót hoặc chứa thông tin "không công bằng". Đây chính là ý nghĩa của câu nói nổi tiếng "garbage in, garbage out" (rác vào thì rác ra).
Một sự thật thường bị xem nhẹ: trong các dự án thực tế, 70–80% thời gian của một kỹ sư dữ liệu/khoa học dữ liệu là dành cho việc chuẩn bị dữ liệu, không phải cho việc chọn mô hình. Việc nâng cấp từ một mô hình tốt sang một mô hình tốt hơn thường chỉ cải thiện vài phần trăm; trong khi việc làm sạch dữ liệu, tạo đặc trưng tốt có thể tạo ra khác biệt áp đảo.
Hãy lấy một bối cảnh xuyên suốt bài này: chấm điểm tín dụng (credit scoring). Mục tiêu là dự đoán một khách hàng vay có khả năng vỡ nợ (default) trong 12 tháng tới hay không. Dữ liệu gồm: tuổi, thu nhập, nghề nghiệp, lịch sử trả nợ, số dư thẻ tín dụng, ngày mở tài khoản... Mỗi bước xử lý dưới đây sẽ được soi qua lăng kính này.
Các loại dữ liệu
Hiểu đúng loại dữ liệu là điều kiện tiên quyết để xử lý đúng cách.
Dữ liệu số (numerical)
Là các giá trị đo được. Chia thành:
- Liên tục (continuous): thu nhập, số dư, lãi suất — có thể nhận giá trị thập phân bất kỳ.
- Rời rạc (discrete): số lần trễ hạn, số thẻ tín dụng đang sở hữu — là số nguyên đếm được.
Dữ liệu hạng mục (categorical)
Là các nhãn, không có giá trị đo lường nội tại:
- Danh định (nominal): nghề nghiệp, tỉnh thành — không có thứ tự.
- Thứ bậc (ordinal): trình độ học vấn (cấp 1 < cấp 2 < đại học), xếp hạng rủi ro (thấp < trung bình < cao) — có thứ tự nhưng khoảng cách không nhất thiết bằng nhau.
Dữ liệu văn bản (text)
Mô tả mục đích vay, ghi chú của nhân viên tín dụng. Cần kỹ thuật riêng (token hoá, vector hoá) — sẽ bàn ở các bài về NLP.
Dữ liệu thời gian (datetime)
Ngày mở tài khoản, ngày giao dịch. Bản thân một dấu thời gian thô thường ít hữu ích; giá trị nằm ở những gì ta trích xuất ra từ nó (xem phần feature engineering).
Phân biệt sai loại dữ liệu là lỗi kinh điển: nếu mã "tỉnh thành" được lưu bằng số (1, 2, 3...) và bạn để mô hình coi nó là biến số, mô hình sẽ "tưởng" tỉnh 3 lớn gấp ba tỉnh 1 — một quan hệ vô nghĩa.
Làm sạch dữ liệu
Giá trị thiếu (missing values)
Dữ liệu thực tế hầu như luôn có chỗ trống. Có hai chiến lược chính:
Xoá (deletion): loại bỏ dòng hoặc cột chứa giá trị thiếu. Đơn giản nhưng tốn dữ liệu. Chỉ nên dùng khi tỷ lệ thiếu rất nhỏ, hoặc một cột thiếu quá nhiều (ví dụ trên 60%) đến mức không cứu được.
Điền (imputation): thay giá trị thiếu bằng một ước lượng:
- Với biến số: điền bằng trung bình (mean) hoặc trung vị (median). Trung vị an toàn hơn khi có ngoại lai.
- Với biến hạng mục: điền bằng giá trị xuất hiện nhiều nhất (mode), hoặc tạo một hạng mục riêng "Unknown".
Một điểm quan trọng trong tín dụng: bản thân việc thiếu dữ liệu có thể mang thông tin. Một khách hàng không khai thu nhập có thể rủi ro hơn người khai đầy đủ. Khi đó nên tạo thêm một cột cờ income_is_missing (0/1) trước khi điền, để mô hình tự học mối liên hệ này.
from sklearn.impute import SimpleImputer
import numpy as np
# Điền median cho cột thu nhập
imputer = SimpleImputer(strategy="median")
X_train["income"] = imputer.fit_transform(X_train[["income"]])
Ngoại lai (outliers)
Ngoại lai là các giá trị bất thường so với phần còn lại. Một khách hàng khai thu nhập 10 tỷ/tháng có thể là siêu giàu thật, hoặc do lỗi nhập liệu (nhầm đơn vị).
Cách phát hiện phổ biến:
- Quy tắc IQR: tính khoảng tứ phân vị IQR = Q3 − Q1; điểm nằm ngoài [Q1 − 1.5·IQR, Q3 + 1.5·IQR] bị coi là ngoại lai.
- Z-score: điểm có |z| > 3 (cách trung bình hơn 3 độ lệch chuẩn).
Cách xử lý: xoá nếu chắc chắn là lỗi; cắt ngưỡng (capping/winsorizing) nếu là giá trị thật nhưng cực đoan (ép về ngưỡng trên/dưới); hoặc dùng phép biến đổi log để nén đuôi phân phối. Tuyệt đối không xoá ngoại lai một cách máy móc — đôi khi ngoại lai chính là tín hiệu quan trọng nhất (ví dụ giao dịch gian lận).
Trùng lặp (duplicates)
Các bản ghi lặp làm sai lệch phân phối và khiến mô hình "học vẹt". Cần loại bỏ, nhưng phải cẩn thận: hai dòng giống hệt có thể là hai giao dịch hợp lệ khác nhau. Hãy xác định trùng lặp dựa trên khoá nghiệp vụ (ví dụ cùng customer_id + cùng application_date), không chỉ dựa trên việc mọi cột giống nhau.
Mã hoá biến hạng mục
Đa số thuật toán chỉ làm việc với số. Cần chuyển biến hạng mục thành số một cách hợp lý.
One-hot encoding
Mỗi giá trị thành một cột nhị phân. Ví dụ nghề = {công chức, kinh doanh, tự do} → ba cột is_công_chức, is_kinh_doanh, is_tự_do. Ưu điểm: không áp đặt thứ tự giả. Nhược điểm: số cột bùng nổ khi biến có nhiều giá trị (high cardinality), ví dụ mã bưu chính.
Label encoding
Gán mỗi giá trị một số nguyên (công chức=0, kinh doanh=1...). Gọn nhẹ nhưng áp đặt một thứ tự giả — phù hợp với biến thứ bậc (ordinal) và với cây quyết định, nhưng nguy hiểm với mô hình tuyến tính trên biến danh định.
Target encoding
Thay mỗi hạng mục bằng giá trị trung bình của biến mục tiêu cho hạng mục đó. Ví dụ thay "nghề tự do" bằng tỷ lệ vỡ nợ trung bình của nhóm nghề tự do. Rất mạnh với biến nhiều giá trị, nhưng cực kỳ dễ gây rò rỉ dữ liệu nếu tính trung bình trên toàn bộ tập (kể cả dòng đang được mã hoá). Phải tính riêng trên tập huấn luyện và thường kèm làm mượt (smoothing) hoặc tính theo fold trong cross-validation.
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(handle_unknown="ignore", sparse_output=False)
job_encoded = encoder.fit_transform(X_train[["job"]])
Chuẩn hoá và scaling
Nhiều thuật toán nhạy cảm với thang đo (scale) của đặc trưng. Nếu "thu nhập" có giá trị hàng chục triệu còn "số thẻ" chỉ 1–5, thì các phương pháp dựa trên khoảng cách sẽ bị thu nhập lấn át.
Standardization (chuẩn hoá z-score)
Biến mỗi cột về trung bình 0, độ lệch chuẩn 1: z = (x − μ) / σ. Phù hợp khi dữ liệu gần phân phối chuẩn. Là lựa chọn mặc định an toàn cho nhiều thuật toán.
Normalization (đưa về [0, 1])
Min-max scaling: x' = (x − min) / (max − min). Hữu ích cho mạng nơ-ron, hoặc khi cần giới hạn miền giá trị. Nhược điểm: rất nhạy với ngoại lai (một giá trị cực đại sẽ kéo dãn cả thang).
Khi nào CẦN scaling?
- Cần: mô hình tuyến tính có regularization, SVM, KNN, K-means, PCA, mạng nơ-ron — tất cả đều dựa trên khoảng cách hoặc gradient nhạy thang đo.
- Không cần: các mô hình dựa trên cây (decision tree, random forest, gradient boosting) — vì chúng chỉ so sánh ngưỡng trên từng đặc trưng, bất biến với phép biến đổi đơn điệu.
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train) # fit CHỈ trên train
X_test_scaled = scaler.transform(X_test) # test chỉ transform
Dòng code trên ẩn chứa một nguyên tắc tối quan trọng — sẽ giải thích kỹ ở phần data leakage.
Feature engineering — tạo đặc trưng
Đây là nơi kiến thức nghiệp vụ tạo ra giá trị lớn nhất. Mô hình không tự "hiểu" nghiệp vụ; ta phải mã hoá hiểu biết đó thành đặc trưng.
Trích xuất từ ngày tháng
Từ ngày_mở_tài_khoản ta có thể tạo: tuổi tài khoản (số tháng), tháng/quý mở, là cuối tuần hay không. Trong tín dụng, thời gian quan hệ với khách hàng thường là tín hiệu mạnh về độ tin cậy.
Tỉ lệ (ratios)
Tỉ lệ thường giàu thông tin hơn giá trị tuyệt đối. Ví dụ kinh điển: Debt-to-Income (DTI) = tổng nợ / thu nhập. Một người nợ 50 triệu không nói lên nhiều điều; nhưng nợ 50 triệu trên thu nhập 10 triệu/tháng là tín hiệu rủi ro rõ ràng.
Binning (rời rạc hoá)
Chuyển biến liên tục thành nhóm: tuổi → {18–25, 26–40, 41–60, >60}. Giúp nắm bắt quan hệ phi tuyến và giảm ảnh hưởng ngoại lai, đổi lại mất một phần thông tin chi tiết.
Đặc trưng tương tác (interaction)
Kết hợp hai biến: ví dụ thu_nhập × tuổi_tài_khoản, hoặc số_lần_trễ_hạn / tuổi_tài_khoản. Tương tác cho phép mô hình tuyến tính nắm bắt những hiệu ứng mà từng biến riêng lẻ không thể.
Giảm chiều và chọn đặc trưng
Khi số đặc trưng quá lớn, ta gặp "lời nguyền chiều cao" (curse of dimensionality): dữ liệu thưa thớt, mô hình dễ overfit, huấn luyện chậm.
PCA (Principal Component Analysis) — giới thiệu
PCA là kỹ thuật giảm chiều không giám sát: nó tìm các trục mới (thành phần chính) theo hướng có phương sai lớn nhất, rồi giữ lại vài trục đầu tiên để biểu diễn dữ liệu với ít chiều hơn mà mất ít thông tin nhất. Lưu ý: PCA dựa trên phương sai nên bắt buộc phải scaling trước, và các thành phần kết quả khó diễn giải về mặt nghiệp vụ — một nhược điểm lớn trong tín dụng, nơi ta cần giải thích được lý do từ chối cho vay.
Chọn đặc trưng (feature selection)
Khác với PCA (tạo trục mới), chọn đặc trưng giữ lại tập con các đặc trưng gốc:
- Lọc (filter): dựa trên thống kê (tương quan với mục tiêu, kiểm định chi-square).
- Bao (wrapper): thử các tập con, ví dụ loại bỏ đệ quy (RFE).
- Nhúng (embedded): mô hình tự chọn, ví dụ regularization L1 (Lasso) đẩy hệ số không quan trọng về 0.
Trong tín dụng, ta thường ưu tiên chọn đặc trưng hơn PCA vì cần giữ tính diễn giải.
Data leakage — rò rỉ dữ liệu
Đây là cái bẫy nguy hiểm và phổ biến nhất, vì nó khiến mô hình trông rất tốt khi đánh giá nhưng thất bại thảm hại khi triển khai thật.
Định nghĩa: data leakage xảy ra khi thông tin mà mô hình lẽ ra không được biết tại thời điểm dự đoán lại "rò rỉ" vào quá trình huấn luyện.
Nguyên nhân phổ biến
-
Tiền xử lý trên toàn bộ dữ liệu trước khi tách (split). Nếu bạn fit
StandardScaler(tính μ, σ) trên cả tập trước rồi mới chia train/test, thì thống kê của tập test đã "lọt" vào quá trình chuẩn hoá tập train. Đây là lý do code ở trên gọifit_transformtrên train nhưng chỉtransformtrên test: scaler học μ, σ chỉ từ train, mô phỏng đúng việc khi triển khai ta không hề biết dữ liệu tương lai. -
Đặc trưng chứa thông tin tương lai (target leakage). Ví dụ kinh điển trong tín dụng: đưa cột
số_tiền_đã_thu_hồi_sau_vỡ_nợvào mô hình dự đoán vỡ nợ. Cột này chỉ tồn tại SAU khi đã vỡ nợ — tại thời điểm xét duyệt nó chưa có. Mô hình sẽ đạt độ chính xác gần như hoàn hảo trong thử nghiệm rồi vô dụng khi chạy thật. -
Target encoding tính trên cả tập (đã nói ở trên).
-
Trùng lặp bị rải ngẫu nhiên qua cả train và test, khiến test không còn "mới" với mô hình.
Cách tránh
- Tách dữ liệu TRƯỚC, rồi mới fit mọi bước tiền xử lý chỉ trên train.
- Dùng
Pipelinecủa scikit-learn để gói toàn bộ tiền xử lý + mô hình; pipeline tự động chỉ fit trên phần train trong mỗi fold. - Với dữ liệu thời gian, tách theo thời gian (train quá khứ, test tương lai), không tách ngẫu nhiên.
- Soi kỹ từng đặc trưng và tự hỏi: "Thông tin này có thực sự tồn tại tại thời điểm ra quyết định không?"
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
pipe = Pipeline([
("scaler", StandardScaler()),
("model", LogisticRegression()),
])
pipe.fit(X_train, y_train) # scaler chỉ fit trên train, không rò rỉ
Train / validation / test và cross-validation
Để biết mô hình thực sự tốt đến đâu, ta phải đánh giá nó trên dữ liệu nó chưa từng thấy.
- Train (huấn luyện): mô hình học từ đây.
- Validation (kiểm định): dùng để chỉnh siêu tham số, chọn mô hình.
- Test (kiểm tra): chỉ chạm vào MỘT LẦN ở cuối cùng, để ước lượng hiệu năng thật. Nếu bạn chỉnh mô hình dựa trên test, test sẽ mất tính khách quan.
Tỷ lệ phổ biến: 60/20/20 hoặc 70/15/15.
Cross-validation (kiểm định chéo)
Khi dữ liệu ít, một lần chia train/val có thể cho kết quả may rủi. K-fold cross-validation chia dữ liệu thành K phần; lần lượt lấy mỗi phần làm validation và K−1 phần còn lại làm train, rồi lấy trung bình K kết quả. Cho ước lượng ổn định hơn và tận dụng tối đa dữ liệu.
Với dữ liệu mất cân bằng (tín dụng thường có rất ít ca vỡ nợ), dùng stratified K-fold để giữ tỷ lệ lớp giống nhau trong mỗi fold.
Tóm tắt
- Chất lượng dữ liệu quyết định chất lượng mô hình nhiều hơn việc chọn thuật toán; phần lớn công sức nằm ở chuẩn bị dữ liệu.
- Hiểu đúng loại dữ liệu (số, hạng mục, văn bản, thời gian) để xử lý đúng cách.
- Làm sạch gồm xử lý giá trị thiếu (xoá/điền + cờ thiếu), ngoại lai (cắt ngưỡng/biến đổi), và trùng lặp theo khoá nghiệp vụ.
- Mã hoá hạng mục: one-hot (an toàn), label (cho ordinal/cây), target (mạnh nhưng dễ rò rỉ).
- Scaling cần cho mô hình dựa trên khoảng cách/gradient, không cần cho mô hình cây.
- Feature engineering (tỉ lệ DTI, đặc trưng thời gian, binning, tương tác) là nơi nghiệp vụ tạo giá trị lớn nhất.
- Data leakage là cái bẫy chí mạng — luôn tách dữ liệu trước rồi mới fit tiền xử lý; dùng Pipeline để tự động hoá an toàn.
Tự kiểm tra
- Vì sao phải
fitscaler chỉ trên tập train mà không phải trên toàn bộ dữ liệu? Điều gì sẽ rò rỉ nếu làm sai? - Khi nào nên dùng one-hot encoding, khi nào nên dùng target encoding, và rủi ro của target encoding là gì?
- Nêu một ví dụ target leakage trong bài toán tín dụng và giải thích vì sao nó khiến điểm đánh giá ảo cao.
- Mô hình random forest có cần standardization không? Vì sao?
- Phân biệt giảm chiều bằng PCA và chọn đặc trưng; vì sao tín dụng thường ưu tiên cái sau?
- Stratified K-fold khác K-fold thường ở điểm nào, và vì sao nó quan trọng với dữ liệu mất cân bằng?
Use case thực tế
Bối cảnh (minh hoạ): Khối Quản lý rủi ro NCB xây mô hình chấm điểm tín dụng cho khách hàng vay tiêu dùng. Tập dữ liệu ban đầu gồm khoảng 120.000 hồ sơ với 45 trường: thu nhập khai báo, dư nợ, số lần trễ hạn 12 tháng, nghề nghiệp, tỉnh thành, ngày mở tài khoản CASA... (các con số dưới đây là ước lượng để minh hoạ quy trình).
Khi kiểm tra chất lượng, đội gặp đúng những cái bẫy trong bài:
- Giá trị thiếu có ý nghĩa: khoảng 18% hồ sơ không có
thu_nhập(khách không cung cấp sao kê lương). Thay vì chỉ điền median, đội tạo thêm cờincome_is_missing— và phát hiện nhóm thiếu thu nhập có tỷ lệ vỡ nợ cao hơn rõ rệt, đúng như trực giác nghiệp vụ. - Ngoại lai do lỗi nhập liệu: vài hồ sơ khai thu nhập 5–10 tỷ/tháng (nhầm đơn vị đồng ↔ nghìn đồng). Đội dùng quy tắc IQR để đánh dấu, rà tay, rồi cắt ngưỡng (winsorizing) thay vì xoá.
- Target leakage suýt lọt lưới: cột
số_tiền_thu_hồi_sau_xử_lýban đầu nằm trong tập đặc trưng. Cột này chỉ có SAU khi khoản vay đã quá hạn, nên phải loại bỏ trước khi huấn luyện. - Tách theo thời gian: vì hành vi trả nợ thay đổi theo chu kỳ kinh tế, đội tách train = hồ sơ giải ngân các năm trước, test = năm gần nhất, thay vì tách ngẫu nhiên.
Đặc trưng có sức phân biệt mạnh nhất cuối cùng lại là một tỉ lệ tự tạo — DTI (dư nợ / thu nhập) — chứ không phải biến thô nào, đúng với thông điệp "feature engineering là nơi nghiệp vụ tạo giá trị".
Ghi nhớ
- Phần lớn công sức của dự án ML nằm ở chuẩn bị dữ liệu, không phải chọn thuật toán — "garbage in, garbage out".
- Xác định đúng loại dữ liệu (số liên tục/rời rạc, hạng mục danh định/thứ bậc, văn bản, thời gian) trước khi xử lý; mã số cho tỉnh thành không phải là biến số.
- Với giá trị thiếu, hãy cân nhắc tạo cờ
is_missingtrước khi điền — bản thân việc thiếu có thể mang thông tin. - Không xoá ngoại lai một cách máy móc; phân biệt lỗi nhập liệu (xoá/sửa) với giá trị cực đoan thật (cắt ngưỡng, biến đổi log).
- Chọn cách mã hoá theo bản chất biến: one-hot (an toàn, tránh thứ tự giả), label (ordinal & cây), target (mạnh nhưng dễ rò rỉ).
- Scaling cần cho mô hình dựa trên khoảng cách/gradient (SVM, KNN, PCA, mạng nơ-ron); không cần cho mô hình cây.
- Data leakage là bẫy chí mạng: luôn tách dữ liệu TRƯỚC rồi mới fit tiền xử lý chỉ trên train; dùng
Pipelinevà tách theo thời gian khi phù hợp. - Trong tín dụng cần tính diễn giải, thường ưu tiên chọn đặc trưng (feature selection) hơn PCA.
Nguồn tham khảo
- scikit-learn User Guide — Preprocessing data
- scikit-learn User Guide — Cross-validation: evaluating estimator performance
- scikit-learn User Guide — Imputation of missing values
- "Feature Engineering for Machine Learning" — Alice Zheng & Amanda Casari (O'Reilly)
- "Feature Engineering and Selection: A Practical Approach for Predictive Models" — Max Kuhn & Kjell Johnson
- Kaggle — Data Leakage (Machine Learning course, mục về train-test contamination và target leakage)
Đọc tiếp
Bài viết liên quan
Đặt nền cho chuỗi AI: phân biệt ba vòng tròn lồng nhau AI ⊃ ML ⊃ DL và khác biệt bản chất giữa lập trình truyền thống với học từ dữ liệu. Giới thiệu ba kiểu học máy (supervised, unsupervised, reinforcement), phân loại descriptive/predictive/prescriptive, quy trình ML end-to-end, chia train/validation/test, overfitting/underfitting và các thuật ngữ nền tảng, gắn với ứng dụng ngân hàng NCB.
Harness — lớp scaffolding quanh model (vòng lặp, tool, context, memory, verify, sub-agent) — mới là thứ quyết định agent chạy được hay chỉ là demo. Bài này mổ xẻ giải phẫu một harness, 7 kỹ năng cốt lõi khi xây agent, single vs multi-agent (kèm số liệu hiệu quả/chi phí), các repo nên dùng, và một quickstart Python dựng-là-chạy cho bối cảnh ngân hàng.
Hiểu LLM từ gốc: bản chất dự đoán token, ba giai đoạn huấn luyện (pretraining, fine-tuning, RLHF), token, context window và các tham số sinh (temperature, top-p). Nắm hiện tượng hallucination và kỹ thuật prompt engineering (vai trò, few-shot, chain-of-thought, ràng buộc đầu ra), kèm ví dụ gọi API model Claude mới nhất với adaptive thinking.
Từ nơ-ron nhân tạo, mạng nhiều lớp, hàm kích hoạt phi tuyến đến lan truyền xuôi/ngược, gradient descent, chống overfitting, CNN cho ảnh và RNN/LSTM cho chuỗi. Giải thích vì sao cần GPU, vai trò PyTorch/TensorFlow và khi nào nên dùng deep learning thay cho ML cổ điển.
Cảm nhận của bạn
Bình luận
Chưa có bình luận. Hãy là người đầu tiên chia sẻ!