Data Leakage trong Machine Learning
Danh sách nội dung trong bài viết:
-
Data leakage là gì?
-
Data leakage có phải là Overfitting?
-
Các ví dụ cho data leakage
-
Nhận biết data leakage
-
Các kỹ thuật để tránh data leakage
-
Kết luận
-
Tài liệu tham khảo
Data leakage là gì?
Data leakage thường xảy ra khi dữ liệu training chứa các thông tin về kết quả đang hướng đến, nhưng loại dữ liệu như vậy thường sẽ không có sẵn khi mô hình của bạn được áp dụng để dự đoán trong thực tế. Khi đó, mô hình sẽ thực hiện dự đoán rất tốt cho tập train, và có thể rất tốt cho cả tập validation, nhưng khi đưa vào sản phẩm vận hành, kết quả lại không được như mong đợi.
Data leakage là một vấn đề rất phổ biến và quan trọng trong lĩnh vực data mining và machine learning, nó cần được xử lý tốt để đạt được một mô hình có khả năng dự đoán vững chắc và chính xác.
Data leakage có phải là Overfitting ?
Để trả lời cho câu hỏi này, hãy cùng nhắc lại ngắn gọn về Overfitting. Khi đánh giá độ hiệu quả của một mô hình ML cụ thể, ta thường chia dữ liệu thành hai tập là Train và Test. Thuật toán được huấn luyện trên tập Train và đánh giá/thử nghiệm trên tập Test, sau đó được áp dụng (triển khai sản phẩm) để dự đoán trên dữ liệu mới. Overfitting xảy ra khi mô hình thể hiện rất tốt trên mỗi tập Train nhưng lại không thực sự hiệu quả trên những dữ liệu mới trong khi mục đích cuối cùng của chúng ta lại là tối đa độ chính xác của nó trên những dữ liệu mới. Điều này có nghĩa là mô hình của chúng ta không thể khái quát hóa được những dữ liệu mới (nghĩa là mô hình đã được huấn luyện không có khả năng thích ứng được với dữ liệu mới).
Khi Data leakage xảy ra, nó có thể dẫn đến bị Overfitting nhưng vẫn thể hiện rất tốt trên tập Test. Như đã nói ở trên, dữ liệu từ tập Test đã bị rò rỉ sang tập Train, có nghĩa là kết quả dự đoán tốt ở tập Test cũng chỉ là kết quả dự đoán của những dữ liệu mà mô hình đã được học (đã thấy trong quá trình huấn luyện) trong khi Overfitting lại dẫn đến mức độ khái quát hóa kém của mô hình dự đoán.
Các ví dụ cho data leakage
Để hiểu được ví dụ này, đầu tiên chúng ta phải hiểu về sự khác biệt giữa “Target variable” và “Features” trong ML.
-
Target variable: là đầu ra của mô hình đang cố dự đoán.
-
Features: là dữ liệu được mô hình sử dụng để dự đoán đầu ra.
-
Features có chứa cả Target variable
Nguyên nhân rõ ràng và dễ hiểu nhất gây ra Data leakage là Target variable được sử dụng như Features. Chuyện gì xảy ra khi Target variable được sử dụng như Features? Mục đích của việc huấn luyện mô hình sẽ trở nên vô nghĩa. Vì thế khi chuẩn bị dữ liệu cho việc huấn luyện, bạn phải chắc chắn rằng Target variable phải tách biệt hoàn toàn với Features.
Ví dụ: Khi Targer variable AnnualIncomeUSD có thể chỉ là một định dạng khác hoặc là một kết quả của công thức dựa trên Feature MonthlySalaryGBP.
-
Thông tin của tập Test được chia sẻ cho tập Train và ngược lại.
Cách để đánh giá một mô hình ML là chúng ta sẽ chia dữ liệu ra thành 2 tập Train và Test. Mục đích là để kiểm tra và đánh giá mô hình bằng tập dữ liệu mới mà mô hình chưa từng được thấy trước đây để có kết quả đánh giá chính xác nhất. Nếu thông tin trong tập Test được chia sẻ cho tập Train (hoặc ngược lại) thì mục đích xây dựng và đánh giá mô hình sẽ trở nên vô nghĩa.
-
Giveaway features
Giveaway features là những đặc trưng mang thông tin của Target variable nhưng lại không khả dụng sau khi mô hình được triển khai.
Ví dụ chúng ta đang cần dự đoán xem người dùng có quay lại trang web hay không. Nếu sử dụng những đặc trưng liên quan đến những lần quay lại trong tương lai sẽ gây ra hiện tượng Data leakage. Chúng ta chỉ nên sử dụng những đặc trưng liên quan đến phiên hiện tại vì những thông tin liên quan đến phiên trong tương lai sẽ không khả dụng khi ta triển khai mô hình.
Một ví dụ khác cho bảng dữ liệu trên, mô hình hoàn toàn có thể dựa vào trường LatePaymentReminders để quyết định xem khoản vay đó có phải là khoản vay xấu, Nhưng khi đưa vào triển khai thì trường này sẽ không có sẵn.
-
Rò rỉ trong quá trình tiền xử lý
Khi giải quyết một bài toán ML, đầu tiên chúng ta thường phải thực hiện các bước liên quan đến làm sạch dữ liệu và tiền xử lý dữ liệu như:
-
Đánh giá các thông số để chuẩn hóa hoặc thay đổi tỉ lệ của đặc trưng
-
Tìm giá trị tối đa và giá trị tối thiểu của một đặc trưng cụ thể
-
Chuẩn hóa một đặc trưng cụ thể trong bộ dữ liệu
-
Loại bỏ dữ liệu nhiễu
-
Thay thế hoặc loại bỏ hoàn toàn những dữ liệu bị thiếu trong bộ dữ liệu
Những công đoạn ở trên chỉ nên được sử dụng với tập Train. Nếu ta thực hiện xử lý những công đoạn trên trên toàn bộ dữ liệu thì rất có thể Data leakage sẽ xảy ra. Áp dụng các kỹ thuật tiền xử lý dữ liệu trên toàn bộ dữ liệu sẽ làm cho mô hình không chỉ được huấn luyện bởi tập Train mà còn biết được thông tin của tập Test. Hiển nhiên rằng tập Test phải là dữ liệu mới và mô hình chưa từng được thấy trước đây.
Nhận biết data leakage
-
Trường hợp 1:
Khi chúng ta nhận thấy khả năng dự đoán của mô hình quá tốt (kết quả dự đoán hoàn toàn khớp với kết quả thực tế), chúng ta nên nghi ngờ rằng có thể Data leakage đã xảy ra. Mô hình bằng cách nào đó đã ghi nhớ sự tương quan giữa Feature và Target variable thay vì học và khái quát hóa dữ liệu.
-
Trường hợp 2:
Khi thực hiện Phân tích khai thác dữ liệu (Exploratory Data Analysis – EDA), chúng ta có thể phát hiện được một số đặc trưng có độ tương quan rất cao đối với Target variable. Và đương nhiên là vẫn có thể có một số đặc trưng có độ tương quan cao hơn so với những đặc trưng còn lại nhưng với những đặc trưng có độ tương quan cực kỳ cao thì cần phải được kiểm tra và xử lý cẩn thận. Vậy nên với các kỹ thuật EDA, chúng ta có thể xem xét dữ liệu gốc qua các thống kê và công cụ mô hình hóa để phát hiện và chú ý hơn với những đặc trưng này.
-
Trường hợp 3:
Sau khi huấn luyện xong mô hình, nếu có những đặc trưng có trọng số rất cao thì chúng ta cần phải chú ý đến những đặc trưng này, rất có thể đây là những đặc trưng đã được rò rỉ thông tin.
Các kỹ thuật để tránh data leakage
-
Trích xuất tập các đặc trưng phù hợp
Để khắc phục vấn đề về Data leakage, cách đầu tiên chúng ta có thể làm là trích xuất tập các đặc trưng phù hợp cho mô hình ML. Trong quá trình chọn đặc trưng, chúng ta cần đảm bảo rằng những đặc trưng đã chọn không có sự tương quan quá nhiều đối với Target variable cũng như chắc rằng nó không chứa những thông tin của Target variable vì nó sẽ không có sẵn trong quá trình dự đoán.
-
Tạo một tập Validation tách biệt
Để hạn chế hoặc tránh các vấn đề về Data leakage, chúng ta nên cố gắng dành ra một tập Validation bên cạnh tập Train và Test. Mục đích của tập Validation là để giả định như khi dự đoán trong thực tế và có thể được sử dụng như bước cuối cùng. Bằng cách này, chúng ta sẽ xác định được nếu có bất kỳ trường hợp Overfitting nào xảy ra thì quá trình này sẽ như một cảnh báo trước khi triển khai mô hình với hiệu quả kém trong môi trường sản xuất.
-
Áp dụng tiền xử lý dữ liệu riêng biệt đối với từng tập dữ liệu
Khi làm việc với mạng neural, chúng ta thường phải chuẩn hóa đầu vào trước khi mang đi huấn luyện mô hình. Thông thường chúng ta sẽ chuẩn hóa dữ liệu bằng cách chia cho giá trị trung bình của nó. Nếu quá trình này được thực hiện trên toàn bộ tập dữ liệu, tập Train sẽ bị ảnh hưởng bởi thông tin của tập Test dẫn đến Data leakage. Do đó, để tránh hiện tượng Data leakage, chúng ta có thể áp dụng bất cứ kỹ thuật chuẩn hóa nào cho riêng từng tập Train và Test.
Ví dụ: Khi sử dụng thư viện sklearn để chuẩn hóa dữ liệu, fit_transform() (hoặc fit() và sau đó transform()) sẽ được sử dụng lên tập Train, và chỉ dùng transform() cho tập Test.
Phương thức fit sẽ tính toán ra giá trị trung bình và phương sai cho mỗi đặc trưng có trong dữ liệu. Transform để biến đổi các đặc trưng dựa trên giá trị trung bình và phương sai tương ứng. Tập Train sẽ được thay đổi tỷ lệ và cũng được học từ các tham số tỷ lệ đó. Mô hình sẽ được xây dựng dựa trên các giá trị trung bình và phương sai của các đặc trưng trong tập Train mới này. Các tham số được học sẽ dùng để thay đổi tỷ lệ của cả tập Test.
Không nên sử dụng phương thức fit cho cả tập Test,vì giá trị trung bình và phương sai mới sẽ được tạo ra cho mỗi đặc trưng dựa trên tập Test. Điều này sẽ khiến cho mô hình học được cả những thông tin trong tập Test.
Image link: python – what is the difference between ‘transform’ and ‘fit_transform’ in sklearn – Stack Overflow
-
Giới hạn giá trị khi làm việc với kiểu dữ liệu chuỗi thời gian.
Khi làm việc với dữ liệu chuỗi thời gian, chúng ta cần chú ý hơn đối với Data leakage. Ví dụ, nếu chúng ta vô tình sử dụng thông tin của tương lai để thực hiện việc tính toán cho những đặc trưng hiện tại hoặc những dự đoán, rất có thể nó sẽ dẫn đến một mô hình bị leak. Việc này thường xảy ra khi ngẫu nhiên chia bộ dữ liệu thành tập Train và Test.
Vì vậy khi làm việc với dữ liệu chuỗi thời gian, chúng ta sẽ đặt một giới hạn về thời gian để ngăn chặn việc lấy bất kỳ thông tin nào của quá trình dự đoán.
-
Cross-Validation
Image link Cross-validation (statistics) – Wikipedia
Khi chúng ta có rất ít dữ liệu để huấn luyện mô hình ML, chúng ta nên sử dụng kiểm tra chéo trong quá trình huấn luyện. Kỹ thuật Cross-Validation sẽ tách dữ liệu của chúng ta ra thành k phần và lặp lại việc lấy k-1 phần để huấn luyện và kiểm tra trên phần còn lại cho đến khi tất cả các phần đều đã được lấy đi kiểm tra.
Lợi ích của cách làm này là chúng ta sẽ sử dụng toàn bộ dữ liệu cho mục đích huấn luyện và kiểm tra. Tuy nhiên để chắc chắn hơn nữa về việc Data leakage, chúng ta nên thay đổi tỉ lệ hoặc chuẩn hóa dữ liệu và tính lại tham số mỗi lần lặp của kiểm tra chéo.
-
Thêm nhiễu
Thêm nhiễu ngẫu nhiên vào dữ liệu đầu vào để thử và loại bỏ tác động của các biến bị rò rỉ.
Kết luận
Một khi đã xác định được vấn đề dẫn đến Data leakage, bước tiếp theo chúng ta cần tìm cách khắc phục nó. Với một số bài toán, việc sử dụng mô hình bị data leakage mà không cần khắc phục vẫn có thể chấp nhận được. Nhưng nếu bạn quyết định khắc phục rò rỉ, cần phải thật cẩn thận để không khiến vấn đề tệ hơn. Thông thường, một khi xuất hiện một biến đặc trưng bị rò rỉ thì chắc chắn sẽ còn những biến khác. Loại bỏ những rò rỉ đã được phát hiện có thể làm trầm trọng thêm những tác động của những rò rỉ chưa được phát hiện, và nếu thực hiện việc sửa đổi đặc trưng để khắc phục các rò rỉ đã thấy có thể tạo ra những rò rỉ khác. Ý tưởng chính là cố gắng tìm cách hợp pháp hóa các quan sát cụ thể và/hoặc biến đặc trưng sau đó khắc phục các rò rỉ và mong là nó đã được khắc phục hoàn toàn. Chỉnh sửa rò rỉ dữ liệu là một lĩnh vực nghiên cứu đang hoạt động có khả năng mang lại kết quả hiệu quả trong tương lai gần.