Download as pdf or txt
Download as pdf or txt
You are on page 1of 11

9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

XÂY DỰNG MÔ HÌNH HỒI QUY TUYẾN TÍNH ĐƠN

In [11]: import matplotlib.pyplot as plt


import numpy as np

%matplotlib inline
# 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.6
8]]).T

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 1/11
9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

In [13]: # Visualize data


def _plot(x, y, title="", xlabel="", ylabel=""):
plt.figure(figsize=(14, 8))
plt.plot(x, y, 'r-o', label="price")
x_min = np.min(x)
x_max = np.max(x)
y_min = np.min(y)
y_max = np.max(y)

# mean price
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()

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

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 2/11
9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

In [3]: #Tính hệ số beta 0, beta 1


# 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 beta 0, beta 1


beta1 = (xbar*ybar-xybar)/(xbar**2-(x2bar))
beta0 = ybar-beta1*xbar

print('beta1: ', beta1)


print('beta0: ', beta0)

beta1: 0.011184099238793658
beta0: 0.6626458979418968

XÂY DỰNG MÔ HÌNH HỒI QUY TUYẾN TÍNH ĐA BỘI

Do mô hình hồi quy tuyến tính đa bội cách tính toán sẽ phức tạp hơn đơn biến rất nhiều Nên chúng ta sẽ sử
dụng package Sklearn để huấn luyện mô hình Trong qui trình xây dựng và huấn luyện mô hình chung chúng ta
sẽ lần lượt đi qua các bước chính.

Thu thập dữ liệu.


Làm sạch dữ liệu.
Lựa chọn dữ liệu đầu vào.
Chuẩn hoá dữ liệu.
Phân chia tập huấn luyện/kiểm tra (tập train/test).
Huấn luyện và đánh giá mô hình.

In [4]: from sklearn import linear_model

# area
x1 = np.array([[73.5,75.,76.5,79.,81.5,82.5,84.,85.,86.5,87.5,89.,90.,91.5]]).
T
# distance to center
x2 = np.array([[20, 18, 17, 16, 15, 14, 12, 10, 8, 7, 5, 2, 1]]).T
# input matrix X
X = np.concatenate([x1, x2], axis = 1)

# 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.6
8]]).T

Tiếp theo chúng ta sẽ vẽ biểu đồ giữa khoảng cách tới trung tâm và giá nhà. Quá trình vẽ biểu đồ này rấy quan
trọng vì nó giúp ta có một cái nhìn tổng quan về mối quan hệ giữa các điểm dữ liệu và phát hiện những bất
thường dữ liệu

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 3/11
9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

In [5]: import matplotlib.pyplot as plt

_plot(x2, y,
title='Giá nhà theo khoảng cách tới TT',
xlabel='Khoảng cách tới TT (km)',
ylabel='Giá nhà (tỷ VND)')

Ta nhận thấy rằng khi khoảng cách tới trung tâm giảm thì giá nhà càng tăng. Nhận định này càng củng cố thêm
việc lựa chọn biến khoảng cách tới trung tâm làm biến đầu vào là có ý nghĩa.

Tiếp theo ta sẽ huấn luyện mô hình. Trong sklearn cách thức chung khi huấn luyện mọi mô hình đều là khởi tạo
mô hình đó với các tham số và sau đó truyền dữ liệu vào hàm fit để huấn luyện. Đây là đặc điểm mà bạn cần
nhớ khi xây dựng mọi mô hình vì nó sẽ lặp lại như vậy.

In [6]: # fit the model by Linear Regression


regr = linear_model.LinearRegression(fit_intercept=True) # fit_intercept = Fal
se for calculating the bias

regr.fit(X, y)

# Compare two results


print( 'Coefficient : ', regr.coef_ )
print( 'Interception : ', regr.intercept_ )

Coefficient : [[0.01252422 0.00130004]]


Interception : [0.53665806]

Vậy chúng ta có phương trình hồi quy như sau: y = 0.53665806 + 0.01252422x1 + 0.00130004x2 Trong đó y:
giá nhà (tỉ đồng) x1: diện tích nhà (m2) x2: Khoảng cách đến trung tâm (km)

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 4/11
9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

ĐỒ THỊ HÓA KẾT QUẢ MÔ HÌNH

Sau khi đã huấn luyện thành công mô hình chúng ta cần trình bày kết quả của mình dưới một dạng trực quan,
dễ hiểu. Đây là một trong những kỹ năng quan trọng vì nó giúp mô hình của bạn trở nên có sức thuyết phục hơn
với mọi người.

Kỹ năng đồ thị hoá sẽ được mình giới thiệu sâu hơn ở một chương khác.

1. Biểu diễn trong không gian 2 chiều

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 5/11
9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

In [14]: ypred = regr.predict(X)


# Visualize data
def _plot_act_pred(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()

_plot_act_pred(x2, y, ypred,
title='Giá nhà theo khoảng cách tới TT',
xlabel='Khoảng cách tới TT (km)',
ylabel='Giá nhà (tỷ VND)')

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 6/11
9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

In [15]: _plot_act_pred(x1, y, ypred,


title='Giá nhà theo diện tích',
xlabel='diện tích',
ylabel='Giá nhà (tỷ VND)')

HIỆN TƯỢNG OVERFITTING

Quá khớp là hiện tượng mà mô hình chỉ khớp tốt trên tập dữ liệu huấn luyện nhưng không dự báo tốt trên dữ
liệu kiểm tra. Đây là trường hợp thường gặp khi huấn luyện các mô hình machine learning. Hiện tượng này gây
ảnh hưởng xấu và dẫn tới mô hình không thể áp dụng được vì các dự báo bị sai khi áp dụng vào thực tiễn. Có
nhiều nguyên nhân dẫn tới quá khớp. Một trong những nguyên nhân phổ biến đó là tập dữ liệu huấn luyện và
dữ liệu dự báo có phân phối khác xa nhau dẫn tới các qui luật học được ở dữ liệu huấn luyện không còn đúng
trên dữ liệu dự báo. Hoặc cũng có thể xuất phát từ phía mô hình quá nhiều tham số nên khả năng biểu diễn dữ
liệu của nó không mang tính đại diện.

Xử lý overfitting bằng hàm Ridge regression

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 7/11
9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

In [16]: from sklearn.linear_model import Ridge

# area
x1 = np.array([[73.5,75.,76.5,79.,81.5,82.5,84.,85.,86.5,87.5,89.,90.,91.5]]).
T
# distance to center
x2 = np.array([[20, 18, 17, 16, 15, 14, 12, 10, 8, 7, 5, 2, 1]]).T
# input matrix X
X = np.concatenate([x1, x2], axis = 1)
# 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.6
8]]).T

rid_regr = Ridge(alpha = 0.3, normalize = True)


rid_regr.fit(X, y)

y_pred_rid = rid_regr.predict(X)

_plot_act_pred(x1, y, y_pred_rid,
title='Giá nhà theo khoảng cách tới TT',
xlabel='Khoảng cách tới TT',
ylabel='Giá nhà (tỷ VND)')

XỬ LÝ OVERFITTING BẰNG HÀM LASSO REGRESSION

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 8/11
9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

In [17]: from sklearn.linear_model import Lasso

las_regr = Lasso(alpha = 0.005, normalize = True)


las_regr.fit(X, y)

y_pred_las = las_regr.predict(X)

_plot_act_pred(x1, y, y_pred_las,
title='Giá nhà theo khoảng cách tới TT',
xlabel='Khoảng cách tới TT',
ylabel='Giá nhà (tỷ VND)')

HỆ SỐ ĐIỀU CHỈNH ANPHA

Để lựa chọn ra một hệ số alpha phù hợp với mô hình Ridge regression chúng ta sẽ cần phải tạo ra một list các
giá trị có thể của tham số này và dùng vòng lặp for để đánh giá mô hình với trên từng giá trị của tham số. Giá trị
được lựa chọn là giá trị mà có MSE trên tập kiểm tra là nhỏ nhất.

List các giá trị kể trên còn được gọi là không gian tìm kiếm grid search.

Tiếp theo chúng ta sẽ tuning hệ số điều chuẩn anpha cho mô hình hồi qui.

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 9/11
9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

In [18]: from sklearn.linear_model import Ridge


from sklearn.model_selection import train_test_split

grid_search = np.arange(0, 1, 0.05)

def _regression(alpha, X_train, y_train, X_test, y_test, models: dict):


dict_models = {}
rid_regr = Ridge(alpha = alpha, normalize = True)
rid_regr.fit(X_train, y_train)
y_pred = rid_regr.predict(X_test)
MSE = np.mean((y_test-y_pred)**2)
dict_models["MSE"] = MSE
dict_models["model"] = rid_regr
model_name = "ridge_" + str(alpha)
models[model_name] = dict_models
return models

# Phân chia tập huấn luyện, kiểm tra


X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, rando
m_state=3)
print(X_train.shape, X_test.shape)
print(y_train.shape, y_test.shape)

(10, 2) (3, 2)
(10, 1) (3, 1)

In [19]: #Huấn luyện mô hình trên grid search.

models = {}
for alpha in grid_search:
models = _regression(round(alpha, 2), X_train, y_train, X_test, y_test, mode
ls)

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 10/11
9/14/23, 4:40 PM Thực hành xây dựng mô hình hồi quy tuyến tính

In [20]: #In kết quả huấn luyện và tìm ra mô hình tốt nhất.

i = 0
for k, v in models.items():
if i==0:
best_model = k
mse = models[k]["MSE"]
if models[k]["MSE"] < mse:
best_model = k

print("model {}, MSE: {}".format(k, models[k]["MSE"]))


i+=1

print("-----------------------------------------")
print("Best models: {}, MSE: {}".format(best_model, models[best_model]["MS
E"]))

model ridge_0.0, MSE: 1.027273909596354e-05


model ridge_0.05, MSE: 8.938384941325655e-05
model ridge_0.1, MSE: 0.00012669594338682118
model ridge_0.15, MSE: 0.00015167042816772164
model ridge_0.2, MSE: 0.00017373506532169893
model ridge_0.25, MSE: 0.00019544713216831144
model ridge_0.3, MSE: 0.0002176453268404197
model ridge_0.35, MSE: 0.00024059809009087634
model ridge_0.4, MSE: 0.00026435311416343554
model ridge_0.45, MSE: 0.0002888664738864604
model ridge_0.5, MSE: 0.00031405669060695487
model ridge_0.55, MSE: 0.0003398292382021109
model ridge_0.6, MSE: 0.00036608814011209915
model ridge_0.65, MSE: 0.00039274149040160886
model ridge_0.7, MSE: 0.0004197039603027159
model ridge_0.75, MSE: 0.00044689775824235923
model ridge_0.8, MSE: 0.0004742527852240873
model ridge_0.85, MSE: 0.0005017063756645284
model ridge_0.9, MSE: 0.0005292028346849019
model ridge_0.95, MSE: 0.0005566928879234227
-----------------------------------------
Best models: ridge_0.0, MSE: 1.027273909596354e-05

localhost:8888/nbconvert/html/Thực hành xây dựng mô hình hồi quy tuyến tính.ipynb?download=false 11/11

You might also like