🎓 Bài 2 – Dự án Dự đoán Giá nhà bằng Linear Regression
I. Mô tả dự án: Bài toán dự đoán giá nhà
Trong bài 2, chúng ta xây dựng một dự án nhỏ nhưng rất thực tế: dùng kiến thức toán & lập trình để dự đoán giá nhà.
1. Kịch bản thực tế
Bạn là một tư vấn bất động sản.
Bạn có dữ liệu các căn nhà đã bán trước đây: diện tích và giá bán.
Khi có khách hỏi: “Nhà 50m² thì giá khoảng bao nhiêu?” – bạn muốn có một mô hình AI nhỏ trả lời giúp.
2. Dữ liệu sử dụng trong bài
Để đơn giản, ta dùng dữ liệu giả lập nhỏ:
STT
Diện tích (m²) – x
Giá bán (triệu) – y
1
40
900
2
60
1400
3
80
1800
4
100
2300
Mục tiêu của mô hình:
Học từ 4 điểm dữ liệu trên, tìm ra một đường thẳng y = w·x + b sao cho:
– Gần với các điểm đã biết nhất có thể.
– Dùng được để dự đoán cho các diện tích khác (50m², 70m²,...).
II. Mô hình Linear Regression cho giá nhà
1. Dạng hàm mô hình
Ta giả sử mối quan hệ giữa diện tích nhà và giá nhà là gần tuyến tính, nên dùng mô hình:
ŷ = w·x + b
ŷ: giá nhà mô hình dự đoán (triệu)
x: diện tích (m²)
w: “giá tăng thêm” khi diện tích tăng 1m² (độ dốc)
b: giá cơ bản (khi x=0 – chỉ là tham số để mô hình linh hoạt hơn)
2. Hàm mất mát (Loss function)
Mô hình không thể chính xác 100% với mọi điểm, nên ta đo “độ sai” bằng MSE:
L(w, b) = (1/n) · Σ (ŷᵢ − yᵢ)² = (1/n) · Σ (w·xᵢ + b − yᵢ)²
Trong đó:
n: số dữ liệu (ở đây n = 4)
(xᵢ, yᵢ): dữ liệu thật
ŷᵢ: giá mô hình dự đoán cho xᵢ
Mục tiêu chính: Tìm bộ (w, b) sao cho giá trị L(w, b) nhỏ nhất.
→ Đây chính là bài toán tối ưu hàm nhiều biến (biến là w và b).
III. Gradient Descent cho 2 tham số (w, b)
1. Nhắc lại ý tưởng từ bài 1
Ở bài 1, với hàm 1 biến f(x), ta cập nhật:
x_new = x_old − η·f'(x_old)
Trong đó η (eta) là learning rate – bước đi mỗi lần cập nhật.
2. Bây giờ với 2 biến (w, b)
Hàm mất mát L phụ thuộc vào 2 biến:
L = L(w, b)
Gradient (đạo hàm riêng):
∂L/∂w = (2/n) · Σ (w·xᵢ + b − yᵢ)·xᵢ
∂L/∂b = (2/n) · Σ (w·xᵢ + b − yᵢ)
Ý nghĩa:
– Nếu ∂L/∂w > 0, tức tăng w làm Loss tăng → ta phải giảm w.
– Nếu ∂L/∂b < 0, tức tăng b làm Loss giảm → ta nên tăng b (vì trừ số âm thành cộng).
IV. Code Python – Tự viết Linear Regression từ đầu
Phần này học sinh có thể copy code để chạy trên VS Code, IDLE hoặc Google Colab.
1. Khởi tạo dữ liệu & hàm Loss
# Dữ liệu giá nhà: diện tích (m2) và giá (triệu)
X = [40, 60, 80, 100]
Y = [900, 1400, 1800, 2300]
n = len(X)
def predict(x, w, b):
return w*x + b
def compute_loss(w, b):
total = 0.0
for i in range(n):
y_pred = predict(X[i], w, b)
total += (y_pred - Y[i])**2
return total / n
2. Thuật toán Gradient Descent học w và b (có in từng bước)
X = [40, 60, 80, 100]
Y = [900, 1400, 1800, 2300]
n = len(X)
def predict(x, w, b):
return w*x + b
def compute_loss(w, b):
total = 0.0
for i in range(n):
y_pred = predict(X[i], w, b)
total += (y_pred - Y[i])**2
return total / n
# Khởi tạo
w = 0.0
b = 0.0
learning_rate = 0.00001
epochs = 20000
print("BẮT ĐẦU QUÁ TRÌNH HỌC...\n")
for epoch in range(epochs+1):
dw = 0.0
db = 0.0
for i in range(n):
y_pred = predict(X[i], w, b)
error = y_pred - Y[i]
dw += error * X[i]
db += error
dw = (2/n) * dw
db = (2/n) * db
w -= learning_rate * dw
b -= learning_rate * db
# In theo từng giai đoạn
if epoch % 2000 == 0:
loss = compute_loss(w, b)
print(f"Epoch {epoch:5d} | w={w:8.4f} | b={b:8.4f} | loss={loss:10.2f}")
print("\nKẾT THÚC HỌC")
print("w cuối cùng =", w)
print("b cuối cùng =", b)
print("Loss cuối cùng =", compute_loss(w, b))
3. Dùng mô hình để dự đoán giá nhà
def predict(x, w, b):
return w*x + b
# Giả sử sau khi train xong, ta có:
# (Bạn copy w, b in ra từ đoạn code phía trên)
w = 20.0
b = 100.0
areas = [50, 70, 120]
for a in areas:
price = predict(a, w, b)
print(f"Diện tích {a:3d} m2 -> Giá dự đoán ≈ {price:8.2f} triệu")
Gợi ý dạy học:
– Cho học sinh thay đổi learning_rate (0.000001, 0.0001, ...) để xem mô hình học nhanh/chậm ra sao.
– Cho học sinh in thử 10 dòng đầu và 10 dòng cuối để xem w, b tiến dần về giá trị ổn định.
V. Demo trực quan trên web (JS mô phỏng Python + vẽ biểu đồ)
1. Mô phỏng quá trình học:
Bấm nút bên dưới để xem JS thực hiện Gradient Descent giống hệt code Python, in ra w, b, loss theo từng giai đoạn.