[AIVIVN-bandwidth_prediction] 3rd place solution

bandwidth_prediction

#1

Link source code ở đây

Các bạn có thể nhấn nút “fork kernel” để chạy lại code và reproduce kết quả. File output là “sub_aivn.csv”.

Dưới đây là mô tả về cách tiếp cận của mình:

  1. Data

Data của cuộc thi được collect từ ngày 01/10/2017 đến ngày 09/03/2019 (khá nhiều!) nhưng thực tế khi mình visualize giá trị bandwidth và max_user lên thì thấy rằng data càng nhiều thì càng noise nên mình quyết định chỉ sử dụng data từ sau Tết 2019. Sau khi chạy vài experiments, thì mình chốt chỉ sử dụng đúng 1 tuần của data: từ 02/03/2019 đến 09/03/2019.

  1. Metric đánh giá MAPE

Tại sao là MAPE? Trong bài toán thực tế, khi giá trị prediction của các bạn phân thành nhiều cụm lớn nhỏ khác nhau thì việc đánh giá bằng mean absolutely error (MPE) không phản ánh được nhu cầu của người dùng.

Ví dụ: một người chủ có 2 cửa hàng A và B, lượng khách trung bình của cửa hàng A là 10 người/ngày (do cửa hàng A nhỏ), lượng khách trung bình của cửa hàng B là 1000 người/ ngày. Nếu bạn được giao cho việc build 1 model dự đoán số lượng khách của cả 2 cửa hàng A,B, sau đó bạn report lại là model của bạn có thể dự đoán sai lệch trong khoảng +/- 9 khách thì khi đó người chủ có “happy” khi apply model của bạn vào cửa hàng A không? Đó là lý do MAPE ra đời, sau khi bạn optimize model theo MAPE, bạn có thể report lại là model của bạn có sai số 10%, tức là đối với cửa hàng A, bạn có thể lệch +/-1 người, đối với cửa hàng B là +/- 100 người.

Sau khi hiểu về MAPE, quay lại với cuộc thi, chúng ta thấy rằng đối với các server có bandwidth càng nhỏ, thì việc dự đoán lệch càng ảnh hưởng nhiều đến kết quả. Nên mình apply các tricks sau:

  • dùng giá trị mean_bandwith của server trong 1 tuần data, để dự đoán đối với tất cả server có min_bandwith > 200. (mean hay median trong bài toán này không khác biệt nhiều)
  • đối với các server có min_bandwidth < 200, tính giá trị MAPE tối đa mà server đó “xui nhất” có thể nhận được theo công thức: MAPE = (max_bandwith - min_bandwith)*100/min_bandwith. Chỉ dùng mean_ bandwidth để dự đoán với các server có MAPE < 100%.
  • Các trường hợp còn lại dự đoán là 0, để đảm bảo MAPE cho các trường hợp này là 100%.
  • Tương tự cho MAX_USER.

Và như vậy, chúng ta đạt được 78.5% trên public dataset và 80.3% trên private dataset


#2

hay quá a ơiiiiiiiiii


Tổng kết cuộc thi “Dự đoán lưu lượng server" trên AIviVN