[AIviVN 5 - Bandwidth Prediction 2] 1st place solution

bandwidth_prediction

#1

Sau đây là soure code của nhóm.

1. Preparing Data:

Bộ data của cuộc thi được thu thập từ 0h ngày 1/10/2017 đến 23h ngày 9/3/2019. Data tuy nhiều, nhưng khi plotting để khảo sát data thì thấy có khá nhiều giai đoạn bị noise nên nhóm mình quyết định bỏ đi những phần noise đó trước khi thực hiện train model.

2. Feature Engineering:

Feature hiện có gồm: UPDATE_TIME, HOUR_ID, ZONE_CODE.

  • Về ZONE_CODE, thống kê cho thấy chỉ có 3 loại là zone01, zone02, zone03. Chúng hoàn toàn tách biệt và không hề có mối quan hệ gì với nhau nên ta lại tiếp tục chia nó thành 3 phần và xây dựng 3 model riêng cho từng zone.

  • Với 2 feature còn lại về thời gian UPDATE_TIME và HOUR_ID. Để hiểu rõ hơn về lưu lượng từng mốc thời điểm trong data, ta tạo thêm một vài feature mới từ feature đã có:

    • count_date: Lấy ngày đầu tiên (1/10/2017) ở bộ train làm mốc bằng 0, đến ngày cuối cùng trong bộ train (9/3/2019) sẽ là 524.

    • day_of_week: Biểu thị cho thứ trong tuần. Với các giá trị từ 0 đến 6 tương ứng với các ngày trong tuần từ thứ 2 đến chủ nhật.

Như vậy, các feature hiện tại ta có thể dùng để predict là count_date, day_of_week và HOUR_ID.

3. Building Model:

Yêu cầu đề bài là dự đoán BANDWIDTH_TOTAL và MAX_USER. Sau khi thống kê và plotting dữ liệu, nhận thấy BANDWIDTH_TOTAL và MAX_USER liên quan mật thiết đến nhau. Do đó nhóm sử dụng cùng một phương pháp dự đoán cho cả 2 loại nhãn.

Sau khi plotting dữ liệu theo trung bình, trung vị, min và max của từng ngày, nhận thấy mức độ chênh lệch giữa các giờ trong ngày và giữa các ngày trong tuần, bên cạnh đó dữ liệu có dạng tuyến tính theo ngày. Vì vậy, model được xây dựng xoay quanh linear regression để giải quyết bài toán.

Bắt đầu với việc xây dựng model cho từng phần như đã chia, đầu tiên là với bandwidth của zone 1, ở mỗi một ngày, chúng ta đã lấy giá trị trung bình tương ứng của ngày đó (nhóm theo UPDATE_TIME và tính mean), plotting và tiếp tục xem xét bỏ đi những phần tăng hoặc giảm quá đột ngột (những phần giảm đột ngột chính thường rơi vào dịp tết âm lịch hàng năm).

Từ đó ta dùng linear regression học (theo feature count_date) để có thể precdict giá trị trung bình theo mỗi ngày. Nhìn kĩ hơn thì ta thấy rằng plot có đường cong giống với trong phương trình bậc 2 nên ta dùng linear regression bậc 2 theo count_date.

Để có thể dự đoán được giá trị chính xác từng giờ trong ngày khi biết giá trị trung bình của ngày hôm đó, ta sử dụng tỉ lệ giữa giá trị trung bình từng giờ trong tuần (nhóm theo day_of_week, HOUR_ID và tính mean) với giá trị trung bình một ngày trên toàn bộ bộ train. Cuối cùng dùng tỉ lệ này nhân với giá trị trung bình hàng ngày ta tìm được thì có được toàn bộ kết quả dự đoán trên tập test.

4. Tổng kết:

  • Bước 1: Xử lý data cơ bản ban đầu (bỏ dữ liệu noise, chuyển đổi datatime, chia nhỏ data…), tiếp đến tiến hành tạo ra những feature mới để chuẩn bị train gồm những feature sau: count_date, day_of_week.

  • Bước 2: Quan sát lấy giá trị trung bình theo từng ngày, sau đó áp dụng linear regression bậc 2 và học theo feature count_date để có thể predict giá trị trung bình theo mỗi ngày.

  • Bước 3: Sử dụng giá trị trung bình từng giờ trong tuần tỉ lệ với giá trị trung bình một ngày trên toàn bộ bộ train. Sau đó kết hợp giá trị tìm được ở bước 2 và tính ra toàn bộ.

Lưu ý: ở phần tỉ lệ, lần đầu mình lấy nhầm giá trị trung bình từng giờ trong tuần tỉ lệ với giá trị trung bình một giờ trên bộ train. Sau này có sửa lại để submit thì điểm bị tệ hơn 0.00058 so với lúc đầu. Vì thế mình giữ lại code cũ xD.


#2

Lời giải ấn tượng, không cần sử dụng những technique quá phức tạp, cảm ơn các bạn


#3

Anh có thể cho keyword của linear regression bậc 2 bằng tiếng anh hay bài báo nào về nó đc ko ạ.


#4

À, keyword là polynomial regression. Trong khóa Machine Learning của Andrew có nói rõ về nó, bạn có thể tìm xem

Trong bài này ở mục 4.1 cũng có nói tới


#5

Dạ e cảm ơn a nhiều lắm.