AI 2 — Dữ liệu & Feature Engineering

13 thg 7, 2026 12 lượt xem
#ai
#feature-engineering
#data-preprocessing

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

  1. 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ọi fit_transform trên train nhưng chỉ transform trê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.

  2. Đặ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.

  3. Target encoding tính trên cả tập (đã nói ở trên).

  4. 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 Pipeline củ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

  1. Vì sao phải fit scaler 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?
  2. 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ì?
  3. 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.
  4. Mô hình random forest có cần standardization không? Vì sao?
  5. 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?
  6. 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?

Đọc tiếp

AI 3 — ML cổ điển

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 14

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 11

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

13 thg 7, 2026 10

Nơ-ron nhân tạo, lan truyền xuôi/ngược, hàm kích hoạt, CNN & RNN, và khi nào dùng deep learning.

13 thg 7, 2026 9