Bài 54: Phương trình hồi quy tuyến tính – Mô hình đơn biến(tt)

Trong bài 53 Tui đã trình bày chi tiết công thức hồi quy đơn biến, cũng như giải thích cách tính chi tiết các thông số của công thức, thực hiện trên Excel và lập trình bằng Python, trực quan hóa kết quả thực hiện hồi quy đơn biến.

Để củng cố thêm kiến thức cũng như kỹ năng lập trình và ứng dụng hồi quy đơn biến, trong bài này Tui tiếp tục cung cấp một ví dụ minh họa về dự báo giá nhà áp dụng hồi quy đơn biến. Đặc biệt Tui minh họa thêm cách huấn luyện mô hình hồi quy đơn biến bằng Sklearn-Python. Như vậy trong ví dụ thứ 2 này chúng ta sẽ thực hành bằng 3 cách để dự báo giá nhà:

Cho tập dữ liệu như dưới đây:

xy
73.51.49
751.5
76.51.51
791.54
81.51.58
82.51.59
841.6
851.62
86.51.63
87.51.64
891.66
901.67
91.51.68
  • Tập dữ liệu gồm có 2 biến x, y. Biến độc lập là x (diện tích nhà), biến phụ thuộc là y (Giá nhà – tỉ VNĐ)
  • Dùng hồi quy tuyến tính để tính y predicted giá nhà

Cách 1: Tính toán hồi quy đơn biên trong Microsoft Excel

Như đã đề cập về cách tính toán các thông số cho phương trình hồi quy:

Y = Β0 + Β1*X

  1. Tính độ lệch chuẩn của biến độc lập x: Sử dụng Công thức STDEV
  2. Tính độ lệch chuẩn của biến phụ thuộc y: Sử dụng Công thức STDEV
  3. Tính trung bình của các biến độc lập x: Sử dụng Công thức AVERAGE
  4. Tính trung bình của các biến phụ thuộc y: Sử dụng công thức AVERAGE
  5. Tính độ tương quan giữa x và y: Sử dụng Công thức CORREL
  6. Tính B1: Sử dụng Công thức

 Độ Tương quan *( Độ lệch chuẩn của y / Độ lệch chuẩn của x)

7. Tính B0: Sử dụng công thức

  Trung bình (Y) – B1 * Trung bình (X)

Ta bắt đầu lắp ráp công thức trong Excel để tính 7 dữ kiện cho công thức hồi quy đơn biến như dưới đây:

Hình trên là công thức để tính 7 dữ kiện liên quan tới hồi quy đơn biến. Ta quan sát kết quả đạt được:

Sau khi có 7 dữ kiện, ta bổ sung cột y_predicted để lắp ráp vào công thức:

Y = Β0 + Β1*X

Ta xem công thức Tui thực hiện cho phương trình:

Bạn chú ý các ô Cell tính toán công thức nó lệ thuộc vào dữ liệu bạn nhập, nếu nhập theo đúng cấu trúc mà Tui chụp hình ở trên thì các địa chỉ cell không cần đổi, còn nếu bạn nhập khác với cấu trúc file Excel mà Tui cung cấp thì cần tham chiếu địa chỉ ô cell cho đúng.

Ta xem kết quả thực hiện y-predicted:

Ta quan sát thấy kết quả dự báo rất sát với kết quả thực tế, ta xem thêm trực quan hóa đồ thị:

Các bạn có thể tải file Excel cùng với các công thức mà Tui đã thực hiện ở đây:

https://www.mediafire.com/file/y9vbe6ka0085uzl/Simple-Linear-Regression-2.xlsx/file

Cách 2: Lập trình Python để tính toán các dữ kiện nhằm thực hiện công thức hồi quy đơn biến

Ta thực hiện mã lệnh Python để tính toán dựa trên toán học ra các kết quả b1, b0 như dưới đây:

import matplotlib.pyplot as plt
import numpy as np

# area
x = np.array([[73.5,75.,76.5,79.,81.5,82.5,84.,85.,86.5,87.5,89.,90.,91.5]]).T
# price
y = np.array([[1.49,1.50,1.51,1.54,1.58,1.59,1.60,1.62,1.63,1.64,1.66,1.67,1.68]]).T

def calculateb1b0(x,y):
  # tính trung bình
  xbar = np.mean(x)
  ybar = np.mean(y)
  x2bar = np.mean(x ** 2)
  xybar = np.mean(x * y)

  # tính b0, b1
  b1 = (xbar * ybar - xybar) / (xbar ** 2 - (x2bar))
  b0 = ybar - b1 * xbar
  return b1,b0
#calulate b1, b0
b1,b0=calculateb1b0(x,y)
print("b1=",b1)
print("b0=",b0)
y_predicted=b0+b1*x
print(y_predicted)

Thực hiện lệnh trên ta có kết quả:

Ta quan sát kết quả, rất giống với cách thực hiện trong Excel.

Tiếp tục viết mã lệnh để trực quan hóa kết quả, so sánh giá trị thực và giá trị predicted:

# Visualize data
def showGraph(x, y,y_predicted, title="", xlabel="", ylabel=""):
  plt.figure(figsize=(14, 8))
  plt.plot(x, y, 'r-o', label="price")
  plt.plot(x, y_predicted, 'b-*', label="predicted value")
  x_min = np.min(x)
  x_max = np.max(x)
  y_min = np.min(y)
  y_max = np.max(y)
  # mean y
  ybar = np.mean(y)

  plt.axhline(ybar, linestyle='--', linewidth=4, label="mean")
  plt.axis([x_min*0.95, x_max*1.05, y_min*0.95, y_max*1.05])
  plt.xlabel(xlabel, fontsize=16)
  plt.ylabel(ylabel, fontsize=16)
  plt.text(x_min, ybar*1.01, "mean", fontsize=16)
  plt.legend(fontsize=15)
  plt.title(title, fontsize=20)
  plt.show()

showGraph(x, y,y_predicted,
          title='Giá nhà theo diện tích',
          xlabel='Diện tích (m2)',
          ylabel='Giá nhà (tỷ VND)')

Thực thi lệnh trên ta có kết quả:

Nhìn vào kết quả trực quan hóa, ta thấy mô hình hồi quy đơn biến cho ra kết quả prediction khá tương đồng với giá trị thực, tức là mô hình chất lượng. Tuy nhiên đây chỉ là đơn biến, giá nhà nó không chỉ lệ thuộc vào diện tích mà nó còn lệ thuộc vào rất nhiều yếu tố khác như: số phòng, số tầng, mặt tiền, các tiện ích xung quanh….

Các bạn có thể tải Source code Python tính toán hồi quy đơn biến ở đây:

https://www.mediafire.com/file/92f2p8fyfoc7gzx/SimpleLinearRegression2.py/file

Cách 3: Huấn luyện mô hình máy học cho mô hình hồi quy tuyến tính đơn biến

Cách này chúng ta dùng linear_model trong thư viện sklearn để huấn luyện mô hình hồi quy. Chúng ta sẽ so sánh cách lập trình Python theo công thức toán học và theo thư viện sklearn.

import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model

# area
x = np.array([[73.5,75.,76.5,79.,81.5,82.5,84.,85.,86.5,87.5,89.,90.,91.5]]).T
# price
y = np.array([[1.49,1.50,1.51,1.54,1.58,1.59,1.60,1.62,1.63,1.64,1.66,1.67,1.68]]).T
# input matrix X
X = np.concatenate([x], axis = 1)

def calculateb1b0(x,y):
  # tính trung bình
  xbar = np.mean(x)
  ybar = np.mean(y)
  x2bar = np.mean(x ** 2)
  xybar = np.mean(x * y)

  # tính b0, b1
  b1 = (xbar * ybar - xybar) / (xbar ** 2 - (x2bar))
  b0 = ybar - b1 * xbar
  return b1,b0
#calulate b1, b0
b1,b0=calculateb1b0(x,y)
print("Lập trình Python theo công thức toán học:")
print("b1=",b1)
print("b0=",b0)
y_predicted=b0+b1*x
print(y_predicted)

# fit the model by Linear Regression
# fit_intercept = False for calculating the bias
regr = linear_model.LinearRegression(fit_intercept=True)

regr.fit(X, y)
print("Lập trình Python theo mô hình huấn luyện máy học LinearRegression:")
# Compare two results
print('Coefficient : ', regr.coef_)
print('Interception  : ', regr.intercept_)

# Dự báo giá nhà ngay trên tập huấn luyện
ypred = regr.predict(X)
print(ypred)

Thực hiện lệnh trên ta có kết quả so sánh của 2 cách:

Quan sát các giá trị:

  • Theo công thức lập trình dựa trên tính toán toán học: b1, b0, y_predicted
  • Theo huấn luận mô hình máy học: Coefficient, Interception và ypred

Các giá trị này là tương đương nhau.

Như vậy rõ ràng, khi dùng thư viện huấn luyện mô hình máy học sẽ nhanh gọn lẹ hơn, vì ta chỉ cần học cách sử dụng thư viện (với 2 dòng lệnh là tính ra được b1(Coefficient), b0(Interception)).

Tiếp theo ta bổ sung mã lệnh để trực quan hóa kết quả:

# Visualize data
def showGraph(x, y_act, y_pred, title="", xlabel="", ylabel=""):
  plt.figure(figsize=(14, 8))
  plt.plot(x, y_act, 'r-o', label="price actual")
  plt.plot(x, y_pred, '--', label="price predict")
  x_min = np.min(x)
  x_max = np.max(x)
  y_min = np.min(y_act)
  y_max = np.max(y_act)
  # mean price
  ybar = np.mean(y_act)
  plt.axhline(ybar, linestyle='--', linewidth=4, label="mean actual")
  plt.axis([x_min*0.95, x_max*1.05, y_min*0.95, y_max*1.05])
  plt.xlabel(xlabel, fontsize=16)
  plt.ylabel(ylabel, fontsize=16)
  plt.text(x_min, ybar*1.01, "mean actual", fontsize=16)
  plt.legend(fontsize=15)
  plt.title(title, fontsize=20)
  plt.show()

showGraph(x, y,ypred,
          title='Dự báo Giá nhà theo diện tích',
          xlabel='Diện tích (m2)',
          ylabel='Giá nhà (tỷ VND)')

Thực thi lệnh trên ta có kết quả trực quan hoá:

Dưới đây là mã lệnh đầy đủ của huấn luyện mô hình máy học:

import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model

# area
x = np.array([[73.5,75.,76.5,79.,81.5,82.5,84.,85.,86.5,87.5,89.,90.,91.5]]).T
# price
y = np.array([[1.49,1.50,1.51,1.54,1.58,1.59,1.60,1.62,1.63,1.64,1.66,1.67,1.68]]).T
# input matrix X
X = np.concatenate([x], axis = 1)

def calculateb1b0(x,y):
  # tính trung bình
  xbar = np.mean(x)
  ybar = np.mean(y)
  x2bar = np.mean(x ** 2)
  xybar = np.mean(x * y)

  # tính b0, b1
  b1 = (xbar * ybar - xybar) / (xbar ** 2 - (x2bar))
  b0 = ybar - b1 * xbar
  return b1,b0
#calulate b1, b0
b1,b0=calculateb1b0(x,y)
print("Lập trình Python theo công thức toán học:")
print("b1=",b1)
print("b0=",b0)
y_predicted=b0+b1*x
print(y_predicted)

# fit the model by Linear Regression
# fit_intercept = False for calculating the bias
regr = linear_model.LinearRegression(fit_intercept=True)

regr.fit(X, y)
print("Lập trình Python theo mô hình huấn luyện máy học LinearRegression:")
# Compare two results
print('Coefficient : ', regr.coef_)
print('Interception  : ', regr.intercept_)

# Dự báo giá nhà ngay trên tập huấn luyện
ypred = regr.predict(X)
print(ypred)
# Visualize data
def showGraph(x, y_act, y_pred, title="", xlabel="", ylabel=""):
  plt.figure(figsize=(14, 8))
  plt.plot(x, y_act, 'r-o', label="price actual")
  plt.plot(x, y_pred, '--', label="price predict")
  x_min = np.min(x)
  x_max = np.max(x)
  y_min = np.min(y_act)
  y_max = np.max(y_act)
  # mean price
  ybar = np.mean(y_act)
  plt.axhline(ybar, linestyle='--', linewidth=4, label="mean actual")
  plt.axis([x_min*0.95, x_max*1.05, y_min*0.95, y_max*1.05])
  plt.xlabel(xlabel, fontsize=16)
  plt.ylabel(ylabel, fontsize=16)
  plt.text(x_min, ybar*1.01, "mean actual", fontsize=16)
  plt.legend(fontsize=15)
  plt.title(title, fontsize=20)
  plt.show()

showGraph(x, y,ypred,
          title='Dự báo Giá nhà theo diện tích',
          xlabel='Diện tích (m2)',
          ylabel='Giá nhà (tỷ VND)')

Như vậy tới đây Tui đã hướng dẫn đầy đủ ví dụ thứ 2, với 3 cách: Vừa thực hiện trong Excel, vừa lập trình Python theo công thức toán học để tính ra b0, b1 và predicted. Và cuối cùng là huấn luyện mô hình máy học theo thư viện sklearn. Cả 3 cách này đều cho kết quả như nhau, do đó nền tảng toán học rất quan trọng, nếu hiểu toán học để áp dụng thì việc sử dụng thư viện sẽ thuận tiện hơn vì ta đã hiểu được bản chất.

Source code của huấn luyện mô hình các bạn tải ở đây:

https://www.mediafire.com/file/8v5wwoy6hxf0ezd/MLLinearRegression1.py/file

Các bạn chú ý làm lại bài này nhiều lần

Bài học sau Tui sẽ trình bày về Hồi quy tuyến tính đa biến (Multiple Linear Regression), các Bạn chú ý theo dõi.

Chúc các bạn thành công

One thought on “Bài 54: Phương trình hồi quy tuyến tính – Mô hình đơn biến(tt)”

Leave a Reply