"Trong nhiều hoạt động khoa học dữ liệu thực tiễn, tập dữ liệu sẽ chứa các biến phân loại. Các biến này thường được lưu dưới dạng giá trị văn bản". (Practical Business Python) Vì học máy dựa trên các phương trình toán học, việc giữ nguyên các biến phân loại sẽ gây vấn đề. Nhiều thuật toán hỗ trợ giá trị phân loại mà không cần xử lý thêm, nhưng ngay cả trong những trường hợp đó, vẫn có tranh luận về việc có nên mã hóa các biến hay không. Với các thuật toán không hỗ trợ giá trị phân loại, ta buộc phải dùng các phương pháp mã hóa. Hãy cùng thảo luận một số phương pháp dưới đây.
Các phương pháp mã hóa
Mã hóa nhãn (Label encoding)
Trong mã hóa nhãn, chúng ta ánh xạ mỗi hạng mục (category) tới một con số hoặc một nhãn. Các nhãn được chọn cho các hạng mục không có mối quan hệ nội tại. Vì vậy, các hạng mục có liên hệ hoặc gần nhau sẽ mất đi thông tin đó sau khi mã hóa.
Mã hóa tần suất (Frequency encoding)
Đây là cách sử dụng tần suất xuất hiện của các hạng mục làm nhãn. Trong các trường hợp tần suất có liên quan phần nào tới biến mục tiêu, nó giúp mô hình hiểu và gán trọng số theo tỷ lệ thuận hoặc nghịch, tùy thuộc vào bản chất dữ liệu.
Mã hóa one-hot
Trong phương pháp này, ta ánh xạ mỗi hạng mục tới một vector chứa 1 và 0 biểu thị có hay không có đặc trưng đó. Số lượng vector phụ thuộc vào số hạng mục mà chúng ta muốn giữ. Với các đặc trưng có độ phân mảnh cao (cardinality lớn), phương pháp này tạo ra rất nhiều cột và làm chậm quá trình học đáng kể. Có nhiều bàn luận giữa one-hot encoding và dummy encoding cũng như khi nào dùng mỗi loại. Chúng khá giống nhau, ngoại trừ one-hot tạo số cột bằng số hạng mục, còn dummy thì ít hơn một. Cuối cùng, điều này nên được người xây dựng mô hình xử lý phù hợp trong quá trình kiểm định.
Bẫy biến giả (Dummy variable trap):
Giả sử bạn có hai hạng mục trong một đặc trưng phân loại. Sau khi thực hiện one-hot encoding, sẽ có hai cột đại diện cho đặc trưng này, nhưng nếu quan sát kỹ thì chỉ cần một vector là đủ để biểu diễn cả hai giá trị. Ví dụ một đặc trưng phân loại có hai giá trị, gọi là “red” và “blue”. Sau one-hot encoding sẽ tạo hai vector: một cho “red” và một cho “blue”, nhưng thông tin có thể học được chỉ với một vector, còn vector kia sẽ là hằng. Vì thế chúng ta có thể bỏ một vector, giúp giảm lượng dữ liệu mà thuật toán cần huấn luyện. Điều này giúp mô hình hoạt động tốt hơn và cũng dễ giải thích cách thức hoạt động hơn. Trong các tình huống thực tế, chúng ta phải xử lý rất nhiều đặc trưng phân loại, đôi khi có sẵn hiểu biết trước về chúng cùng với kết quả. Thực hành mã hóa cho phép bạn giải quyết quá trình đưa dữ liệu vào, nhưng cũng khiến quá trình và việc học trở thành một nhiệm vụ nặng nề.
Mã hóa theo mục tiêu/ảnh hưởng/xác suất (Target/Impact/Likelihood encoding)
Target Encoding giống với mã hóa nhãn, ngoại trừ ở đây các nhãn tương quan trực tiếp với biến mục tiêu. Ví dụ, trong mã hóa mục tiêu theo giá trị trung bình, với mỗi hạng mục trong đặc trưng, nhãn được quyết định bằng giá trị trung bình của biến mục tiêu trên dữ liệu huấn luyện. Phương pháp mã hóa này làm nổi bật mối quan hệ giữa các hạng mục tương tự, nhưng các quan hệ bị giới hạn trong phạm vi các hạng mục và biến mục tiêu. Ưu điểm của mã hóa mục tiêu theo trung bình là không làm ảnh hưởng đến kích thước dữ liệu và giúp việc học nhanh hơn; nhược điểm là khó kiểm định hơn. Cần có Regularization trong quá trình triển khai phương pháp này. Xem target encoder trong python và R.
Thống kê về mã hóa
Biến thiên mã hóa mô tả mức độ biến đổi của việc mã hóa các phần tử bên trong một hạng mục. Khi nói về biến thiên trong one-hot encoding, biến thiên phụ thuộc vào thời điểm triển khai, khi đó quyết định số hạng mục cần lấy có đủ tác động tới biến mục tiêu. Các phương pháp mã hóa khác cũng thể hiện mức biến thiên đáng kể, được nhận diện trong giai đoạn kiểm định.
Để tính Tính phân biệt của mã hóa (Encoding distinguishability), chúng ta đếm các nhãn của hạng mục rồi tính độ lệch chuẩn của các nhãn. Điều đó cho thấy mức độ phân biệt của các hạng mục đã mã hóa: chúng ở xa nhau hay tụ lại trong một vùng.
Hãy nhớ rằng nếu bạn chọn phong cách mã hóa đơn giản trong quá trình xây dựng mô hình, mô hình có xu hướng bị thiên lệch; để hiểu rõ hơn, vui lòng xem thảo luận này. Với các mô hình khác nhau, bạn phải ước lượng phương pháp mã hóa của mình, ví dụ với hồi quy bạn có thể dùng mã hóa mục tiêu theo trung bình. Nếu là phân loại, bạn có thể dùng mã hóa tần suất tương đối.
Cuối cùng, tôi muốn chia sẻ một transformer theo phong cách scikit-learn giúp mã hóa các biến phân loại bằng nhiều kỹ thuật khác nhau.
category_encoders
Thư viện scikit-learn này cung cấp các kỹ thuật sau hiện đang được triển khai:
- Ordinal
- One-Hot
- Binary
- Helmert Contrast
- Sum Contrast
- Polynomial Contrast
- Backward Difference Contrast
- Hashing
- BaseN
- LeaveOneOut
- Target Encoding
Thư viện hỗ trợ pandas dataframe làm đầu vào và có thể biến đổi dữ liệu. Nó cũng hỗ trợ các pipeline của sklearn, xem chi tiết tại đây.
Nếu bạn muốn tìm hiểu thêm về scikit-learn, hãy học khóa Supervised Learning with scikit-learn của DataCamp.
"Trong nhiều hoạt động khoa học dữ liệu thực tiễn, tập dữ liệu sẽ chứa các biến phân loại. Các biến này thường được lưu dưới dạng giá trị văn bản". (Practical Business Python) Vì học máy dựa trên các phương trình toán học, việc giữ nguyên các biến phân loại sẽ gây vấn đề. Nhiều thuật toán hỗ trợ giá trị phân loại mà không cần xử lý thêm, nhưng ngay cả trong những trường hợp đó, vẫn có tranh luận về việc có nên mã hóa các biến hay không. Với các thuật toán không hỗ trợ giá trị phân loại, ta buộc phải dùng các phương pháp mã hóa. Hãy cùng thảo luận một số phương pháp dưới đây.
Các phương pháp mã hóa
Mã hóa nhãn (Label encoding)
Trong mã hóa nhãn, chúng ta ánh xạ mỗi hạng mục (category) tới một con số hoặc một nhãn. Các nhãn được chọn cho các hạng mục không có mối quan hệ nội tại. Vì vậy, các hạng mục có liên hệ hoặc gần nhau sẽ mất đi thông tin đó sau khi mã hóa.
Mã hóa tần suất (Frequency encoding)
Đây là cách sử dụng tần suất xuất hiện của các hạng mục làm nhãn. Trong các trường hợp tần suất có liên quan phần nào tới biến mục tiêu, nó giúp mô hình hiểu và gán trọng số theo tỷ lệ thuận hoặc nghịch, tùy thuộc vào bản chất dữ liệu.
Mã hóa one-hot
Trong phương pháp này, ta ánh xạ mỗi hạng mục tới một vector chứa 1 và 0 biểu thị có hay không có đặc trưng đó. Số lượng vector phụ thuộc vào số hạng mục mà chúng ta muốn giữ. Với các đặc trưng có độ phân mảnh cao (cardinality lớn), phương pháp này tạo ra rất nhiều cột và làm chậm quá trình học đáng kể. Có nhiều bàn luận giữa one-hot encoding và dummy encoding cũng như khi nào dùng mỗi loại. Chúng khá giống nhau, ngoại trừ one-hot tạo số cột bằng số hạng mục, còn dummy thì ít hơn một. Cuối cùng, điều này nên được người xây dựng mô hình xử lý phù hợp trong quá trình kiểm định.
Bẫy biến giả (Dummy variable trap):
Giả sử bạn có hai hạng mục trong một đặc trưng phân loại. Sau khi thực hiện one-hot encoding, sẽ có hai cột đại diện cho đặc trưng này, nhưng nếu quan sát kỹ thì chỉ cần một vector là đủ để biểu diễn cả hai giá trị. Ví dụ một đặc trưng phân loại có hai giá trị, gọi là “red” và “blue”. Sau one-hot encoding sẽ tạo hai vector: một cho “red” và một cho “blue”, nhưng thông tin có thể học được chỉ với một vector, còn vector kia sẽ là hằng. Vì thế chúng ta có thể bỏ một vector, giúp giảm lượng dữ liệu mà thuật toán cần huấn luyện. Điều này giúp mô hình hoạt động tốt hơn và cũng dễ giải thích cách thức hoạt động hơn. Trong các tình huống thực tế, chúng ta phải xử lý rất nhiều đặc trưng phân loại, đôi khi có sẵn hiểu biết trước về chúng cùng với kết quả. Thực hành mã hóa cho phép bạn giải quyết quá trình đưa dữ liệu vào, nhưng cũng khiến quá trình và việc học trở thành một nhiệm vụ nặng nề.
Mã hóa theo mục tiêu/ảnh hưởng/xác suất (Target/Impact/Likelihood encoding)
Target Encoding giống với mã hóa nhãn, ngoại trừ ở đây các nhãn tương quan trực tiếp với biến mục tiêu. Ví dụ, trong mã hóa mục tiêu theo giá trị trung bình, với mỗi hạng mục trong đặc trưng, nhãn được quyết định bằng giá trị trung bình của biến mục tiêu trên dữ liệu huấn luyện. Phương pháp mã hóa này làm nổi bật mối quan hệ giữa các hạng mục tương tự, nhưng các quan hệ bị giới hạn trong phạm vi các hạng mục và biến mục tiêu. Ưu điểm của mã hóa mục tiêu theo trung bình là không làm ảnh hưởng đến kích thước dữ liệu và giúp việc học nhanh hơn; nhược điểm là khó kiểm định hơn. Cần có Regularization trong quá trình triển khai phương pháp này. Xem target encoder trong python và R.
Thống kê về mã hóa
Biến thiên mã hóa mô tả mức độ biến đổi của việc mã hóa các phần tử bên trong một hạng mục. Khi nói về biến thiên trong one-hot encoding, biến thiên phụ thuộc vào thời điểm triển khai, khi đó quyết định số hạng mục cần lấy có đủ tác động tới biến mục tiêu. Các phương pháp mã hóa khác cũng thể hiện mức biến thiên đáng kể, được nhận diện trong giai đoạn kiểm định.
Để tính Tính phân biệt của mã hóa (Encoding distinguishability), chúng ta đếm các nhãn của hạng mục rồi tính độ lệch chuẩn của các nhãn. Điều đó cho thấy mức độ phân biệt của các hạng mục đã mã hóa: chúng ở xa nhau hay tụ lại trong một vùng.
Hãy nhớ rằng nếu bạn chọn phong cách mã hóa đơn giản trong quá trình xây dựng mô hình, mô hình có xu hướng bị thiên lệch; để hiểu rõ hơn, vui lòng xem thảo luận này. Với các mô hình khác nhau, bạn phải ước lượng phương pháp mã hóa của mình, ví dụ với hồi quy bạn có thể dùng mã hóa mục tiêu theo trung bình. Nếu là phân loại, bạn có thể dùng mã hóa tần suất tương đối.
Cuối cùng, tôi muốn chia sẻ một transformer theo phong cách scikit-learn giúp mã hóa các biến phân loại bằng nhiều kỹ thuật khác nhau.
category_encoders
Thư viện scikit-learn này cung cấp các kỹ thuật sau hiện đang được triển khai:
Thư viện hỗ trợ pandas dataframe làm đầu vào và có thể biến đổi dữ liệu. Nó cũng hỗ trợ các pipeline của sklearn, xem chi tiết tại đây.
Nếu bạn muốn tìm hiểu thêm về scikit-learn, hãy học khóa Supervised Learning with scikit-learn của DataCamp.