Đào tạo mô hình hồi quy tuyến tính đa biến cơ bản (Linear regression multiple variables) với Tensorflow

Chia sẻ, hướng dẫn đào tạo một mô hình hồi quy tuyến tính đa biến cơ bản. Với bài toán đơn giản như bài toán xác định giá nhà theo các biến phụ thuộc đầu vào
+ Input: Tổng diện tích, số phòng, khoảng cách tới trung tâm thành phố,…
+ Output: Giá nhà.

Ở bài toán ví dụ này, mình sẽ chỉ sử dụng 3 biến phụ thuộc đầu vào như sau, trường hợp nhiều biến hoặc ít biến hơn thì các bạn làm tương tự nhé.
+ Tổng diện tích
+ Số phòng
+ Khoảng cách tới trung tâm thành phố

Chuẩn bị dữ liệu:

Các bạn sẽ cần chuẩn bị 1 file .CSV để lưu trữ dữ liệu đào tạo và thử nghiệm.
File mẫu các bạn có thể tải tại đây:

File .CSV bao gồm 1 trường giá nhà và 3 trường biến phụ thuộc:

Thực hiện lần lượt các bước dưới đây để đào tạo và thử nghiệm mô hình: (Mình sử dụng Google Colab)

Bước 1: Khởi tạo và liên kết Google Drive (Chỉ cần thực hiện bước này nếu dùng Google Colab)

!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}
!mkdir -p drive
!google-drive-ocamlfuse drive

Bước 2: Cài đặt Tensorflow

 !pip install tensorflow==1.13.1 

Bước 3: Import các thư viện cần thiết

from sklearn.model_selection import train_test_split
import tensorflow as tf
import numpy as np

Bước 4: Load dữ liệu từ file .CSV ban đầu chúng ta đã chuẩn bị

outputs = []
fvecs = []
with open("drive/hoi_quy/gia_nha.csv", "r") as ins:
  for line in ins:
    row = line.split(",")
    outputs.append(float(row[0]))
    fvecs.append([float(x) for x in row[1:]])

X_data = np.matrix(fvecs)
y_data = np.array(outputs)
y_data = y_data.reshape(len(y_data), 1)
y_data.shape

Bước 5: Chia dữ liệu thành tập Training (80%) và Testing (20%)

 X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size=0.2, random_state=42)

Bước 6: Cấu hình model

# Placeholder for pass data
X = tf.placeholder(tf.float32, [None, 3], name="I")
Y = tf.placeholder(tf.float32, [None, 1], name="O")
# Trainable weights
W = tf.Variable(tf.ones([3, 1]))
b = tf.Variable(np.random.randn(), dtype=tf.float32)
pred = tf.add(tf.matmul(X, W), b)
loss = tf.reduce_mean(tf.square(pred - Y))
learning_rate = 0.00000005
optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)
init = tf.global_variables_initializer()
sess = tf.Session()

Bước 7: Training…

# Training
sess.run(init)
epochs = 10000
loss_history = []
for epoch in range(epochs):
    sess.run(optimizer, feed_dict={X: X_train, Y: y_train})
    test_loss = sess.run(loss, feed_dict={X : X_test, Y: y_test})
    loss_history.append(test_loss)
    if epoch % 100 == 0:
        print("Epoch {} Test loss = {}".format(epoch, test_loss))
print("Training finished")

Bước 8: Thử nghiệm với 1 giá trị

pred_y = sess.run(pred, feed_dict={
    X : [[120, 3, 1]]
})
print(pred_y)

Kết quả cho ra: [1.1422744e+09]] . Có nghĩa là 1142274400 (1 tỉ 1 trăm 42 triệu…)
Cũng khá chuẩn đó nhỉ

CHÚC BẠN THÀNH CÔNG !

5 2 votes
Article Rating
Subscribe
Notify of
guest
2 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Nam Vũ
Nam Vũ
3 months ago

Rất hay và dễ hiểu ạ

2
0
Would love your thoughts, please comment.x
()
x