MLArena

Dự đoán giá nhà ở Hà Nội

Ộ Ể Ặ Ẫ Ỹ Ở Ừ ộ ể ặ ẫ ỹ

Bạn có 90 phút để dự đoán giá thuê nhà. Điểm được chấm trên tập kiểm tra ẩn; bảng xếp hạng public chỉ dùng 30% dữ liệu, kết quả cuối cùng dùng điểm private.

HạngThí sinhĐiểmTổng
1Uma Lê0.9344101.90
2Thảo Bùi0.763181.62
3Quang Đỗ0.681751.00
Đã chấm · 08/11 07:37

Mã nguồn (khối mã và mã trong dòng) luôn dùng JetBrains Mono, giống nhau ở cả năm font.

Dự đoán giá nhà ở Hà Nội

Dự đoán giá thuê căn hộ theo tháng từ vị trí, diện tích, tiện ích và lịch sử giao dịch.

Bối cảnh

Thị trường nhà ở Hà Nội biến động mạnh trong năm năm qua. Một công ty môi giới muốn có mô hình dự đoán giá thuê theo tháng cho từng căn hộ, dựa trên vị trí, diện tích, tiện ích và lịch sử giao dịch. Mô hình tốt giúp người thuê so sánh giá nhanh hơn và giúp chủ nhà đặt giá sát với thị trường.

Bạn nhận được dữ liệu của 48.215 căn hộ ở 12 quận nội thành, thu thập từ tháng 01/2021 đến tháng 06/2026. Mỗi dòng là một tin đăng đã có giao dịch thành công. Giá ghi bằng triệu đồng mỗi tháng; ví dụ 12.5 nghĩa là 12.500.000 ₫.

Dữ liệu tốt quan trọng hơn mô hình phức tạp. Hãy dành thời gian đọc dữ liệu trước khi huấn luyện.

— Ban tổ chức

Nhiệm vụ

Với mỗi căn hộ trong tập kiểm tra, dự đoán giá thuê price (triệu đồng/tháng). Bài tập này là bài toán hồi quy; bạn có thể dùng bất kỳ thư viện nào, miễn là không dùng dữ liệu ngoài danh sách được phép ở mục Quy định.

Các bước gợi ý:

  1. Đọc train.csv và kiểm tra các cột bị thiếu.
  2. Tạo đặc trưng mới, ví dụ:
    • giá trung bình theo quận và theo năm;
    • khoảng cách đến hồ Hoàn Kiếm (km);
    • số tiện ích trong bán kính 500 m.
  3. Huấn luyện mô hình và đánh giá bằng cross-validation theo thời gian.
  4. Nộp file submission.csv đúng định dạng.

Lưu ý

Tập kiểm tra chỉ gồm các giao dịch sau ngày 01/01/2026, nên chia dữ liệu theo thời gian sẽ sát với điểm thật hơn chia ngẫu nhiên.

Dữ liệu

CộtKiểuMô tảVí dụ
idsố nguyênMã căn hộ, duy nhất10342
districtchuỗiQuậnCầu Giấy
areasố thựcDiện tích (m²)68.5
bedroomssố nguyênSố phòng ngủ2
floorsố nguyênTầng17
built_yearsố nguyênNăm xây dựng2018
lat, lonsố thựcTọa độ21.0368, 105.7826
pricesố thựcGiá thuê (triệu đồng/tháng)14.20

Thống kê nhanh trên tập huấn luyện:

QuậnSố cănGiá trung vịDiện tích TB (m²)
Hoàn Kiếm2.10421.5062.3
Ba Đình4.81716.8071.9
Cầu Giấy7.39213.4074.6
Đống Đa6.05512.9066.1
Hà Đông9.2888.7081.4

Đoạn mã đọc dữ liệu mẫu:

import pandas as pd

train = pd.read_csv("train.csv", parse_dates=["listed_at"])
train["age"] = train["listed_at"].dt.year - train["built_year"]

# Giá trung vị theo quận, dùng làm đặc trưng
median = train.groupby("district")["price"].median().rename("district_median")
train = train.join(median, on="district")
print(train[["district", "area", "age", "district_median"]].head())

Cách chấm điểm

Điểm là RMSLE (Root Mean Squared Logarithmic Error) giữa giá dự đoán y^i\hat{y}_i và giá thật yiy_i:

RMSLE=1n∑i=1n(log⁡(1+y^i)−log⁡(1+yi))2\text{RMSLE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} \left( \log(1 + \hat{y}_i) - \log(1 + y_i) \right)^2}

Điểm càng thấp càng tốt. Vì dùng logarit, sai 2 triệu với căn giá 5 triệu bị phạt nặng hơn sai 2 triệu với căn giá 40 triệu. Nếu y^i<0\hat{y}_i < 0, hệ thống coi y^i=0\hat{y}_i = 0.

Với một mô hình tuyến tính có trọng số w\mathbf{w}, bạn có thể tối ưu trực tiếp trên zi=log⁡(1+yi)z_i = \log(1 + y_i) với hàm mất mát

L(w)=1n∑i=1n(w⊤xi−zi)2+λ∥w∥22.\mathcal{L}(\mathbf{w}) = \frac{1}{n} \sum_{i=1}^{n} \left( \mathbf{w}^\top \mathbf{x}_i - z_i \right)^2 + \lambda \lVert \mathbf{w} \rVert_2^2 .

Mẹo

Huấn luyện trên log1p(price) rồi dùng expm1 để đổi lại. Cách này thường giảm RMSLE từ 0.25 xuống khoảng 0.19 chỉ với LightGBM mặc định.

Bảng xếp hạng public dùng 30% tập kiểm tra; kết quả cuối cùng dùng 70% còn lại (private) và chỉ công bố sau khi kết thúc.

Định dạng bài nộp

File CSV có tiêu đề, đúng một dòng cho mỗi id trong test.csv:

id,price
10342,14.20
10343,9.85
10344,22.10

Kiểm tra nhanh trước khi nộp:

head -n 3 submission.csv
wc -l submission.csv   # phải bằng 9.644 dòng (kể cả tiêu đề)

Quan trọng

Mỗi ngày bạn được nộp tối đa 5 bài. Bạn có thể chọn 2 bài để tính điểm private; nếu không chọn, hệ thống lấy 2 bài có điểm public tốt nhất.

Quy định

  • Làm bài cá nhân hoặc theo đội tối đa 3 người.
  • Được dùng dữ liệu công khai về bản đồ (OpenStreetMap) và lịch nghỉ lễ; dữ liệu giá từ trang môi giới khác không được phép.
  • Không chia sẻ mã hoặc dự đoán giữa các đội trong thời gian thi.
  • Đội đạt giải phải gửi mã nguồn tái tạo được kết quả1.

Cảnh báo

Bài nộp có dấu hiệu dùng nhãn của tập kiểm tra sẽ bị loại, kể cả khi điểm public không thay đổi.

Thận trọng

Không đăng dữ liệu cuộc thi lên nơi công khai. Dữ liệu chỉ dùng cho mục đích học tập trong MLArena.

Danh sách kiểm tra

  • Đọc kỹ đề bài
  • Tải dữ liệu
  • Nộp bài đầu tiên với mô hình cơ sở
  • Thử ít nhất ba nhóm đặc trưng

Câu hỏi thường gặp

Có được dùng mô hình đã huấn luyện sẵn không? Có, nếu mô hình công khai trước ngày bắt đầu và bạn ghi rõ nguồn trong báo cáo.

Điểm hòa thì xếp thế nào? Đội nộp bài sớm hơn xếp trên. Xem thêm hướng dẫn chung của MLArena.

Tôi có thể hỏi ban tổ chức ở đâu? Hãy dùng mục thảo luận của bài tập; câu trả lời được ghim cho mọi người cùng đọc2.

Chú thích

  1. Mã nguồn chạy được trên máy có 16 GB RAM trong không quá 2 giờ. ↩

  2. Ban tổ chức trả lời trong vòng 24 giờ vào ngày làm việc. ↩