Tiền Xử Lý, Regularization & Chọn Đặc Trưng
Xử lý dữ liệu thiếu, chuẩn hóa, mã hóa biến phân loại; bias-variance; Ridge/Lasso/Elastic Net; và ba nhóm phương pháp chọn đặc trưng.
Learning Objectives
- ✓Xử lý dữ liệu thiếu, chuẩn hóa và mã hóa biến phân loại
- ✓Hiểu overfitting qua đánh đổi bias-variance
- ✓Áp dụng Regularization: Ridge (L2), Lasso (L1), Elastic Net
- ✓Chọn đặc trưng bằng Filter, Wrapper và Embedded
- ✓Dùng cross-validation để chọn cường độ regularization
Tiền Xử Lý Dữ Liệu
"Garbage in, garbage out" — chất lượng dữ liệu quyết định chất lượng mô hình. Ba cơ chế thiếu dữ liệu: MCAR (thiếu ngẫu nhiên hoàn toàn), MAR (phụ thuộc biến khác đã quan sát), MNAR (phụ thuộc chính giá trị bị thiếu — "bị thiếu" mang thông tin). Chiến lược: xóa (nếu thiếu quá nhiều), điền khuyết (mean/median/mode, KNN, MICE), hoặc thêm cờ is_missing khi MNAR. Sau đó chuẩn hóa và mã hóa (xem hai section tiếp theo).
from sklearn.impute import SimpleImputer, KNNImputer
# Cột số → điền trung vị
num = SimpleImputer(strategy="median")
X_num = num.fit_transform(X_num)
# Cột phân loại → giá trị hay gặp nhất
cat = SimpleImputer(strategy="most_frequent")
# Hoặc KNN theo mẫu lân cận
X = KNNImputer(n_neighbors=5).fit_transform(X)
# Cờ thiếu (MNAR): giữ tín hiệu "bị thiếu"
df["age_NA"] = df["age"].isnull().astype(int)Chuẩn Hóa & Mã Hóa Biến Phân Loại
Đặc trưng khác thang đo (Tuổi 0–100 vs Thu nhập hàng triệu) khiến biến lớn lấn át khi tính khoảng cách/gradient — ảnh hưởng kNN, SVM, Gradient Descent, Regularization, PCA (cây quyết định/Random Forest thì KHÔNG cần). Ba cách chuẩn hóa: Standardization (mean 0, std 1 — mặc định), Min-Max (ép về [0,1] — cho ảnh/NN), Robust (theo median & IQR — bền với outlier). Mã hóa biến phân loại: One-Hot (biến danh nghĩa), Label/Ordinal (biến có thứ tự), Target/Mean encoding (nhiều hạng mục — nhưng dễ rò rỉ dữ liệu, cần cross-validation).
from sklearn.preprocessing import StandardScaler, OneHotEncoder
# Standardization: mean 0, std 1
X_scaled = StandardScaler().fit_transform(X_num)
# One-Hot: Màu {Đỏ, Xanh, Vàng} → is_Đỏ, is_Xanh, is_Vàng
ohe = OneHotEncoder(handle_unknown='ignore')
X_cat = ohe.fit_transform(X_categorical)Overfitting & Đánh Đổi Bias-Variance
Overfitting: mô hình quá phức tạp khớp train gần như hoàn hảo (J(θ)≈0) nhưng tổng quát kém. Bias (độ chệch) đo chênh giữa kỳ vọng học được và sự thật — GIẢM khi mô hình phức tạp hơn; Variance (phương sai) đo độ nhạy với tập dữ liệu cụ thể — TĂNG khi phức tạp hơn. Underfitting = bias cao; overfitting = variance cao. Khi tăng độ phức tạp, Bias² giảm nhưng Variance tăng → tổng lỗi có dạng chữ U, tồn tại độ phức tạp "vừa phải" tối ưu. Có hai hướng chống overfitting: Regularization và Chọn đặc trưng.
Hướng 1 — Regularization (Ridge, Lasso, Elastic Net)
Regularization giữ TẤT CẢ đặc trưng nhưng thu nhỏ độ lớn hệ số. Ridge (L2) thêm phạt λ·Σθⱼ² — co nhỏ hệ số (không về 0), θ₀ không bị phạt; bước cập nhật có thừa số weight decay (1−αλ/m) < 1. Lasso (L1) phạt λ·Σ|θⱼ| — đẩy nhiều hệ số về ĐÚNG 0 nên tự động chọn biến. Elastic Net kết hợp cả hai: L1 cho tính thưa + L2 cho tính ổn định (xử lý nhóm biến tương quan), với α điều phối tỷ trọng. Chọn λ bằng cross-validation (RidgeCV, LassoCV) để cân bằng bias–variance: λ quá lớn → underfitting, λ quá nhỏ → vẫn overfitting.
from sklearn.linear_model import RidgeCV, LassoCV, ElasticNet
ridge = RidgeCV(alphas=[0.01, 0.1, 1, 10, 100], cv=5).fit(X_train, y_train)
lasso = LassoCV(alphas=[0.001, 0.01, 0.1, 1], cv=5).fit(X_train, y_train)
enet = ElasticNet(alpha=0.1, l1_ratio=0.5).fit(X_train, y_train)
print("Ridge alpha:", ridge.alpha_)
print("Lasso alpha:", lasso.alpha_,
"| số đặc trưng còn lại:", (lasso.coef_ != 0).sum())Hướng 2 — Chọn Đặc Trưng
Ba nhóm phương pháp: (1) Filter — đánh giá đặc trưng độc lập với mô hình bằng thống kê (nhanh, rẻ): Variance Threshold (loại đặc trưng gần như hằng), High Correlation (Pearson/Chi-square/ANOVA F-test), Mutual Information (bắt được cả quan hệ phi tuyến, ví dụ y=x² có Pearson≈0 nhưng MI>0). (2) Wrapper — dùng hiệu năng mô hình để chọn (chính xác nhưng tốn thời gian): Forward/Backward Selection, RFE/RFECV (tự chọn số đặc trưng bằng CV), Boruta, mRMR. (3) Embedded — chọn ngay trong huấn luyện (cân bằng): Lasso (L1) và Random Forest importance.
from sklearn.feature_selection import SelectKBest, mutual_info_classif, RFE
# Filter — Mutual Information (bắt quan hệ phi tuyến)
X_mi = SelectKBest(mutual_info_classif, k=20).fit_transform(X, y)
# Wrapper — Recursive Feature Elimination
sel = RFE(estimator, n_features_to_select=5).fit(X, y)
print(sel.support_) # mặt nạ giữ/loại
print(sel.ranking_) # 1 = được chọn