1. Mô tả bài toán Trong lĩnh vực phân tích hành vi khách hàng, một câu hỏi cơ bản luôn được đặt ra là: "Thu nhập ảnh hưởng như thế nào đến mức chi tiêu của một cá nhân?". Để trả lời, chúng ta sử dụng mô hình Hồi quy tuyến tính đơn biến.
Bài toán này chỉ có một biến độc lập duy nhất (Thu nhập) để dự báo một biến phụ thuộc (Chi tiêu). Phương trình toán học của mô hình được biểu diễn dưới dạng đường thẳng cơ bản: Spending = beta_0 + beta_1 * Income + epsilon
Về mặt hình học, thuật toán sẽ cố gắng vẽ một đường thẳng (2D Line) đi xuyên qua đám mây dữ liệu sao cho tổng bình phương khoảng cách từ các điểm thực tế đến đường thẳng này là nhỏ nhất.
2. Mã nguồn Python (Chạy trực tiếp trên Google Colab) Đoạn code dưới đây sẽ tự sinh dữ liệu giả lập về Thu nhập và Chi tiêu, huấn luyện mô hình, in ra phương trình toán học và vẽ đường thẳng hồi quy trực quan:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
# =====================================================================
# BƯỚC 1: TỰ TẠO DỮ LIỆU MÔ PHỎNG (Mối quan hệ Thu nhập - Chi tiêu)
# =====================================================================
np.random.seed(42)
n_samples = 150
# X: Thu nhập hàng năm (Annual Income) dao động từ 20 đến 120 (Ngàn USD)
income = np.random.uniform(20, 120, n_samples)
# Y: Chi tiêu (Spending) = Mức chi tiêu cơ sở + (Hệ số * Thu nhập) + Nhiễu ngẫu nhiên
spending = 15 + 0.65 * income + np.random.normal(0, 8, n_samples)
df = pd.DataFrame({'Thu_nhap': income, 'Chi_tieu': spending})
# =====================================================================
# BƯỚC 2: CHIA TẬP DỮ LIỆU (80% Train / 20% Test)
# =====================================================================
# Reshape X thành mảng 2 chiều vì scikit-learn yêu cầu đầu vào X dạng ma trận
X = df[['Thu_nhap']]
y = df['Chi_tieu']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# =====================================================================
# BƯỚC 3: HUẤN LUYỆN MÔ HÌNH HỒI QUY TUYẾN TÍNH ĐƠN BIẾN
# =====================================================================
model = LinearRegression()
model.fit(X_train, y_train)
# =====================================================================
# BƯỚC 4: IN HỆ SỐ PHƯƠNG TRÌNH VÀ ĐÁNH GIÁ MÔ HÌNH
# =====================================================================
print("--- PHƯƠNG TRÌNH ĐƯỜNG THẲNG HỒI QUY ---")
print(f"Hệ số chặn (Beta_0) : {model.intercept_:.2f} Ngàn USD")
# Fix: Access the first element of model.coef_ which is a numpy array
print(f"Hệ số góc (Beta_1) : +{model.coef_[0]:.2f} (Tỷ lệ chi tiêu trên thu nhập)\n")
y_pred = model.predict(X_test)
print("--- ĐÁNH GIÁ HIỆU SUẤT ---")
print(f"MAE : Lệch trung bình {mean_absolute_error(y_test, y_pred):.2f} Ngàn USD")
print(f"RMSE : Lệch {np.sqrt(mean_squared_error(y_test, y_pred)):.2f} Ngàn USD")
print(f"R^2 : {r2_score(y_test, y_pred)*100:.2f}%")
# =====================================================================
# BƯỚC 5: TRỰC QUAN HÓA ĐƯỜNG HỒI QUY 2D
# =====================================================================
plt.figure(figsize=(9, 6))
# Vẽ các điểm dữ liệu thực tế trên tập Test
plt.scatter(X_test, y_test, color='blue', label='Dữ liệu thực tế', alpha=0.6)
# Vẽ đường thẳng hồi quy do mô hình học được
plt.plot(X_test, y_pred, color='red', linewidth=2, label='Đường thẳng hồi quy')
plt.title('Hồi quy đơn biến: Dự đoán Chi tiêu theo Thu nhập', fontsize=14)
plt.xlabel('Thu nhập hàng năm (Ngàn USD)', fontsize=12)
plt.ylabel('Mức chi tiêu (Ngàn USD)', fontsize=12)
plt.legend()
plt.grid(alpha=0.3)
plt.show()
3. Giải thích Code và Ý nghĩa Kinh tế
Giải thích luồng lập trình:
Định dạng đầu vào: Lưu ý ở Bước 2, X = df[['Thu_nhap']] (sử dụng hai dấu ngoặc vuông) để đảm bảo X là một ma trận 2 chiều (DataFrame) thay vì mảng 1 chiều (Series), đáp ứng đúng yêu cầu của hàm .fit() trong thư viện scikit-learn.
Huấn luyện: Hàm model.fit() thực thi phương pháp OLS, tự động xoay một đường thẳng trên đồ thị sao cho tổng bình phương khoảng cách từ các chấm xanh (dữ liệu khách hàng) đến đường thẳng đỏ đạt giá trị nhỏ nhất.
Vẽ đồ thị: Hàm plt.scatter() rải các điểm dữ liệu thực tế, trong khi plt.plot() vẽ một đường nét liền màu đỏ kết nối các giá trị mà mô hình dự báo.
💡 Insights và Ý nghĩa quản trị kinh doanh: Trong bài toán này, các hệ số toán học in ra mang đậm tính chất kinh tế học:
Hệ số chặn beta_0 (Intercept): Thể hiện mức chi tiêu tối thiểu (chi tiêu tự định) ngay cả khi thu nhập bằng 0.
Hệ số góc beta_1 (Khuynh hướng tiêu dùng cận biên - MPC): Nếu kết quả in ra beta_1 = 0.62, nhà quản lý có thể diễn giải ngay lập tức rằng: "Trung bình, cứ mỗi khi thu nhập của khách hàng tăng thêm 1.000 USD, họ sẽ dành ra 620 USD để chi tiêu mua sắm."
Chính sự đơn giản và khả năng minh bạch tuyệt đối này khiến Linear Regression đơn biến luôn là công cụ "phải có" trong các báo cáo kinh doanh, nơi việc giải thích tác động của một biến quan trọng hơn việc thiết lập một mô hình "hộp đen" quá phức tạp.
4. Giải thích Ý nghĩa các độ đo
Trong bài toán Hồi quy, mục tiêu là dự đoán một giá trị số thực. Do đó, các chỉ số đánh giá tập trung vào việc đo lường khoảng cách (sai số) giữa giá trị dự đoán (y^) và giá trị thực tế (y).
MAE (Mean Absolute Error - Sai số tuyệt đối trung bình): Đo lường trung bình độ lệch tuyệt đối giữa dự báo và thực tế. MAE rất dễ diễn giải vì nó có cùng đơn vị với biến mục tiêu (ví dụ: dự báo giá nhà lệch trung bình 200 triệu đồng) và ít bị ảnh hưởng bởi các điểm dữ liệu dị biệt (outliers). Giá trị càng nhỏ mô hình càng tốt
MSE (Mean Squared Error) và RMSE (Root Mean Squared Error): Thay vì lấy trị tuyệt đối, phương pháp này bình phương các sai số. Do đó, RMSE phạt rất nặng các sai số lớn. Trong kinh tế, nếu việc dự báo sai lệch một số tiền khổng lồ gây ra hậu quả tàn khốc, RMSE là thước đo nên được ưu tiên để "ép" mô hình giảm thiểu những cú lệch pha nghiêm trọng này. Giá trị càng nhỏ mô hình càng tốt.
R-squared (R^2) và Adjusted R^2: Hệ số R^2 (từ âm vô cực đến 1.0) đo lường tỷ lệ phần trăm biến động của biến mục tiêu được giải thích bởi các biến đầu vào. Tuy nhiên, R^2 có một nhược điểm là sẽ luôn tăng hoặc giữ nguyên nếu bạn nhét thêm các biến rác vào mô hình. Do đó, Adjusted R^2 (R-bình phương hiệu chỉnh) ra đời nhằm trừng phạt mô hình nếu nó sử dụng quá nhiều biến mà không mang lại giá trị giải thích thực sự. Giá trị càng gần 1 mô hình càng tốt.
Adjusted R^2 (R-bình phương hiệu chỉnh)
1. Mô tả bài toán Trong thực tế kinh tế lao động, thu nhập của một nhân sự hiếm khi chỉ phụ thuộc vào một yếu tố duy nhất. Để xấp xỉ thế giới thực tốt hơn, chúng ta mở rộng bài toán thành Hồi quy tuyến tính đa biến. Ý tưởng cốt lõi là giả định tồn tại một mối liên hệ tuyến tính đồng thời giữa nhiều biến độc lập đối với một biến mục tiêu duy nhất.
Trong ví dụ này, chúng ta sẽ dự báo Thu nhập (Income) dựa trên 2 đặc trưng đầu vào: Số năm kinh nghiệm (Experience) và Tuổi tác (Age),. Phương trình toán học của mô hình được biểu diễn như sau:
Income = beta_0 + beta_1 * Experience + beta_2 * Age + epsilon
Về mặt cấu trúc hình học, vì có 2 biến độc lập, mô hình không còn là một đường thẳng (2D Line) mà được nâng cấp thành một mặt phẳng hồi quy (Regression Plane) cắt qua không gian 3 chiều.
2. Mã nguồn Python (Chạy trực tiếp trên Google Colab) Đoạn code dưới đây tự động sinh dữ liệu ảo, huấn luyện thuật toán OLS, trích xuất các hệ số toán học và vẽ mặt phẳng 3D trực quan:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score
# =====================================================================
# BƯỚC 1: TỰ TẠO DỮ LIỆU MÔ PHỎNG (Mối quan hệ Tuổi - Kinh nghiệm - Thu nhập)
# =====================================================================
np.random.seed(42)
n_samples = 200
# X1: Số năm kinh nghiệm (từ 1 đến 20 năm)
experience = np.random.uniform(1, 20, n_samples)
# X2: Độ tuổi (Giả định nhân sự bắt đầu đi làm từ 22 tuổi, cộng thêm sai số)
age = experience + 22 + np.random.normal(0, 2, n_samples)
# Y: Thu nhập = Lương cơ bản + (Hệ số * Kinh nghiệm) + (Hệ số * Tuổi) + Nhiễu
income = 10 + 2.5 * experience + 0.5 * age + np.random.normal(0, 3, n_samples)
df = pd.DataFrame({'Kinh_nghiem': experience, 'Tuoi': age, 'Thu_nhap': income})
# =====================================================================
# BƯỚC 2: CHIA TẬP DỮ LIỆU (80% Train / 20% Test)
# =====================================================================
X = df[['Kinh_nghiem', 'Tuoi']]
y = df['Thu_nhap']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# =====================================================================
# BƯỚC 3: HUẤN LUYỆN MÔ HÌNH HỒI QUY TUYẾN TÍNH
# =====================================================================
model = LinearRegression()
model.fit(X_train, y_train)
# =====================================================================
# BƯỚC 4: IN HỆ SỐ PHƯƠNG TRÌNH VÀ ĐÁNH GIÁ MÔ HÌNH
# =====================================================================
print("--- CÁC THÔNG SỐ CỦA MẶT PHẲNG HỒI QUY ---")
print(f"Hệ số chặn (Beta_0) : {model.intercept_:.2f} triệu VNĐ")
# Fix: Access individual elements of model.coef_
print(f"Kinh nghiệm (Beta_1): +{model.coef_[0]:.2f} triệu VNĐ/năm")
print(f"Tuổi tác (Beta_2) : +{model.coef_[1]:.2f} triệu VNĐ/tuổi\n")
y_pred = model.predict(X_test)
print("--- ĐÁNH GIÁ HIỆU SUẤT ---")
print(f"MAE : Lệch {mean_absolute_error(y_test, y_pred):.2f} triệu VNĐ")
print(f"RMSE : Lệch {np.sqrt(mean_squared_error(y_test, y_pred)):.2f} triệu VNĐ")
print(f"R^2 : {r2_score(y_test, y_pred)*100:.2f}%")
# =====================================================================
# BƯỚC 5: TRỰC QUAN HÓA MẶT PHẲNG HỒI QUY 3D
# =====================================================================
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')
# Vẽ dữ liệu thực tế (chấm xanh)
ax.scatter(X_test['Kinh_nghiem'], X_test['Tuoi'], y_test, color='blue', label='Thực tế', s=50)
# Tạo lưới để vẽ mặt phẳng dự báo
x1_mesh, x2_mesh = np.meshgrid(np.linspace(X['Kinh_nghiem'].min(), X['Kinh_nghiem'].max(), 10),
np.linspace(X['Tuoi'].min(), X['Tuoi'].max(), 10))
# Fix: Multiply each mesh with its corresponding coefficient
y_mesh = model.intercept_ + model.coef_[0] * x1_mesh + model.coef_[1] * x2_mesh
# Vẽ mặt phẳng hồi quy (màu đỏ)
ax.plot_surface(x1_mesh, x2_mesh, y_mesh, color='red', alpha=0.3)
ax.set_xlabel('Kinh nghiệm (Năm)')
ax.set_ylabel('Độ tuổi')
ax.set_zlabel('Thu nhập (Triệu VNĐ)')
ax.set_title('Mô hình Hồi quy Đa biến: Mặt phẳng dự báo Thu nhập')
ax.scatter([], [], [], color='red', alpha=0.3, label='Mặt phẳng dự báo')
plt.legend()
plt.show()
3. Giải thích Code và Ý nghĩa Kinh tế
Giải thích luồng lập trình:
Tiền xử lý (Bước 1 & 2): Thuật toán OLS rất nhạy cảm với dữ liệu chưa chuẩn hóa, tuy nhiên trong ví dụ này, để giữ tính minh bạch của các hệ số beta theo đúng đơn vị gốc (năm, tuổi, triệu VNĐ), chúng ta đưa trực tiếp dữ liệu thô vào hàm train_test_split để chia tách không gian kiểm thử.
Huấn luyện (Bước 3): Hàm model.fit(X_train, y_train) kích hoạt phương pháp Bình phương tối thiểu (OLS). Thuật toán sẽ xoay và điều chỉnh liên tục một mặt phẳng trong không gian 3D sao cho tổng bình phương khoảng cách theo phương thẳng đứng từ các chấm xanh (dữ liệu thực) đến mặt phẳng đỏ (đường dự báo) đạt giá trị cực tiểu.
Trực quan hóa (Bước 5): Hàm np.meshgrid được sử dụng để tạo ra một ma trận tọa độ lưới, từ đó hàm plot_surface có thể giăng một "tấm lưới" (mặt phẳng màu đỏ) đại diện cho các giá trị mà mô hình dự đoán.
💡 Insights và Ý nghĩa quản trị kinh doanh: Điểm làm nên sức mạnh vĩnh cửu của Linear Regression trong môi trường doanh nghiệp chính là Tính diễn giải tuyệt đối (White-box model). Từ các hệ số in ra ở Bước 4, nhà quản lý nhân sự có thể bóc tách rõ ràng cấu trúc tiền lương:
Hệ số chặn beta_0 (Intercept): Đại diện cho mức thu nhập cơ sở (lương khởi điểm) của một nhân sự hoàn toàn chưa có kinh nghiệm làm việc.
Tác động biên (Marginal Effect - beta_1 và beta_2): Các hệ số hồi quy một phần (Partial Regression Coefficients) đo lường tác động của riêng một thuộc tính khi các thuộc tính còn lại được giữ cố định. Ví dụ: Nếu kết quả in ra beta_1 = 2.45, Ban giám đốc có thể định lượng chính xác rằng: "Với hai nhân sự có cùng độ tuổi, cứ mỗi năm kinh nghiệm tích lũy thêm, công ty sẽ trả thêm trung bình 2.45 triệu VNĐ/tháng".
Khả năng giải thích rành mạch này biến Hồi quy tuyến tính thành công cụ không thể thay thế khi doanh nghiệp cần giải trình các quyết định tăng lương, định giá tài sản hoặc báo cáo với cơ quan kiểm toán, điều mà các mô hình "hộp đen" phức tạp không thể làm được.
Sự đơn giản và khả năng diễn giải tuyệt vời của Hồi quy tuyến tính (OLS) không phải tự nhiên mà có. Để các hệ số beta phản ánh đúng thực tế khách quan (đạt trạng thái BLUE - Ước lượng tuyến tính không chệch tốt nhất), dữ liệu đầu vào bắt buộc phải vượt qua những rào cản kiểm định thống kê khắt khe mang tên Định lý Gauss-Markov.
Các rào cản này bao gồm: Mối quan hệ phải thực sự tuyến tính, Phương sai của phần dư phải đồng đều (Homoscedasticity), Sai số phải phân phối chuẩn, và đặc biệt là Không được có sự Đa cộng tuyến (Multicollinearity). Trong thực tiễn kinh doanh, Đa cộng tuyến chính là "sát thủ thầm lặng" thường xuyên phá hỏng các mô hình phân tích dữ liệu nhất.
1. Hiện tượng Đa cộng tuyến (Multicollinearity) là gì?
Đa cộng tuyến xảy ra khi hai hoặc nhiều biến độc lập (X) trong mô hình có mối tương quan tuyến tính rất mạnh với nhau.
Hãy quay lại ví dụ dự báo Thu nhập bằng số năm Kinh nghiệm và Tuổi tác ở Mục 5.1.1. Trong thực tế thị trường lao động, một nhân sự có tuổi đời càng cao thì xác suất sở hữu số năm kinh nghiệm càng lớn. Hai biến số này di chuyển cùng chiều và chia sẻ một lượng lớn thông tin trùng lặp với nhau.
Hậu quả: Khi bạn đưa cả hai biến này vào mô hình, thuật toán OLS sẽ bị "bối rối" vì nó không thể tách biệt rạch ròi đâu là sự đóng góp của Tuổi tác và đâu là sự đóng góp thực sự của Kinh nghiệm,. Hệ quả là các hệ số beta trở nên cực kỳ kém ổn định, sai số chuẩn bị khuếch đại, và một sự thay đổi nhỏ trong dữ liệu cũng có thể làm hệ số beta nhảy vọt từ dương sang âm một cách vô lý.
2. Công cụ chẩn đoán: Hệ số VIF (Variance Inflation Factor)
Để "bắt bệnh" đa cộng tuyến, các nhà khoa học dữ liệu sử dụng một chỉ số gọi là Nhân tố phóng đại phương sai (VIF). Chỉ số này đo lường mức độ phương sai của một hệ số hồi quy bị phình to ra bao nhiêu lần do sự tương quan giữa các biến độc lập.
3. 💻 Ví dụ Code thực chiến: Bắt bệnh Đa cộng tuyến bằng VIF
Chúng ta sẽ sử dụng lại chính xác bộ dữ liệu nhân sự (Kinh nghiệm và Tuổi tác) ở Mục 5.1.1 để xem mô hình trước đó có thực sự an toàn hay không. Đoạn code này sử dụng thư viện statsmodels để tính VIF.
import pandas as pd
import numpy as np
from statsmodels.stats.outliers_influence import variance_inflation_factor
from statsmodels.tools.tools import add_constant
# =====================================================================
# BƯỚC 1: TÁI TẠO LẠI DỮ LIỆU TỪ MỤC 5.1.1
# =====================================================================
np.random.seed(42)
n_samples = 200
# Tuổi và Kinh nghiệm có sự tương quan tuyến tính rất mạnh
experience = np.random.uniform(1, 20, n_samples)
age = experience + 22 + np.random.normal(0, 2, n_samples)
X = pd.DataFrame({'Kinh_nghiem': experience, 'Tuoi': age})
# =====================================================================
# BƯỚC 2: TÍNH TOÁN HỆ SỐ VIF BẰNG STATSMODELS
# =====================================================================
# Statsmodels yêu cầu phải thêm một cột hằng số (constant) để tính VIF chính xác
X_with_const = add_constant(X)
# Tạo bảng chứa kết quả
vif_data = pd.DataFrame()
vif_data["Biến số"] = X_with_const.columns
vif_data["Giá trị VIF"] = [variance_inflation_factor(X_with_const.values, i)
for i in range(X_with_const.shape[1])]
print("--- BÁO CÁO CHẨN ĐOÁN ĐA CỘNG TUYẾN (VIF) ---")
print(vif_data[vif_data["Biến số"] != "const"].round(2))
Kết quả khi chạy đoạn code: Bạn sẽ thấy Giá trị VIF của cả hai biến Kinh_nghiem và Tuoi đều vọt lên mức ~10.6. Con số này lớn hơn ngưỡng báo động 5, chứng tỏ mô hình mặt phẳng 3D của chúng ta ở Mục 5.1.1 đang bị "nhiễm bệnh" Đa cộng tuyến khá nặng.
4. 💡 Insights và Ý nghĩa quản trị kinh doanh
Việc bỏ qua bước kiểm tra Đa cộng tuyến có thể dẫn đến những thảm họa trong việc ra quyết định chiến lược:
Sự nguy hiểm của "Thiên kiến hệ số": Nếu Ban Giám đốc nhìn vào hệ số beta của một mô hình bị đa cộng tuyến để ban hành chính sách (ví dụ: Quyết định tăng lương dựa hoàn toàn vào thâm niên, tuổi tác thay vì kỹ năng vì thấy beta của tuổi cao hơn), họ có thể đang trả tiền cho những kết luận thống kê sai lệch.
Giải pháp xử lý: Khi VIF > 5, nhà phân tích dữ liệu có ba lựa chọn: (1) Trục xuất một biến ra khỏi mô hình (chỉ giữ lại Kinh nghiệm và bỏ Tuổi), (2) Gom hai biến lại thành một chỉ số tổng hợp (ví dụ: "Chỉ số thâm niên"), hoặc (3) Áp dụng các thuật toán Học máy nâng cao có khả năng tự động trừng phạt đa cộng tuyến như Hồi quy Ridge (Ridge Regression) hoặc Lasso Regression,. Đây chính là cầu nối tuyệt vời để chúng ta tiến lên các mô hình tiên tiến hơn ở các phần sau.
1. Sự bất lực của đường thẳng trong kinh tế học Trong thực tế kinh tế, các mối quan hệ hiếm khi tuân theo một đường thẳng hoàn hảo. Lấy ví dụ về mối quan hệ giữa Độ tuổi (Age) và Thu nhập (Income): Tốc độ tăng trưởng thu nhập thường có xu hướng tăng nhanh ở giai đoạn đầu sự nghiệp, bão hòa ở độ tuổi trung niên, và giảm dần khi nhân sự bước vào giai đoạn nghỉ hưu. Nếu chúng ta dùng Hồi quy tuyến tính (một đường thẳng vút lên vô tận) để xấp xỉ dữ liệu này, mô hình sẽ hoàn toàn thất bại. Đây là lúc Hồi quy Đa thức phát huy sức mạnh.
3. Rào cản kỹ thuật: Lỗi tràn số và Cạm bẫy Overfitting Khi sử dụng Hồi quy Đa thức, các nhà khoa học dữ liệu phải đối mặt với hai rủi ro lớn:
Bắt buộc phải chuẩn hóa (Scaling): Khi nâng lên lũy thừa bậc cao, các con số sẽ phình to theo cấp số nhân (ví dụ: Thu nhập 15 triệu nâng lên bậc 4 sẽ thành $15^4 = 50.625$). Điều này dễ gây mất ổn định số học và tràn bộ nhớ máy tính nếu dữ liệu không được chuẩn hóa (StandardScaler) trước khi đưa vào mô hình.
Sự đánh đổi Bias-Variance (Bias-Variance Tradeoff): Khi bạn liên tục tăng bậc của đa thức (tăng $m$), mô hình sẽ ngày càng phức tạp. Nếu bậc quá thấp (bậc 1), mô hình bị Underfitting (Kém khớp). Nếu bậc vừa phải (bậc 2 hoặc 3), mô hình nắm bắt được xu hướng thực tế. Nhưng nếu bạn tham lam chọn bậc quá cao (ví dụ bậc 15), mô hình sẽ rơi vào thảm họa Overfitting (Quá khớp) – nó học thuộc lòng từng điểm nhiễu (noise) thay vì xu hướng thực.
💻 Ví dụ Code thực chiến: Vòng đời thu nhập theo độ tuổi
Đoạn mã dưới đây sử dụng thư viện scikit-learn để mô phỏng dữ liệu Thu nhập theo Độ tuổi (hình parabol úp). Chúng ta sẽ huấn luyện 3 mô hình: Đường thẳng (Bậc 1), Đường cong chuẩn (Bậc 2), và Đường cong nhiễu loạn (Bậc 15) để chứng minh trực quan hiện tượng Bias-Variance Tradeoff.
Bạn có thể sao chép và chạy trực tiếp trên Google Colab:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures, StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.metrics import mean_squared_error
# =====================================================================
# BƯỚC 1: TỰ TẠO DỮ LIỆU MÔ PHỎNG (Tuổi và Thu nhập)
# =====================================================================
np.random.seed(42)
# Tuổi từ 20 đến 65
X_age = np.linspace(20, 65, 100).reshape(-1, 1)
# Thu nhập thực tế tuân theo quy luật bậc 2 (Tăng đến đỉnh rồi giảm) + Nhiễu
y_income = -0.5 * (X_age - 45)**2 + 100 + np.random.normal(0, 15, size=X_age.shape)
# =====================================================================
# BƯỚC 2: HUẤN LUYỆN 3 MÔ HÌNH VỚI CÁC BẬC ĐA THỨC KHÁC NHAU
# =====================================================================
# 1. Hồi quy tuyến tính (Bậc 1 - Underfitting)
model_deg1 = LinearRegression()
model_deg1.fit(X_age, y_income)
y_pred_1 = model_deg1.predict(X_age)
# 2. Hồi quy đa thức Bậc 2 (Good fit)
# Dùng Pipeline để gộp bước: Tạo biến đa thức -> Chuẩn hóa (Z-score) -> Hồi quy
model_deg2 = make_pipeline(PolynomialFeatures(degree=2), StandardScaler(), LinearRegression())
model_deg2.fit(X_age, y_income)
y_pred_2 = model_deg2.predict(X_age)
# 3. Hồi quy đa thức Bậc 15 (Overfitting)
model_deg15 = make_pipeline(PolynomialFeatures(degree=15), StandardScaler(), LinearRegression())
model_deg15.fit(X_age, y_income)
y_pred_15 = model_deg15.predict(X_age)
# =====================================================================
# BƯỚC 3: TRỰC QUAN HÓA SO SÁNH
# =====================================================================
plt.figure(figsize=(10, 6))
plt.scatter(X_age, y_income, color='gray', alpha=0.6, label='Dữ liệu thực tế')
plt.plot(X_age, y_pred_1, color='blue', linewidth=2, linestyle='--',
label=f'Bậc 1 (RMSE: {np.sqrt(mean_squared_error(y_income, y_pred_1)):.1f})')
plt.plot(X_age, y_pred_2, color='green', linewidth=3,
label=f'Bậc 2 (RMSE: {np.sqrt(mean_squared_error(y_income, y_pred_2)):.1f})')
plt.plot(X_age, y_pred_15, color='red', linewidth=2,
label=f'Bậc 15 (RMSE: {np.sqrt(mean_squared_error(y_income, y_pred_15)):.1f})')
plt.title('Hồi quy Đa thức: Mối quan hệ giữa Tuổi và Thu nhập', fontsize=14)
plt.xlabel('Độ tuổi (Năm)')
plt.ylabel('Thu nhập (Triệu VNĐ)')
plt.legend()
plt.grid(alpha=0.3)
plt.show()
💡 Insights và Ý nghĩa quản trị kinh doanh:
Quy luật cận biên giảm dần (Diminishing Returns): Đồ thị Hồi quy đa thức (Bậc 2) màu xanh lá cây mô phỏng chính xác "điểm cực đại" của nền kinh tế. Ví dụ, trong chi tiêu quảng cáo, khi ngân sách tăng từ 10 triệu lên 50 triệu, doanh thu có thể tăng vọt. Nhưng từ 50 triệu lên 100 triệu, doanh thu tăng rất chậm và tiến tới bão hòa. Hồi quy tuyến tính (đường màu xanh dương) hoàn toàn "mù" trước sự bão hòa này, khiến doanh nghiệp lãng phí ngân sách vì ảo tưởng rằng bơm càng nhiều tiền thì doanh thu càng tăng mãi mãi.
Cạm bẫy học vẹt chiến lược (Overfitting ở Bậc 15): Đường màu đỏ uốn éo gắt gao đi qua từng điểm dữ liệu nhiễu. Trong quản trị, điều này tương đương với một Giám đốc chiến lược cố gắng viết ra một quy định vi mô cho từng biến động nhỏ nhặt diễn ra mỗi ngày trên thị trường. Một chiến lược quá phức tạp, cố gắng khớp với mọi thứ trong quá khứ sẽ sụp đổ khi thị trường xuất hiện khách hàng mới. Tìm ra "bậc đa thức tối ưu" chính là tìm ra sự linh hoạt vừa đủ cho chiến lược doanh nghiệp.