- vừa được xem lúc

[Data Science] Nhận diện và đối đầu với data drift trong MLOps pipeline

0 0 5

Người đăng: Thang Bui

Theo Viblo Asia

Có bao giờ bạn tự hỏi tại sao model machine learning có thể hoạt động cực kỳ tốt trong quá khứ, nhưng bỗng dưng lại trở nên "kém vui" trong hiện tại không? Đó là lúc mà khái niệm data drift được ra đời trong MLOps concept, khi mà việc train model được thực hiện lặp đi lặp lại, vậy khi nào thì ta phát hiện ra dữ liệu bị thay đổi và nên cảnh báo các Data Scientist, rằng tính chất dữ liệu khác rồi anh ơi?

"Sông có lúc, data có khúc" - câu này mình chế ra

Data drift là gì nhỉ?

Vạn vật luôn đổi thay và dữ liệu của ta cũng thế, trong một MLOps pipeline, mình hiểu đơn giản là quá trình lấy data mới và huấn luyện các mô hình học máy một cách tự động. Và vì bộ siêu tham số (hyper parameters) đã được tinh chỉnh để fit với một tập data duy nhất (thường các anh DS hay thực hiện trong file csv import lên notebook), cho nên, khi có data mới được cào liên tục hàng năm/hàng tháng/hàng ngày, không có gì đảm bảo rằng tính chất toán học của tập dữ liệu mới này sẽ toàn vẹn được như cũ?

Ví dụ cho việc thay đổi:

  • Dữ liệu kinh doanh bị ảnh hưởng bởi các sự kiện đột ngột (như covid19,...)
  • Dữ liệu về chiều cao của thanh thiếu nên Việt nam năm 2000 với năm 2020 sẽ khác nhau, vì bây giờ các bạn được ăn uống đầy đủ hơn lúc trước, nên chiều cao cũng phát triển hơn.
  • ... rất nhiều trường hợp khác dữ liệu bị thay đổi về các tính chất.

Và sự thay đổi tính chất đó gọi là... data drift.

image.png

Hiểu theo mặt thống kê, data drift đơn giản là phân phối của dữ liệu bị trượt, hoặc bị thay đổi theo thời gian, ví dụ như mô hình bạn train năm 2018 hội tụ và generalize tốt với dữ liệu 2018, không có nghĩa dữ liệu sẽ có cùng ý nghĩa thống kê với của năm 2021. Và mục tiêu của mình là phải có một hệ thống tự động nhận biết được thời điểm 2021, tức là thời điểm dữ liệu bị thay đổi tính chất, và thực hiện việc cảnh báo (alert) cho các MLOps EngineerData Scientist.

Sau khi biết data bị drift thì người ta thường làm gì nhỉ, thật ra thì có nhiều cách lắm, nhưng xoay quanh vẫn là tìm cách để huấn luyện (train) lại mô hình (model):

  • Train mô hình với data gộp giữa cũ và mới.
  • Train mô hình với chỉ mỗi data mới.
  • Train mô hình với bộ siêu tham số mới (cần được tuning lại bởi data scientist).
  • ....
  • Và best practice thì thường là không có, mà sẽ phụ thuộc vào quyết định của các data scientist, là những người hiểu rõ nhất về tính chất của dữ liệu mà họ đang làm.

image.png

Phương pháp tối ưu để phát hiện data drift

Có rất nhiều phương pháp để phát hiện data drift, nhưng phương pháp vừa có ý nghĩa về mặt thống kê, vừa có kết quả thực tế, hiệu quả và giải thích được đó chính là sử dụng một kiểm định tên là kiểm định Kolmogorov-Smirnov (K-S Test) , có người còn gọi là Goodness-of-Fit Test.

Nghe lạ quá nhỉ? Nhưng về ý nghĩa toán học - thống kê nó không có gì cao siêu cả, chỉ đơn giản là kiểm định xem hai phân phối của hai mẫu có khác biệt tính chất với nhau không.

Nó có một metric để đo lường sự khác biệt biểu diễn như sau:

DKS=supxF1(x)F2(x)D_{KS} = \sup_{x} |F_{1}(x) - F_{2}(x)|

Trong đó:

  • F1(x)F_{1}(x) là hàm phân phối tích lũy của tập data trong quá khứ.
  • F2(x)F_{2}(x) là hàm phân phối tích lũy của tập data mới.

Nếu giá trị DKSD_{KS} càng lớn, càng xảy ra data drift.

Kiểm định HH: (cho 2 mẫu nha)

{H0:Hai maˆ˜u dữ liệu được ruˊt ra từ cuˋng một phaˆn phoˆˊi.H1:Hai maˆ˜u dữ liệu khoˆng được ruˊt ra từ cuˋng một phaˆn phoˆˊi\begin{cases} H_0 :& \text{Hai mẫu dữ liệu được rút ra từ cùng một phân phối.} \\ H_1 :& \text{Hai mẫu dữ liệu không được rút ra từ cùng một phân phối} \end{cases}

Bác bỏ H0H_0 khi pvaluep-value của kiểm định Kolmogorov-Smirnov (K-S) nhỏ hơn mức ý nghĩa đã chọn (ví dụ 0.050.05 chẳng hạn). Tính pvaluep-value liên hệ như nào với DKSD_{KS} thì mình sẽ không đi sâu ở bài viết này để tránh việc dài dòng. Vậy thì... thực hành thôi!

Sử dụng Python để detect data drift

  1. Thư viện mà mình cần dùng ở đây hết sức quen thuộc, đó là scipy, khỏi phải giới thiệu nhiều vì package này quá quen thuộc với các bạn data science rồi, cho những ai chưa biết thì đây là một thư viện chứa rất nhiều hàm thống kê của Python. Cách cài đặt đơn giản bằng pip thôi:
pip install scipy
  1. Sử dụng ks_2samp nằm trong module scipy.stats như sau:
from scipy import stats
test = stats.ks_2samp(df[column], df_new[column])
  • Ở đây mình đang thực hiện việc test ở hai dataframe là df (dữ liệu quá khứ) và df_new (dữ liệu nóng hổi vừa thu thập được).
  • Để kiểm định xem 1 feature / column có đảm bao tính chất hay không, mình sẽ thực hiện như trên, kết quả của function ks_2samp trả về sẽ được gán vào biến test
  1. test[1] chính là pvaluep-value của kiểm định, và như mọi người đã thấy, mình đang dùng mức ý nghĩa:

α=0.05\alpha=0.05

Nếu pvalue<αp-value<\alpha, tức là sẽ bác bỏ H0H_0, đồng nghĩa với việc data bị drift.

if test[1] < 0.05: print("Data drift at column: ", column)
  1. Chỉ vậy thôi đó, ta có thể đóng function lại code trên để tiện dùng trong MLOps pipeline, và tiếp đến phần sau, mình sẽ ví dụ việc tích hợp detect tự động như nào nhé!

Tích hợp detect vào MLOps pipeline

Ở đây mình sẽ ví dụ như là 1 task của Airflow nhé.

  • Trong task này, mình sẽ duyệt qua từng column, nếu column vào bị drift, thì ngay lập tức mail cho data scientist, để thực hiện tune parameter nếu cần thiết, hoặc train model lại với data mới.
  • Đồng thời cũng sẽ return True nếu gặp column drift, và return False nếu không gặp column drift nào.
from airflow.decorators import task
import pandas as pd
from scipy import stats @task.python( show_return_value_in_logs=True,
)
def detect_drift()-> bool: # NOTE: Download new data from S3 (bước fetch df and df_new) for column in df.columns: test = stats.ks_2samp(df[column], df_new[column]) if test[1] < 0.05: print("Data drift at column: ", column) mail_to_data_scientist() return True return False

Kết luận

Vậy đó, giờ thì ta đã hiểu thêm về data drift và cách kiểm tra nó để giữ cho các mô hình của ta luôn hiệu quả! Đừng quên rằng trong thế giới mà data thay đổi liên tục, "sông có lúc, data có khúc" – hãy luôn sẵn sàng để tuning model 24/7 và optimize model của bạn. 😀

References

Bình luận

Bài viết tương tự

- vừa được xem lúc

Nhập môn lý thuyết cơ sở dữ liệu - Phần 1 : Tổng quan

# Trong bài viết này mình sẽ tập trung vào chủ đề tổng quan về Cơ sở dữ liệu. Phần 1 lý thuyết nên hơi chán các bạn cố gắng đọc nhé, chắc lý thuyết mới làm bài tập được, kiến thức còn nhiều các bạn cứ

0 0 110

- vừa được xem lúc

Nhập môn lý thuyết cơ sở dữ liệu - Phần 2: Mô hình thực thể liên kết

**Chào các bạn, hôm nay mình tiếp tục viết tiếp phần 2 cho series Nhập môn lý thuyết cơ sở dữ liệu. Chắc hẳn qua bài trước các bạn tìm được lý do vì sao mình phải học môn này rồi chứ.

0 0 68

- vừa được xem lúc

[Python Library Series] Pandas Tutorial for Beginners Part 2

Ở Part 1 chúng ta đã đi qua các bước hướng dẫn cách cài đặt Pandas, cách tạo và xem thông tin của một Dataframe. Như đã đề cập ở phần trước thì nội dung trong Part 2 này giúp chúng ta làm quen các tha

0 0 41

- vừa được xem lúc

Data Resource - A core component in Data Science

Dữ liệu ở đâu! Nên lấy dữ liệu từ nguồn nào để giải quyết vấn đề đặt ra? . Đó là câu hỏi của nhiều bạn khi bắt tay vào một dự án khoa học dữ liệu.

0 0 36

- vừa được xem lúc

Data Mining - Khai phá dữ liệu - [Data Science Series]

I. Data Mining là gì. Quá trình khai phá dữ liệu là một quá trình phức tạp bao gồm kho dữ liệu chuyên sâu cũng như các công nghệ tính toán. 1.

0 0 40

- vừa được xem lúc

Data Science, công việc hấp dẫn nhất thế kỷ 21 - [Data Science Series]

I. Data Science, công việc hấp dẫn nhất thế kỷ 21.

0 0 37