Neural Network

Xây dựng NN model đơn giản dự đoán giá nhà

Xây dựng NN model đơn giản dự đoán giá nhà

Sau một số bài về lý thuyết thì hôm nay chúng ta sẽ bắt tay vào thực hành code một bài toán mẫu giáo, áp dụng những lý thuyết mà ta đã tìm hiểu xem sao nhé!

Thông tin về bài toán và yêu cầu đặt ra như sau:

  1. Quy tắc tính giá nhà như sau: 50k + 50k/bedroom. Ví dụ: nhà có 1 bedroom thì giá sẽ là 100k, nhà có 2 bedrooms thì giá sẽ là 150k, …
  2. Xây dựng một NN model để dự đoán giá tiền của một căn nhà có 7 phòng ngủ.
  3. So sánh giá của căn nhà đó theo 2 cách: tính theo các thông thường và theo kết quả dự đoán của NN model.

Mình giả sử là các bạn đã cài sẵn môi trường trên máy tính của các bạn (hoặc các bạn có thể sử dụng colab cũng được.). Chúng ta sẽ sử dụng tensorflow 2.3.0 và numpy 1.18.5

Đầu tiên, import và kiểm tra thư viện:

1 import tensorflow as tf
2 import numpy as np
3 import os
4 from tensorflow import keras
5
6 print(tf.__version__)
7 print(np.__version__)
8 print(tf.config.list_physical_devices('GPU'))

Kết quả:

2.3.0
1.18.5
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

Máy của các bạn có thể không có GPU cũng không sao, vì bài này rất đơn giản nên cũng không cần đến GPU. Các bài sau thì nên có vì như thế thời gian train model sẽ nhanh hơn rất nhiều.

Tiếp theo, chúng ta sẽ tạo ra dữ liệu huấn luyện dựa theo quy tắc tính giá nhà như trong đề bài:

9  x_train = np.array([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], dtype=float)
10 y_train = np.array([100.0, 150.0, 200.0, 250.0, 300.0, 350.0], dtype=float)

Mỗi phần tử của x_train là số phòng ngủ của căn nhà, còn mỗi phần tử của y_train là giá nhà tương ứng với số phòng ngủ đó.

Bây giờ là lúc chúng ta xây dựng NN model:

11 model = keras.Sequential([
12    keras.layers.Dense(units=1, input_shape=[1])
13 ])
14 model.compile(optimizer='sgd', lost='mse')

Dòng 11-13 định nghĩ một NN model với chỉ một layer, một input có kích thước là 1. Dòng 14, model được compiled, sử thuật toán tối ưu SGD và Lost Function là MSE (Mean Square Error).

Đến đây, model đã sẵn sàng để train:

15 model.fit(x_train, y_train/255, epochs=1000)

Model được train với dữ liệu train đã tạo ở bên trên, số lượng epoch là 1000. Chú ý rằng ở đây, y_train được chia cho 255. Mục đích của việc scale down này là để model không bị quá bias vào giá trị của y_train khi mà giá trị của y_train lớn hơn giá trị của x_train rất nhiều.

Output:

Epoch 1/1000
1/1 [==============================] - 0s 1ms/step - loss: 37.2759
Epoch 2/1000
1/1 [==============================] - 0s 920us/step - loss: 17.2548
Epoch 3/1000
1/1 [==============================] - 0s 525us/step - loss: 7.9884
..................
Epoch 998/1000
1/1 [==============================] - 0s 535us/step - loss: 3.0594e-06
Epoch 999/1000
1/1 [==============================] - 0s 938us/step - loss: 3.0372e-06
Epoch 1000/1000
1/1 [==============================] - 0s 1ms/step - loss: 3.0151e-06

Ta thấy giá trị loss giảm từ 37.2759 đến 3.0151e-06. Một con số khá thấp.

Cuối cùng, ta sẽ dùng model vừa trained để dự đoán giá của ngôi nhà có 7 phòng ngủ.

16 prediction = model.predict([7.0])
17 print(prdiction * 100)

Kết quả:

[[400.25043]]

Giá của ngôi nhà nếu tính theo cách thông thường sẽ là 400$. So sánh 2 kết quả ta thấy chúng khá gần nhau. Như vậy là model đã làm việc khá tốt. Bạn có thể tăng số epochs lên và train lại model, sau đó kiểm trả lại kết quả dự đoán xem nó có được cải thiện hay không!

OK, như vậy là chúng ta đã giải quyết xong yêu cầu của bài toán. Đây chỉ là 1 bài tập trình độ mẫu giáo để chúng ta làm quen với việc sử dụng tensorflow để xây dựng NN model. Trong các bài sau, chúng ta sẽ giải quyết các bài toán phức tạp hơn.

Source code của bài này, các bạn có thể tham khảo trên github cá nhân của mình tại đây.

Tham khảo