Hồi Quy Đa Biến Nâng Cao Và Các Kỹ Thuật Regularization (Ridge, Lasso) Bằng Python

lúc 15:19 2 tháng 9, 2026
9 views

Trong khoa học dữ liệu và học máy, hồi quy đa biến (Multivariate Linear Regression) là công cụ nền tảng để dự báo các biến liên tục. Tuy nhiên, khi hệ thống dữ liệu phình to với hàng trăm hoặc hàng nghìn biến đặc trưng (features), mô hình thông thường dễ mắc phải hiện tượng quá khớp (overfitting) và đa cộng tuyến (multicollinearity). Các kỹ thuật chuẩn hóa regularization bao gồm Ridge (L2) và Lasso (L1) trong Python chính là "vũ khí" tối thượng giúp kiểm soát độ phức tạp và nâng cao độ chính xác dự báo.

⚠️ 1. Thách Thức Của Hồi Quy Đa Biến Truyền Thống Và Hiện Tượng Overfitting

Phương pháp Bình phương tối thiểu thông thường (Ordinary Least Squares - OLS) tìm cách tối ưu hóa hàm chi phí bằng cách giảm thiểu tổng bình phương phần dư. Mặc dù hiệu quả trên tập dữ liệu huấn luyện, OLS bộc lộ điểm yếu lớn khi các biến đầu vào có sự tương quan mạnh mẽ lẫn nhau (đa cộng tuyến).

Hậu quả là hệ số góc (coefficients) của mô hình trở nên quá lớn, nhạy cảm cực độ với dữ liệu nhiễu (noise), dẫn đến việc mô hình dự báo cực kỳ tệ trên dữ liệu thực tế chưa từng thấy (test set). Để giải quyết triệt để vấn đề này, các nhà phát triển áp dụng phương pháp Regularization bằng cách cộng thêm một hệ số phạt (penalty term) vào hàm mất mát.

🛠️ 2. Phân Biệt Kỹ Thuật Ridge (L2) Và Lasso (L1)

Cả hai kỹ thuật đều bổ sung hình phạt vào hàm tối ưu của OLS, nhưng cơ chế hoạt động mang lại ý nghĩa toán học và ứng dụng thực tế khác nhau:

  • Ridge Regression (Hình phạt L2): Thêm một khoản phạt tỷ lệ thuận với bình phương độ lớn của các hệ số góc (tổng Σ β²). Ridge giúp thu nhỏ các hệ số về gần số 0 nhưng hiếm khi đưa hẳn về giá trị 0 tuyệt đối. Kỹ thuật này giữ lại toàn bộ các biến đặc trưng trong mô hình, rất phù hợp khi hầu hết các biến đều đóng góp một phần ý nghĩa nhất định.
  • Lasso Regression (Hình phạt L1): Thêm khoản phạt tỷ lệ thuận với giá trị tuyệt đối của các hệ số góc (tổng Σ |β|). Điểm đặc biệt của Lasso là nó có khả năng triệt tiêu hoàn toàn các hệ số của biến ít quan trọng về đúng bằng 0. Nhờ đó, Lasso đóng vai trò như một công cụ tự động lựa chọn tính năng (Automatic Feature Selection).

💻 3. Code Demo Python: Tối Ưu Mô Hình Với Ridge Và Lasso

Đoạn mã nguồn Python dưới đây sử dụng thư viện scikit-learn để xây dựng, huấn luyện và so sánh hiệu suất giữa mô hình Linear Regression thuần túy, Ridge và Lasso trên tập dữ liệu giả lập:

Code
import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import LinearRegression, Ridge, Lasso
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

def evaluate_regularization_models():
    """
    Xây dựng và so sánh hiệu suất giữa Linear Regression, Ridge và Lasso.
    """
    # 1. Tạo tập dữ liệu giả lập nhiều biến đặc trưng để kiểm thử overfitting
    feature_matrix, target_vector = make_regression(
        n_samples=500, 
        n_features=100, 
        n_informative=15, 
        noise=15.0, 
        random_state=42
    )
    
    # Chia dữ liệu thành tập huấn luyện (Train) và kiểm thử (Test)
    X_train, X_test, y_train, y_test = train_test_split(
        feature_matrix, target_vector, test_size=0.25, random_state=42
    )
    
    # 2. Khởi tạo các mô hình hồi quy
    ols_model = LinearRegression()
    ridge_model = Ridge(alpha=10.0)
    lasso_model = Lasso(alpha=1.0)
    
    # 3. Huấn luyện mô hình trên tập dữ liệu Train
    ols_model.fit(X_train, y_train)
    ridge_model.fit(X_train, y_train)
    lasso_model.fit(X_train, y_train)
    
    # 4. Dự báo trên tập kiểm thử Test
    ols_predictions = ols_model.predict(X_test)
    ridge_predictions = ridge_model.predict(X_test)
    lasso_predictions = lasso_model.predict(X_test)
    
    # 5. Đánh giá sai số Mean Squared Error (MSE)
    ols_mse = mean_squared_error(y_test, ols_predictions)
    ridge_mse = mean_squared_error(y_test, ridge_predictions)
    lasso_mse = mean_squared_error(y_test, lasso_predictions)
    
    # Thống kê số lượng biến bị loại bỏ bởi Lasso (hệ số bằng 0)
    number_of_zero_coefficients = np.sum(lasso_model.coef_ == 0)
    
    print("--- KẾT QUẢ ĐÁNH GIÁ MÔ HÌNH ---")
    print(f"MSE của OLS Linear Regression: {ols_mse:.2f}")
    print(f"MSE của Ridge Regression (L2): {ridge_mse:.2f}")
    print(f"MSE của Lasso Regression (L1): {lasso_mse:.2f}")
    print(f"Số lượng biến đặc trưng bị Lasso loại bỏ hoàn toàn: {number_of_zero_coefficients}/100")

# Chạy hàm đánh giá thực tế
evaluate_regularization_models()

🎯 4. Lựa Chọn Nào Cho Bài Toán Thực Tế Của Doanh Nghiệp?

Việc quyết định sử dụng Ridge hay Lasso phụ thuộc vào bản chất bài toán và cấu trúc dữ liệu của bạn:

  • Hãy ưu tiên Ridge khi bạn nghi ngờ rằng tất cả các biến đặc trưng đầu vào đều có tác động nhất định đến kết quả đầu ra và bạn cần sự ổn định cao trước hiện tượng đa cộng tuyến.
  • Hãy ưu tiên Lasso khi tập dữ liệu của bạn có hàng nghìn biến nhưng phần lớn trong số đó là nhiễu hoặc không mang lại giá trị. Lasso sẽ giúp cô đọng mô hình, giảm thiểu chi phí tính toán và làm cho hệ thống dễ giải thích hơn.

Kết hợp thành thạo các kỹ thuật Regularization trong Python không chỉ giúp bạn tối ưu hóa các mô hình dự báo phức tạp mà còn là bước đệm vững chắc để tiến sâu hơn vào lĩnh vực Trí tuệ Nhân tạo và Học máy chuyên sâu.

📝 5. Bài tập thực hành Regularization với Python

Để nắm vững các kỹ thuật chống hiện tượng quá khớp (overfitting) và tối ưu hóa mô hình hồi quy đa biến, bạn có thể tự tay thực hiện 2 bài tập lập trình Python dưới đây.

Bài tập 1: Tối ưu hóa hệ số phạt Alpha bằng Cross-Validation (RidgeCV)

Việc lựa chọn giá trị siêu tham số alpha (cường độ hình phạt) ảnh hưởng trực tiếp đến độ chính xác của mô hình Ridge. Thay vì thử nghiệm thủ công, bạn có thể sử dụng RidgeCV để tự động tìm kiếm giá trị alpha tốt nhất thông qua phương pháp kiểm định chéo (Cross-Validation). Hãy viết hàm Python thực hiện việc này:

Code
import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import RidgeCV
from sklearn.model_selection import train_test_split

def optimize_ridge_alpha():
    """
    Sử dụng RidgeCV để tìm kiếm siêu tham số alpha tối ưu cho mô hình Ridge.
    """
    # 1. Tạo tập dữ liệu giả lập
    feature_matrix, target_vector = make_regression(
        n_samples=400, 
        n_features=50, 
        noise=10.0, 
        random_state=42
    )
    
    # Chia dữ liệu thành tập huấn luyện và kiểm thử
    X_train, X_test, y_train, y_test = train_test_split(
        feature_matrix, target_vector, test_size=0.2, random_state=42
    )
    
    # 2. Định nghĩa danh sách các giá trị alpha cần kiểm tra
    alpha_candidates = np.logspace(-3, 4, 200)
    
    # Khởi tạo mô hình RidgeCV với 5-fold Cross-Validation
    ridge_cv_model = RidgeCV(alphas=alpha_candidates, cv=5, scoring='neg_mean_squared_error')
    
    # 3. Huấn luyện mô hình để tìm ra alpha tối ưu
    ridge_cv_model.fit(X_train, y_train)
    
    # 4. In kết quả tìm kiếm
    optimal_alpha = ridge_cv_model.alpha_
    model_score = ridge_cv_model.score(X_test, y_test)
    
    print(f"--- KẾT QUẢ TỐI ƯU RIDGE ALPHA ---")
    print(f"Giá trị Alpha tối ưu được tìm thấy: {optimal_alpha:.4f}")
    print(f"Độ chính xác (R-squared) trên tập Test: {model_score:.4f}")
    
    return optimal_alpha

# Chạy hàm tối ưu alpha thực tế
optimize_ridge_alpha()

Bài tập 2: Ứng dụng mô hình ElasticNet kết hợp L1 và L2 Regularization

Khi tập dữ liệu có các nhóm biến đặc trưng cộng tuyến mạnh, Lasso có xu hướng chọn ngẫu nhiên một biến trong nhóm và loại bỏ các biến còn lại, trong khi Ridge chỉ thu nhỏ hệ số. ElasticNet kết hợp đồng thời cả hai hình phạt L1 (Lasso) và L2 (Ridge) để giải quyết triệt để điểm yếu này. Hãy viết hàm Python mô phỏng:

Code
import numpy as np
from sklearn.datasets import make_regression
from sklearn.linear_model import ElasticNet
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split

def evaluate_elastic_net():
    """
    Xây dựng và đánh giá hiệu suất mô hình ElasticNet kết hợp L1 và L2 regularization.
    """
    # 1. Tạo tập dữ liệu giả lập đa biến
    feature_matrix, target_vector = make_regression(
        n_samples=500, 
        n_features=80, 
        n_informative=20, 
        noise=12.0, 
        random_state=42
    )
    
    # Chia tập dữ liệu huấn luyện và kiểm thử
    X_train, X_test, y_train, y_test = train_test_split(
        feature_matrix, target_vector, test_size=0.25, random_state=42
    )
    
    # 2. Khởi tạo mô hình ElasticNet với alpha và tỷ lệ pha trộn l1_ratio (0.5 nghĩa là chia đều 50% L1 và 50% L2)
    elastic_net_model = ElasticNet(alpha=1.0, l1_ratio=0.5, random_state=42)
    
    # 3. Huấn luyện mô hình
    elastic_net_model.fit(X_train, y_train)
    
    # 4. Dự báo và đánh giá sai số MSE
    predictions = elastic_net_model.predict(X_test)
    model_mse = mean_squared_error(y_test, predictions)
    
    print(f"--- KẾT QUẢ ĐÁNH GIÁ ELASTICNET ---")
    print(f"MSE của ElasticNet Regression: {model_mse:.2f}")
    print(f"Số lượng hệ số trọng số khác 0: {np.sum(elastic_net_model.coef_ != 0)}/80")
    
    return model_mse

# Chạy hàm đánh giá ElasticNet thực tế
evaluate_elastic_net()

Bình luận

Đăng nhập để để lại bình luận.
Chưa có bình luận nào cho bài viết này.

Bài viết liên quan