Khi nào nên sử dụng One Hot Encoding vs LabelEncoder vs DictVectorizor?


96

Bây giờ tôi đã xây dựng các mô hình với dữ liệu phân loại và trong tình huống này, về cơ bản tôi mặc định sử dụng hàm LabelEncoder của scikit-learn để chuyển đổi dữ liệu này trước khi xây dựng mô hình.

Tôi hiểu sự khác biệt giữa OHE, LabelEncoderDictVectorizorvề những gì họ đang làm để các dữ liệu, nhưng những gì không phải là rõ ràng với tôi là khi bạn có thể chọn để sử dụng một kỹ thuật hơn người khác.

Có những thuật toán hoặc tình huống nhất định trong đó một cái có ưu điểm / nhược điểm so với những cái khác không?


2
Liên quan đến câu trả lời của AN6U5 và tuyên bố này:> Vẫn có các thuật toán như cây quyết định và rừng ngẫu nhiên có thể hoạt động với các biến phân loại tốt và LabelEncoder có thể được sử dụng để lưu trữ giá trị sử dụng ít không gian đĩa hơn. Sẽ không sử dụng LabelEncoder chuyển đổi một tính năng phân loại thành một tính năng số, do đó làm cho cây quyết định thực hiện phân tách ở một giá trị nào đó không thực sự có ý nghĩa vì ánh xạ là tùy ý?
Nico

1
Nico, tôi nghĩ những gì AN6U5 đang nói là dành riêng cho cây quyết định, nó hoạt động tốt, bởi vì cây sẽ tách ra trên chó, mèo, chuột hoặc 1,2,3 và ý nghĩa của "cat" vs "2" không quan trọng đối với một cái cây (nghĩ về cách nó tách ra). Trong trường hợp giống như hồi quy logistic, các giá trị là một phần của phương trình do bạn nhân các giá trị weight * để nó có thể gây ra các vấn đề huấn luyện và các vấn đề về trọng số cho con chó đó: 1 và cat: 2 không có mối quan hệ số 1 * 2 (mặc dù nó vẫn có thể làm việc với đủ các ví dụ đào tạo và kỷ nguyên).
Doug F

Câu trả lời:


125

Có một số trường hợp mà LabelEncoder hoặc DictVectorizor hữu ích, nhưng theo tôi thì khá hạn chế do thông thường.

LabelEncoder có thể biến [chó, mèo, chó, chuột, mèo] thành [1,2,1,3,2], nhưng sau đó, quy tắc áp đặt có nghĩa là trung bình của chó và chuột là mèo. Tuy nhiên, vẫn có các thuật toán như cây quyết định và rừng ngẫu nhiên có thể hoạt động với các biến phân loại tốt và LabelEncoder có thể được sử dụng để lưu trữ các giá trị sử dụng ít không gian đĩa hơn.

One-Hot-Encoding có lợi thế là kết quả là nhị phân chứ không phải thứ tự và mọi thứ nằm trong một không gian vectơ trực giao. Nhược điểm là đối với cardinality cao, không gian tính năng thực sự có thể nổ tung nhanh chóng và bạn bắt đầu chiến đấu với lời nguyền của chiều. Trong những trường hợp này, tôi thường sử dụng mã hóa một nóng theo sau là PCA để giảm kích thước. Tôi thấy rằng sự kết hợp khôn ngoan của một PCA nóng cộng có thể hiếm khi bị đánh bại bởi các chương trình mã hóa khác. PCA tìm thấy sự chồng chéo tuyến tính, do đó, đương nhiên sẽ có xu hướng nhóm các tính năng tương tự thành cùng một tính năng.


1
Cảm ơn bạn rất nhiều - điều này rất hữu ích và có nhiều ý nghĩa. Có bất kỳ sơ đồ mã hóa nào khác mà bạn sử dụng cho các trường hợp cụ thể / cạnh không? Bạn có bao giờ thấy rằng bạn đang ở trong một tình huống mà bạn sẽ sử dụng các sơ đồ mã hóa khác nhau cho các tính năng khác nhau không?
anthr

21

Trong khi AN6U5 đã đưa ra một câu trả lời rất hay, tôi muốn thêm một vài điểm để tham khảo trong tương lai. Khi xem xét Một mã hóa nóng (OHE) và Mã hóa nhãn , chúng tôi phải thử và hiểu mô hình nào bạn đang cố gắng xây dựng. Cụ thể là hai loại mô hình chúng tôi sẽ xem xét là:

  1. Mô hình dựa trên cây : Cây quyết định tăng cường và rừng ngẫu nhiên.
  2. Các mô hình không dựa trên cây: Dựa trên tuyến tính, kNN hoặc Mạng thần kinh.

Chúng ta hãy xem xét khi nào nên áp dụng OHE và khi nào nên áp dụng Mã hóa nhãn trong khi xây dựng các mô hình dựa trên cây.

Chúng tôi áp dụng OHE khi:

  1. Khi các giá trị gần nhau trong mã hóa nhãn tương ứng với các giá trị đích không đóng (dữ liệu phi tuyến tính).
  2. Khi tính năng phân loại không phải là thứ tự (chó, mèo, chuột).

Chúng tôi áp dụng mã hóa Nhãn khi:

  1. Các tính năng phân loại là thứ tự (Jr. kg, Sr. kg, tiểu học, trung học, vv).
  2. Khi chúng ta có thể đưa ra một bộ mã hóa nhãn gán nhãn gần cho các danh mục tương tự : Điều này dẫn đến ít sự cố trong tress do đó giảm thời gian thực hiện.
  3. Khi số lượng các tính năng phân loại trong bộ dữ liệu là rất lớn: Mã hóa một nóng một tính năng phân loại với số lượng giá trị lớn có thể dẫn đến (1) mức tiêu thụ bộ nhớ cao và (2) trường hợp khi các tính năng không phân loại hiếm khi được sử dụng bởi mô hình. Bạn có thể đối phó với trường hợp thứ 1 nếu bạn sử dụng ma trận thưa thớt. Trường hợp thứ 2 có thể xảy ra nếu bạn xây dựng một cây chỉ sử dụng một tập hợp con các tính năng. Ví dụ: nếu bạn có 9 tính năng số và 1 tính năng phân loại với 100 giá trị duy nhất và bạn được mã hóa một tính năng phân loại đó, bạn sẽ nhận được 109 tính năng. Nếu một cây được xây dựng chỉ với một tập hợp các tính năng, 9 tính năng số ban đầu sẽ hiếm khi được sử dụng. Trong trường hợp này, bạn có thể tăng kích thước kiểm soát tham số của tập hợp con này. Trong xgboost, nó được gọi là colsample_bytree, trong max_features của sklearn.

Trong trường hợp bạn muốn tiếp tục với OHE, như @ AN6U5 đã đề xuất, bạn có thể muốn kết hợp PCA với OHE.

Hãy xem xét khi nào nên áp dụng Mã hóa OHE và Nhãn trong khi xây dựng các mô hình không dựa trên cây.

Để áp dụng mã hóa Nhãn, sự phụ thuộc giữa tính năng và mục tiêu phải là tuyến tính để Mã hóa nhãn được sử dụng hiệu quả.

Tương tự, trong trường hợp sự phụ thuộc là phi tuyến tính, bạn có thể muốn sử dụng OHE cho cùng.

Lưu ý: Một số lời giải thích đã được tham khảo từ Cách giành chiến thắng trong Cuộc thi khoa học dữ liệu từ Coursera.


Giải thích rất trực quan. Không phải là "chia tách", không phải là "spilts"?
dzieciou

0

LabelEncoder dành cho dữ liệu thứ tự, còn OHE dành cho dữ liệu danh nghĩa.

Licensed under cc by-sa 3.0 with attribution required.