Chuyển đến nội dung chính

Hồi quy tuyến tính trong Python: Hướng dẫn mô hình dự đoán

Tìm hiểu cách thực hiện hồi quy tuyến tính trong Python bằng NumPy, statsmodels và scikit-learn.
· 9 phút đọc

Khám phá cùng AI

Python, với hệ sinh thái thư viện phong phú như NumPy, statsmodels và scikit-learn, đã trở thành ngôn ngữ hàng đầu cho các nhà khoa học dữ liệu. Dễ dùng và linh hoạt, Python phù hợp cả để hiểu nền tảng lý thuyết của hồi quy tuyến tính lẫn triển khai trong các tình huống thực tế.

Trong hướng dẫn này, tôi sẽ đưa bạn đi qua mọi điều cần biết về hồi quy tuyến tính trong Python. Chúng ta sẽ bắt đầu bằng định nghĩa hồi quy tuyến tính là gì và vì sao nó quan trọng. Sau đó, chúng ta xem cơ chế hoạt động, khám phá các phương trình và giả định nền tảng. Bạn sẽ học cách thực hiện hồi quy tuyến tính bằng nhiều thư viện Python, từ tính toán thủ công với NumPy đến các triển khai gọn nhẹ với scikit-learn. Chúng ta sẽ đề cập cả hồi quy tuyến tính đơn và hồi quy tuyến tính bội, và tôi sẽ chỉ bạn cách đánh giá mô hình cũng như nâng cao hiệu suất của chúng.

Hồi quy tuyến tính là gì?

Hồi quy tuyến tính là một phương pháp thống kê dùng để mô hình hóa mối quan hệ giữa biến phụ thuộc (mục tiêu) và một hoặc nhiều biến độc lập (biến dự báo). Mục tiêu là tìm một phương trình tuyến tính mô tả tốt nhất mối quan hệ này.

Hồi quy tuyến tính được dùng rộng rãi cho mô hình dự đoán, thống kê suy luận và hiểu các mối quan hệ trong dữ liệu. Ứng dụng gồm dự báo doanh số, đánh giá rủi ro, và phân tích tác động của các biến khác nhau lên kết quả mục tiêu.

Hồi quy tuyến tính đơn là gì?

Với hồi quy tuyến tính đơn, mô hình là một đường thẳng trong không gian hai chiều; với hồi quy tuyến tính bội (hai biến độc lập), mối quan hệ được biểu diễn bằng một mặt phẳng trong không gian ba chiều; với nhiều biến độc lập hơn, phương trình mô tả một siêu phẳng trong không gian nhiều chiều.

Hãy bắt đầu với một mô hình hồi quy tuyến tính đơn, như đã nói, chỉ có một biến dự báo. Nó được biểu diễn bằng phương trình sau:

simple linear regression formula

Trong đó:

  • y là biến phụ thuộc,
  • x là biến độc lập,
  • B0 là hằng số chặn (intercept),
  • B1 là hệ số (độ dốc) của biến độc lập,
  • biểu diễn sai số (error term).

Hồi quy tuyến tính bội là gì?

Ngược lại, hồi quy tuyến tính bội mở rộng khái niệm này để bao gồm nhiều biến dự báo:

multiple linear regression formula

Trong đó:

  • 0 là hằng số chặn,
  • x1, x2, ..., xn là các biến dự báo
  • 1,2, ..., n là các hệ số tương ứng với từng biến dự báo,
  • là sai số.

Cơ chế đằng sau hồi quy tuyến tính

Để hiểu hồi quy tuyến tính hoạt động thế nào, hãy phân tách các thành phần chính của nó.

Phương trình mô hình tuyến tính

Chúng ta đã thấy các phương trình cho hồi quy tuyến tính ở trên, cả với một và nhiều biến dự báo. Nhưng giờ, tôi muốn nói về một khía cạnh quan trọng của các phương trình.

Từ “tuyến tính” trong hồi quy tuyến tính đề cập đến dạng hàm của mô hình, không nhất thiết là hình dạng của dữ liệu. Cụ thể, nó có nghĩa là:

  1. Mô hình tuyến tính theo tham số. Tức mỗi biến dự báo được nhân với một hệ số rồi cộng lại.
  2. Mối quan hệ giữa biến phụ thuộc và các biến dự báo là tính cộng, nghĩa là thay đổi ở mỗi biến dự báo có ảnh hưởng nhất quán lên biến phụ thuộc.
  3. Không có lũy thừa, nhân giữa các biến, hay biến đổi phi tuyến áp dụng lên các tham số.

Phương pháp bình phương tối thiểu thông thường (OLS)

Để xác định đường thẳng khớp tốt nhất, hồi quy tuyến tính sử dụng phương pháp bình phương tối thiểu thông thường (OLS). OLS cực tiểu hóa tổng bình phương sai số:

OLS cực tiểu hóa tổng bình phương sai số:

Điều này đảm bảo mô hình đưa ra ước lượng tốt nhất cho B0 và B1.

Các giả định của hồi quy tuyến tính

Để hồi quy tuyến tính cho kết quả đáng tin cậy, cần thỏa mãn một số giả định:

  1. Tính tuyến tính: Mối quan hệ giữa biến độc lập và biến phụ thuộc nên là tuyến tính.
  2. Độc lập của sai số: Phần dư (sai số) không nên tương quan với nhau.
  3. Phương sai không đổi (đồng phương sai): Độ phân tán của phần dư nên ổn định trên mọi giá trị.
  4. Tính chuẩn của phần dư: Phần dư nên tuân theo phân phối chuẩn.

Xác thực các giả định này đảm bảo mô hình vừa tin cậy vừa hợp lệ. Ví dụ, nếu mối quan hệ giữa các biến không tuyến tính, dự đoán của mô hình có thể thiếu chính xác. Nếu có dị phương sai, khoảng tin cậy có thể sai lệch.

Các cách thực hiện hồi quy tuyến tính trong Python

Hồi quy tuyến tính có thể được triển khai trong Python bằng nhiều cách. Tôi sẽ hướng dẫn bạn ba phương pháp phổ biến: tính toán thủ công với NumPy, mô hình hóa thống kê chi tiết với statsmodels, và học máy gọn nhẹ với scikit-learn.

Cách tính thủ công (NumPy)

Với hồi quy tuyến tính đơn (một biến dự báo), bạn có thể tự tính các tham số hồi quy bằng NumPy. Điều này bao gồm việc đầu tiên tính trung bình của biến độc lập và biến phụ thuộc. Sau đó chúng ta tính độ dốc (B0):

Khi đã có độ dốc, ta xác định hằng số chặn (B1):

import numpy as np

# Sample data
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])

# Compute means
x_mean = np.mean(x)
y_mean = np.mean(y)

# Compute slope (B1)
B1 = np.sum((x - x_mean) * (y - y_mean)) / np.sum((x - x_mean) ** 2)

# Compute intercept (B0)
B0 = y_mean - B1 * x_mean

print(f"Slope (B1): {B1}")
print(f"Intercept (B0): {B0}")

# Predicting values
y_pred = B0 + B1 * x
print("Predicted values:", y_pred)

Nếu bạn muốn đơn giản hóa quy trình, NumPy cũng cung cấp hàm dựng sẵn np.polyfit(), có thể thực hiện hồi quy tuyến tính chỉ với một dòng lệnh.

# Example of NumPy's polyfit
np.polyfit(x, y, 1)  # 1 stands for the degree of the polynomial (linear)

Dù hữu ích để hiểu toán học đằng sau hồi quy tuyến tính đơn, cách này không thực tế với bộ dữ liệu lớn, độ chính xác số học kém hơn và không áp dụng cho bài toán hồi quy bội.

Dùng thư viện thống kê (statsmodels)

Một cách hiệu quả hơn để thực hiện hồi quy tuyến tính là dùng statsmodels, thư viện cung cấp các mô hình thống kê và công cụ phân tích.

Các bước khớp một mô hình Bình phương tối thiểu thông thường (OLS) bằng Statsmodels:

  1. Chuẩn bị dữ liệu: Đảm bảo biến độc lập được cấu trúc đúng.

  2. Thêm hằng số: Điều này tính đến hằng số chặn trong phương trình.

  3. Khớp mô hình: Dùng OLS() từ statsmodels để ước lượng các tham số hồi quy.

  4. Phân tích kết quả: Hàm .summary() cung cấp thông tin chi tiết về mô hình, bao gồm hệ số, p-value và R-squared.

import numpy as np
import statsmodels.api as sm

# Sample data
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])

# Add constant for intercept term
X = sm.add_constant(x)

# Fit OLS model
model = sm.OLS(y, X).fit()

# Print summary
print(model.summary())

Dùng thư viện học máy (scikit-learn)

scikit-learn được sử dụng rộng rãi nhờ tính đơn giản, khả năng mở rộng và tích hợp với các công cụ học máy khác. Thư viện này cung cấp cách thực hiện hồi quy tuyến tính đơn giản và hiệu quả bằng lớp LinearRegression.

  1. Nhập thư viện và tải bộ dữ liệu của bạn.

  2. Định hình lại biến dự báo nếu cần (cho hồi quy một biến).

  3. Tạo một thể hiện mô hình bằng LinearRegression().

  4. Khớp mô hình với dữ liệu huấn luyện.

  5. Lấy tham số mô hình: Thuộc tính .coeff_ trả về độ dốc, còn .intercept_ cho hằng số chặn.

import numpy as np
from sklearn.linear_model import LinearRegression

# Sample data
x = np.array([1, 2, 3, 4, 5]).reshape(-1, 1)  # Reshape for scikit-learn
y = np.array([2, 4, 5, 4, 5])

# Create model instance
model = LinearRegression()

# Fit the model
model.fit(x, y)

# Get model parameters
print(f"Slope (B1): {model.coef_[0]}")
print(f"Intercept (B0): {model.intercept_}")

# Predict values
y_pred = model.predict(x)
print("Predicted values:", y_pred)

Các phương pháp quan trọng khác

Ngoài NumPy, statsmodels và scikit-learn, còn một số thư viện Python khác cung cấp khả năng hồi quy:

  • Pandas: Hữu ích cho phân tích dữ liệu khám phá và mô hình xu hướng nhanh.
  • SciPy: Bao gồm các hàm thống kê có thể dùng cho phân tích hồi quy.
  • TensorFlow & PyTorch: Dù chủ yếu cho học sâu, chúng cũng xử lý bài toán hồi quy tuyến tính hiệu quả.

Mỗi cách có ưu điểm riêng. Phụ thuộc vào độ phức tạp của bài toán hồi quy của bạn.

Hồi quy tuyến tính trong Python với một hoặc nhiều biến dự báo

Hồi quy tuyến tính có thể xử lý cả mối quan hệ đơn giản và phức tạp. Phần này, chúng ta sẽ xem cách triển khai hồi quy tuyến tính với một biến dự báo (đơn) và nhiều biến dự báo (bội) bằng Python.

Hồi quy tuyến tính đơn trong Python

Với hồi quy tuyến tính đơn trong Python, ta thực hiện các bước sau:

Bước 1: Tính tương quan

Hệ số tương quan đo độ mạnh của mối quan hệ giữa x và y. Ta tìm nó bằng NumPy:

import numpy as np

# Sample data
x = np.array([1, 2, 3, 4, 5])  # Independent variable
y = np.array([2, 4, 5, 4, 5])  # Dependent variable

correlation = np.corrcoef(x, y)[0, 1]
print("Correlation:", correlation)

Bước 2: Tính độ dốc và hằng số chặn

Độ dốc B1 được tính như sau:

beta_1 = correlation * (np.std(y) / np.std(x))

Bạn có thể nhận thấy phương trình này trông hơi khác so với trước đó, nơi tôi tìm độ dốc bằng cách cộng các tích độ lệch giữa và y, rồi chia cho tổng bình phương độ lệch của . Phương pháp mới này, dùng tương quan và độ lệch chuẩn, có vẻ khác nhưng thực ra tương đương. Bằng cách viết lại phương trình trước, ta có thể biểu diễn độ dốc là nhân với tỉ số độ lệch chuẩn của và , khiến hai dạng trở nên tương đương về mặt đại số.

Giờ đến hằng số chặn:

beta_0 = np.mean(y) - beta_1 * np.mean(x)

Bước 3: Dự đoán bằng các tham số đã tính

Giờ khi đã có các hệ số, ta có thể tìm giá trị dự đoán.

y_pred = beta_0 + beta_1 * x

Đi qua các bước này, theo tôi, hữu ích để hiểu các phép tính nền tảng trước khi dùng các thư viện như scikit-learn.

Hồi quy tuyến tính bội trong Python

Hồi quy tuyến tính bội mở rộng khái niệm hồi quy tuyến tính đơn để mô hình hóa mối quan hệ giữa biến phụ thuộc và nhiều biến độc lập. Điều này cho phép chúng ta phân tích các bộ dữ liệu phức tạp hơn, nơi một biến dự báo đơn lẻ không đủ giải thích biến thiên của biến phụ thuộc.

Để thực hiện hồi quy tuyến tính bội trong Python, ta thường dùng đại số ma trận để tính các hệ số cực tiểu hóa tổng bình phương phần dư. Một công thức thường được dạy để tính hệ số trong hồi quy tuyến tính bội là phương trình chuẩn (normal equation):

Trong đó:

  • X là ma trận các biến độc lập (kèm một cột giá trị 1 cho hằng số chặn),
  • y là vector các giá trị biến phụ thuộc.
  • XT là chuyển vị của ma trận X.
  • (XTX)-1 là nghịch đảo của XTX.

Phương trình này cho ra các giá trị tối ưu của hệ số làm cực tiểu tổng bình phương sai số.

Dưới đây là ví dụ thực hiện hồi quy tuyến tính bội với Python, dùng NumPy cho các phép toán ma trận:

import numpy as np

# Sample data: two predictors and one dependent variable
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])  # Independent variables
y = np.array([6, 8, 9, 11])  # Dependent variable

# Add a column of ones to include the intercept in the model
X = np.column_stack((np.ones(X.shape[0]), X))

# Calculate beta coefficients using the normal equation
beta = np.linalg.inv(X.T @ X) @ X.T @ y
print("Coefficients:", beta)

Cách này hoạt động tốt khi các biến dự báo độc lập, nhưng nếu các biến dự báo tương quan mạnh, phép nghịch đảo ma trận trở nên không ổn định. Vì lý do này, các thư viện như scikit-learn dùng phương pháp ổn định số hơn dựa trên phân rã QR để tính các hệ số hồi quy. Vậy nên, dù ta có thể tính hệ số bằng phương trình chuẩn, hãy biết rằng khi dùng hàm LinearRegression() từ scikitlearn, phân rã QR đang chạy ngầm phía dưới.

Giải quyết đa cộng tuyến

Đây là lúc nên đề cập đến một mối lo trong hồi quy tuyến tính bội trong Python. Đa cộng tuyến xảy ra khi hai hoặc nhiều biến độc lập tương quan mạnh, khiến khó tách ảnh hưởng riêng của chúng. Điều này có thể dẫn đến ước lượng hệ số không ổn định. Để phát hiện và giảm thiểu đa cộng tuyến, bạn có thể tính hệ số phóng đại phương sai (VIF). Bạn cũng có thể loại bỏ các biến tương quan cao, hoặc dùng các kỹ thuật điều chuẩn như ridge regression và lasso regression.

Chẩn đoán và đánh giá mô hình hồi quy tuyến tính trong Python

Sau khi xây dựng mô hình hồi quy tuyến tính, bước tiếp theo là đánh giá hiệu suất và xác thực rằng nó đáp ứng các giả định nền tảng. Điều này đảm bảo độ tin cậy của dự đoán và giúp bạn nhận diện các cải thiện tiềm năng.

Phân tích phần dư

Phân tích phần dư là phần cốt lõi của chẩn đoán hồi quy tuyến tính. Nó giúp kiểm tra các giả định và phát hiện vi phạm. Phần dư nên phân tán ngẫu nhiên quanh 0, không có mẫu hình rõ rệt. Đây là lúc các công cụ trực quan như biểu đồ phần dư và Q-Q plot phát huy tác dụng:

  1. Biểu đồ phần dư: Biểu đồ phân tán của phần dư so với giá trị dự đoán (hoặc biến độc lập) giúp kiểm tra xem có mối quan hệ nào mà mô hình chưa nắm bắt không. Lý tưởng, biểu đồ nên cho thấy sự phân tán ngẫu nhiên, không có mẫu hình rõ ràng, gợi ý mô hình đã nắm bắt tốt mối quan hệ tuyến tính.
  2. Q-Q Plot (Quantile-Quantile Plot): Q-Q plot giúp đánh giá phần dư có tuân theo phân phối chuẩn không. Để hồi quy tuyến tính hợp lệ, phần dư nên xấp xỉ phân phối chuẩn. Đường thẳng trên Q-Q plot cho thấy tính chuẩn.

Trong Python, chúng ta có thể tạo các biểu đồ này dễ dàng với matplotlib, seaborn và statsmodels.

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import statsmodels.api as sm

# Sample data and linear regression model
X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])  # Independent variables
y = np.array([6, 8, 9, 11])  # Dependent variable

# Add an intercept term
X = sm.add_constant(X)

# Fit the linear regression model
model = sm.OLS(y, X).fit()

# Get the residuals
residuals = model.resid

# 1. Residual Plot
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.scatter(model.fittedvalues, residuals)
plt.axhline(y=0, color='r', linestyle='--')
plt.xlabel('Fitted Values')
plt.ylabel('Residuals')
plt.title('Residual Plot')

# 2. Q-Q Plot
plt.subplot(1, 2, 2)
sm.qqplot(residuals, line ='45', ax=plt.gca())
plt.title('Q-Q Plot')

plt.tight_layout()
plt.show()

Chỉ số đánh giá

Ngoài phân tích trực quan, các chỉ số định lượng là thiết yếu để đánh giá mức độ mô hình hồi quy tuyến tính khớp dữ liệu. Một số chỉ số chính gồm:

  1. R-squared (R²): Chỉ số này cho biết bao nhiêu phương sai của biến phụ thuộc được giải thích bởi các biến độc lập. Giá trị R² gần 1 cho thấy mô hình giải thích phần lớn phương sai, còn giá trị gần 0 nghĩa là mô hình không khớp dữ liệu tốt.
  2. Adjusted R-squared: Chỉ số này điều chỉnh R² theo số lượng biến dự báo trong mô hình. Hữu ích khi so sánh các mô hình có số biến dự báo khác nhau.
  3. RMSE (Căn bậc hai sai số bình phương trung bình): RMSE đo độ lớn trung bình của sai số trong dự đoán của mô hình, cùng đơn vị với biến phụ thuộc. RMSE thấp hơn cho thấy khả năng dự đoán tốt hơn.
  4. MAE (Sai số tuyệt đối trung bình): MAE đo độ lớn trung bình của sai số trong dự đoán, nhưng không phạt nặng sai số lớn như RMSE. Dễ diễn giải vì cùng đơn vị với biến phụ thuộc.

Các chỉ số này có thể tính dễ dàng trong Python bằng statsmodels hoặc scikit-learn:

from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np

# Make predictions using the model
y_pred = model.predict(X)

# R-squared
r_squared = r2_score(y, y_pred)
print("R-squared:", r_squared)

# Adjusted R-squared (calculated manually)
n = len(y)  # number of data points
p = X.shape[1] - 1  # number of predictors (excluding intercept)
adj_r_squared = 1 - (1 - r_squared) * (n - 1) / (n - p - 1)
print("Adjusted R-squared:", adj_r_squared)

# RMSE
rmse = np.sqrt(mean_squared_error(y, y_pred))
print("Root Mean Squared Error (RMSE):", rmse)

# MAE
mae = mean_absolute_error(y, y_pred)
print("Mean Absolute Error (MAE):", mae)

Bằng cách đánh giá các chỉ số này, bạn có được hiểu biết về độ chính xác của mô hình, mức độ khớp và khả năng tổng quát hóa lên dữ liệu mới.

Nâng cao mô hình hồi quy của bạn

Khi đã đánh giá mô hình hồi quy tuyến tính, bước kế tiếp là khám phá cách cải thiện hiệu suất. Một cách phổ biến là thông qua biến đổi đặc trưng (feature transformations), có thể xử lý các mối quan hệ phi tuyến và giúp mô hình nắm bắt tốt hơn các mẫu ẩn trong dữ liệu.

Biến đổi đặc trưng

Hãy nhớ rằng trong hồi quy tuyến tính, mô hình giả định mối quan hệ tuyến tính giữa biến độc lập (dự báo) và biến phụ thuộc. Tuy nhiên, nhiều bộ dữ liệu thực tế có các mối quan hệ phi tuyến mà mô hình tuyến tính đơn giản có thể không nắm bắt tốt. Bằng cách áp dụng các biến đổi đặc trưng, như logarit hoặc căn bậc hai, đôi khi bạn có thể cải thiện hiệu suất mô hình.

Biến đổi logarit

Thường dùng khi một đặc trưng có tăng trưởng hàm mũ hoặc có giá trị dương lớn. Ví dụ, biến đổi dữ liệu thu nhập lệch mạnh (một vài giá trị thu nhập rất cao chi phối) có thể làm phân phối trở nên gần chuẩn hơn.

import numpy as np
df['log_income'] = np.log(df['income'] + 1)  # +1 to avoid log(0)

Biến đổi căn bậc hai

Hữu ích cho các đặc trưng theo quan hệ bậc hai. Ví dụ, một đặc trưng biểu diễn số đếm (như số lượt truy cập website) có thể được hưởng lợi từ biến đổi căn bậc hai.

df['sqrt_visits'] = np.sqrt(df['visits'])

Bằng cách biến đổi các đặc trưng này, bạn giúp mô hình nắm bắt tốt hơn những mối quan hệ trước đó bị bỏ lỡ bởi cách tiếp cận tuyến tính. Điều quan trọng là thử nghiệm các biến đổi khác nhau và quan sát tác động lên hiệu suất mô hình. Không có công thức chung cho mọi trường hợp và đòi hỏi thử nghiệm thực nghiệm.

Chuẩn hóa và tiêu chuẩn hóa

Ngoài biến đổi đặc trưng, cũng quan trọng để hiểu tác động của chuẩn hóa (normalization) và tiêu chuẩn hóa (standardization) lên mô hình hồi quy, đặc biệt khi bạn xử lý các đặc trưng có đơn vị hoặc thang đo khác nhau. Chuẩn hóa đưa giá trị đặc trưng về một khoảng, thường là [0, 1]. Tiêu chuẩn hóa đưa các đặc trưng về trung bình 0 và độ lệch chuẩn 1.

Khi có nhiều biến dự báo, chuẩn hóa hoặc tiêu chuẩn hóa dữ liệu giúp diễn giải các hệ số có ý nghĩa hơn. Tức là, nó giúp thể hiện mỗi biến dự báo đóng góp bao nhiêu vào biến phụ thuộc tương đối so với các biến khác. Điều này đặc biệt hữu ích khi các biến dự báo ở các thang đo khác nhau.

Kết luận

Để hiểu vững hồi quy tuyến tính cần luyện tập và khám phá liên tục. Để đào sâu kiến thức, hãy cân nhắc học thêm về xử lý đa cộng tuyến, dị phương sai, và các kỹ thuật điều chuẩn như Ridge và Lasso. Củng cố hiểu biết về phân rã QR và hệ số phóng đại phương sai cũng có thể nâng cao khả năng chẩn đoán mô hình. Ngoài ra, hiểu rõ chuẩn hóa so với tiêu chuẩn hóa có thể cải thiện quyết định về thu nhỏ thang đo đặc trưng.

Samuel Shaibu

Tác giả

Samuel Shaibu

Chuyên gia dữ liệu và tác giả dày dạn kinh nghiệm, đam mê hỗ trợ những người đang theo đuổi con đường trở thành chuyên gia trong lĩnh vực dữ liệu.

Chủ đề

Liên quan