Sau khi thiết lập kỷ luật chia tách dữ liệu (Train/Test Split) ở mục trước, mục tiêu tối thượng của bất kỳ mô hình Học máy nào cũng là đạt được khả năng tổng quát hóa (Generalization) – tức là đưa ra dự đoán chính xác trên những dữ liệu mới, dữ liệu thực tế trong tương lai chứ không phải chỉ trên dữ liệu đã dùng để huấn luyện. Để làm được điều này, nhà phân tích phải chinh phục được thử thách khó nhằn nhất của khoa học dữ liệu: Sự đánh đổi giữa Độ chệch (Bias) và Phương sai (Variance).
Mọi sai số dự báo của một thuật toán Học máy đều bắt nguồn từ hai thành phần cốt lõi này:
Bias (Độ chệch): Là mức độ sai lệch xảy ra do mô hình đưa ra những giả định quá đơn giản về một hiện tượng kinh tế phức tạp. Một mô hình có Bias cao thường quá "cứng nhắc" và không thể nắm bắt được quy luật thực sự của dữ liệu.
Variance (Phương sai): Là sự nhạy cảm quá mức của mô hình trước các thay đổi nhỏ (nhiễu - noise) của dữ liệu huấn luyện, khiến mô hình thiếu đi sự ổn định.
Sự mất cân bằng giữa Bias và Variance sẽ đẩy mô hình vào một trong hai trạng thái nguy hiểm sau:
Underfitting (Học chưa tới / Kém khớp): Xảy ra khi mô hình có High Bias, Low Variance. Mô hình quá đơn giản (ví dụ: dùng một đường thẳng để dự báo giá nhà vốn dĩ biến động theo đường cong). Hậu quả là sai số rất cao trên cả tập Train lẫn tập Test.
Overfitting (Học vẹt / Quá khớp): Xảy ra khi mô hình có Low Bias, High Variance,. Mô hình quá phức tạp, nó học "thuộc lòng" cả những điểm nhiễu (noise) và ngoại lệ của tập huấn luyện thay vì "hiểu" quy luật ẩn sau dữ liệu,. Giống như một sinh viên học thuộc lòng đáp án đề thi mẫu nhưng lại thi rớt thảm hại khi gặp đề thi thực tế với các số liệu bị thay đổi đôi chút. Biểu hiện đặc trưng của Overfitting là sai số cực thấp trên tập Train nhưng lại cao vọt trên tập Test.
Trong thiết kế thuật toán, bạn không thể đồng thời giảm cả Bias và Variance. Khi bạn tăng cường độ phức tạp của mô hình, Bias sẽ giảm xuống nhưng Variance sẽ bị đẩy lên cao.
Nhiệm vụ của kỹ sư dữ liệu là đi tìm "Điểm cân bằng" (Good fit) – nằm ở giữa hai thái cực này. Đó là một mô hình đủ phức tạp để nắm bắt pattern thực sự nhưng không phức tạp đến mức học thuộc nhiễu, giúp tổng sai số trên tập Test đạt giá trị nhỏ nhất,.
Để chứng minh trực quan hiện tượng này, chúng ta sẽ sử dụng thuật toán Cây quyết định (Decision Tree). Trong Cây quyết định, siêu tham số max_depth (độ sâu tối đa của cây) là yếu tố quyết định độ phức tạp,. Nếu ta để cây phát triển tự do không giới hạn, nó sẽ dẫn đến Overfitting với độ chính xác trên tập Train đạt 100% nhưng thất bại trên tập Test.
Đoạn mã dưới đây sử dụng numpy tự sinh ra một tập dữ liệu hình sin có chứa nhiễu (noise) và ép 3 mô hình Cây quyết định học với 3 mức độ phức tạp khác nhau. Bạn có thể copy và chạy trực tiếp trên Google Colab:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error
# =====================================================================
# 1. TỰ TẠO DỮ LIỆU MÔ PHỎNG (Hàm Sin có nhiễu ngẫu nhiên)
# =====================================================================
np.random.seed(42)
# Tạo 80 điểm dữ liệu X ngẫu nhiên từ 0 đến 5
X_train = np.sort(5 * np.random.rand(80, 1), axis=0)
# Biến mục tiêu y là đường cong hình sin, cộng thêm nhiễu (noise)
y_train = np.sin(X_train).ravel()
y_train[::5] += 3 * (0.5 - np.random.rand(16)) # Thêm nhiễu ngẫu nhiên
# Tạo tập Test độc lập để kiểm tra (dữ liệu mượt, không nhiễu)
X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis]
y_test_true = np.sin(X_test).ravel()
# =====================================================================
# 2. HUẤN LUYỆN 3 MÔ HÌNH VỚI ĐỘ PHỨC TẠP KHÁC NHAU
# =====================================================================
# Mô hình 1: Quá đơn giản (High Bias -> Underfitting)
regr_under = DecisionTreeRegressor(max_depth=1)
# Mô hình 2: Phù hợp (Cân bằng Bias-Variance -> Good Fit)
regr_good = DecisionTreeRegressor(max_depth=3, random_state=42)
# Mô hình 3: Quá phức tạp (High Variance -> Overfitting)
regr_over = DecisionTreeRegressor(max_depth=15, random_state=42)
regr_under.fit(X_train, y_train)
regr_good.fit(X_train, y_train)
regr_over.fit(X_train, y_train)
# =====================================================================
# 3. DỰ ĐOÁN VÀ TRỰC QUAN HÓA KẾT QUẢ
# =====================================================================
y_pred_under = regr_under.predict(X_test)
y_pred_good = regr_good.predict(X_test)
y_pred_over = regr_over.predict(X_test)
plt.figure(figsize=(18, 5))
# Biểu đồ 1: Underfitting
plt.subplot(1, 3, 1)
plt.scatter(X_train, y_train, s=20, edgecolor="black", c="darkorange", label="Dữ liệu Train (có nhiễu)")
plt.plot(X_test, y_pred_under, color="blue", linewidth=2, label="Đường dự báo")
plt.title(f"1. Underfitting (max_depth=1)\nMSE Test: {mean_squared_error(y_test_true, y_pred_under):.3f}")
plt.legend()
# Biểu đồ 2: Good Fit (Sweet Spot)
plt.subplot(1, 3, 2)
plt.scatter(X_train, y_train, s=20, edgecolor="black", c="darkorange")
plt.plot(X_test, y_pred_good, color="green", linewidth=2)
plt.title(f"2. Good Fit (max_depth=3)\nMSE Test: {mean_squared_error(y_test_true, y_pred_good):.3f}")
# Biểu đồ 3: Overfitting
plt.subplot(1, 3, 3)
plt.scatter(X_train, y_train, s=20, edgecolor="black", c="darkorange")
plt.plot(X_test, y_pred_over, color="red", linewidth=2)
plt.title(f"3. Overfitting (max_depth=15)\nMSE Test: {mean_squared_error(y_test_true, y_pred_over):.3f}")
plt.tight_layout()
plt.show()
💡 Phân tích kết quả toán học từ biểu đồ:
Biểu đồ 1 (Underfitting): Với max_depth=1, mô hình chỉ vẽ được các đường gãy khúc ngang đơn điệu. Nó quá cứng nhắc, hoàn toàn thất bại trong việc nắm bắt đường cong của dữ liệu. Sai số (MSE) trên tập Test rất cao.
Biểu đồ 3 (Overfitting): Khi để cây phát triển quá sâu max_depth=15, đường dự báo màu đỏ uốn lượn đi qua chính xác tuyệt đối từng chấm cam (học thuộc lòng cả những điểm nhiễu lồi lõm). Sai số trên tập Train gần như bằng 0, nhưng sai số trên tập Test (dữ liệu mượt thực tế) lại bị đẩy lên cao do mô hình dao động quá gắt.
Biểu đồ 2 (Good Fit): Với độ sâu vừa phải max_depth=3, đường màu xanh lá nắm bắt được xu hướng hình sin tổng thể, khôn ngoan phớt lờ đi các điểm nhiễu. Đây chính là mô hình tối ưu nhất với MSE Test nhỏ nhất.
Sự đánh đổi Bias - Variance phản ánh trực tiếp phong cách ra quyết định của các nhà quản trị:
Hiện tượng Underfitting giống như một Giám đốc điều hành quá bảo thủ (High Bias), áp dụng một quy tắc cứng nhắc duy nhất cho mọi biến động phức tạp của thị trường. Hậu quả là doanh nghiệp mất đi tính thích ứng.
Hiện tượng Overfitting giống như một Giám đốc quá nhạy cảm (High Variance), liên tục thay đổi toàn bộ chiến lược công ty chỉ vì một vài chỉ số nhiễu động ngẫu nhiên của tuần trước. Những chiến lược "học vẹt" quá khứ này sẽ sụp đổ khi bối cảnh vĩ mô thay đổi.
Việc tìm ra Good Fit chính là xây dựng một văn hóa ra quyết định dựa trên dữ liệu: Đủ thông minh để nhận diện xu hướng cốt lõi của thị trường, nhưng đủ tỉnh táo và bản lĩnh để bỏ qua những nhiễu loạn ngẫu nhiên mang tính thời vụ.