Xây dựng prototype cho bài toán demand forecasting

Tuần trước, mình đã có một bài review về khóa học Machine Learning của Andrew Ng trên Coursera. Hôm nay, chúng ta cùng nhau đi xây dựng một hệ thống machine learning nho nhỏ vận dụng những kiến thức mình học được sau khóa học này nhé.

Mục tiêu

Cụ thể, hôm nay mình sẽ xây dựng chương trình cho phép dự đoán nhu cầu của khách hàng đối với từng mặt hàng trong tương lai (demand forecasting) dựa trên dữ liệu về số lượng giao dịch trong quá khứ. Thuật toán mà mình sử dụng là Linear Regression, đây là một thuật toán khá đơn giản và dễ hiểu, trên stories cũng có nhiều bài viết về thuật toán này rồi nên mình sẽ không nhắc lại nữa nhé. Dataset mà mình dùng để train thì mọi người có thể tham khảo tại đây.

Khảo sát dữ liệu

Chúng ta cùng nhìn qua tập dữ liệu để có hình dung rõ hơn về bài toán nhé:
image

Dữ liệu mình có bao gồm 50 item với 10 store, chúng ta sẽ có thông tin về số lượng bán ra trong một ngày của từng item tại mỗi store, thời gian từ 2013 đến 2017.

Rất may dataset mà mình thu được thì hoàn toàn không có bản ghi nào chứa giá trị null, trong trường hợp ngược lại thì chúng ta cần có một chút xử lý bằng cách loại bỏ các bản ghi chứa giá trị null hoặc thực hiện lấp đầy có giá trị null đó bằng chiến lược phù hợp nhé.

Do thuộc tính date đang ở định dạng chưa được phù hợp nên mình sẽ thực hiện xuất ra các thuộc tính dẫn xuất để phù hợp hơn cho hoạt động của thuật giải nhé. Cụ thể ta sẽ xuất các thông tin về ngày, tháng, năm, thứ trong tuần, quý, ngày trong năm… Ta sẽ thu được các thuộc tính dẫn xuất như sau:
image

Bây giờ ta cùng khảo sát mỗi liên hệ giữa các thuộc tính bằng ma trận hiệp phương sai nhé.

Nói qua chút về hiệp phương sai, đây là một khái niệm trong lý thuyết xác suất thống kê, đo sự biến thiên cùng nhau của hai biến ngẫu nhiên. Giá trị này nằm trong khoảng từ -1 đến 1.

  • Nếu 2 biến có xu hướng thay đổi cùng nhau, một biến có giá trị cao hơn kỳ vọng thì biến kia có xu hướng cũng cao hơn giá trị kỳ vọng, lúc này hiệp phương sai của chúng có giá trị dương.
  • Ngược lại, nếu 2 biến có xu hướng thay đổi ngược nhau, một biến nằm trên giá trị kỳ vọng thì biến kia có xu nằm dưới giá trị kỳ vọng, lúc này hiệp phương sai của chúng có giá trị âm.
  • Khi hiệp phương sai đạt 1 hoặc -1, hai biến có quan hệ tuyến tính.

image
Hình trên mô tả sự phân bố của 2 biến ngẫu nhiên tương ứng với từng giá trị hiệp phương sai khác nhau. Chúng ta có thể thấy khi hiệp phương sai bằng 1 hoặc -1 thì các điểm phân bố hoàn toàn nằm trên một đường thẳng.

Bây giờ ta cùng quan sát mối quan hệ giữa các thuộc tính với nhau nhé:
image

Màu càng đậm chứng tỏ hai thuộc tính có quan hệ càng gần quan hệ tuyến tính. Do mục tiêu của chúng ta là dự đoán sales, nên chúng ta sẽ lựa chọn các thuộc tính dùng để biểu diễn ví dụ học là các thuộc tính có giá trị hiệp phương sai với sales càng gần 1 (hoặc -1) càng tốt nhé, vì nó chứng tỏ đây là những thuộc tính quan trọng.

Cùng quan sát biểu đồ thể hiện sự biến động của sales theo từng thuộc tính nhé!
image
image
image
image

Xây dựng prototype

Ở đây mình sử dụng ngôn ngữ Python để implement hệ thống của mình, trong quá trình implement mình có sử dụng các thư viện pandas để thao tác dữ liệu, matplotlib để visualize và sklearn để chạy các thuật toán machine learning mà không mất quá nhiều công sức để tự code. Trước hết mình sẽ sử dụng các thuộc tính store, item, year, month, day, dayofweek để biểu diễn ví dụ học.Về phần code mình sẽ không trình bày ở đây. Chúng ta cùng quan sát kết quả thu được nhé!
image

Nhìn vào hai cột cuối, ta có thể thấy giá trị sales thực thế và sales dự đoán, có vẻ như chênh lệch nhau quá nhiều. Có vấn đề ở đây! Cùng vận dụng phương pháp xây dựng đường cong learning curve mà mình học được vào đây để đánh giá thuật toán nhé. Một chút về learning curve thì learning curve biểu diễn mỗi quan hệ giữa giá trị lỗi trên tập train cũng như tập test và kích thước (số lượng) ví dụ ta dùng để train hệ thống. Sử dụng learning curve có thể cho ta biết hệ thống đang bị underfit, overfit hay perfect dựa vào dạng đường cong như sau:
image

  • Hình thứ nhất thể hiện hệ thống đang bị underfit, tức khi số lượng ví dụ dùng để train tăng ta thấy giá trị lỗi trên tập train và test là tương tự nhau, song đều ở mức cao và không chấp nhận được, có nghĩa là khi hệ thống triển khai vào thực tế sẽ cho kết quả dự đoán bị lệch.
  • Hình thứ hai thể hiện hệ thống lý tưởng khi mà giá trị lỗi ở tập train và test là xấp xỉ nhau và ở mức thấp (chấp nhận được) khi số lượng ví dụ dùng để train tăng lên.
  • Hình thứ ba thể hiện hệ thống bị overfit, ta thấy giá trị lỗi trên tập train là vô cùng thấp nhưng giá trị lỗi ở tập test là lớn hơn rất nhiều và không chấp nhận được, tức hệ thống không có tính khái quát cho dữ liệu trong tương lai, và vì thế nó cũng sẽ không được sử dụng

Bây giờ cùng quan sát learning curve của chương trình chúng ta đang xây dựng nhé:
image
Có thể thấy giá trị lỗi ở tập train và test là tương đương nhau, tuy nhiên đang ở ngưỡng quá cao, hệ thống đang bị underfit!

Cải tiến hệ thống

Với hệ thống đang bị underfit, chúng ta có thể có những biện pháp cải tiến sau:

  • Sử dụng polynomial feature
  • Xác định thêm các thuộc tính mới

Chúng ta cùng bắt tay vào việc thử hai giải pháp trên nhé!

Sử dụng polynomial feature

image
Hình phía trên cho ta thấy polynomial feature là gì và tại sao phải sử dụng polynomial feature rồi phải không? Trong trường hợp dataset của chúng ta không thể được fit bởi một siêu phẳng, thì ta có thể nghĩ tới giải pháp này. Sau khi áp dụng mình thu được kết quả đường cong learning curve như sau:

image

Một so sánh cụ thể hơn giá trị lỗi cho các kích thước tập train tăng dần
image

Có thể nói giải pháp này có mang lại chút cải thiện nhưng không nhiều, hệ thống vẫn đang trong tình trạng underfit. Vậy thì hãy thử giải pháp số 2 xem sao

Xác định thêm các thuộc tính mới

Mình sẽ xử lý một chút dữ liệu ban đầu, tính toán sales trung bình cho từng item tại mỗi store, rồi sử dụng như một thuộc tính mới mean_value.
image

Quan sát ma trận hiệp phương sai nhé!


Chúng ta có thể thấy màu thể hiện mối quan hệ giữa sales và mean_value là rất đậm, hứa hẹn đây là một thuộc tính quan trọng cho phép dự đoán giá trị sales. Và quan sát kết quả cải thiện nào:
image

Kết quả dự đoán chính xác hơn đáng kể. Và cùng nhìn đường cong learning curve để đánh giá hệ thống hiện tại:
image

Gần với dáng điệu của một hệ thống lý tưởng rồi đó. So sánh tương quan giá trị lỗi trước và sau khi thêm thuộc tính cũng thấy cải thiện rất nhiều này:
image

Như vậy là chúng ta đã cùng nhau xây dựng một hệ thống đơn giản ứng dụng machine learning. Nếu mọi người có hứng thú với lĩnh vực này, có thể tham khảo khóa học mà mình đã review trước đó để có những kiến thức căn bản, sau đó có thể xây dựng một chương trình tương tự, biến những kiến thức đó thành ứng dụng thực tế, sẽ rất thú vị đấy!

3 Likes