Sự khác biệt giữa OrdinalEncoder và LabelEncoder


20

Tôi đã xem qua tài liệu chính thức của scikit-learn learn sau khi xem qua một cuốn sách về ML và tình cờ thấy được những điều sau:

Trong Tài liệu, nó được đưa ra sklearn.preprocessing.OrdinalEncoder()trong khi trong cuốn sách được đưa ra sklearn.preprocessing.LabelEncoder(), khi tôi kiểm tra chức năng của chúng, nó trông giống tôi. Ai đó có thể vui lòng cho tôi biết sự khác biệt giữa hai người được không?

Câu trả lời:


15

Afaik, cả hai đều có chức năng giống nhau. Một chút khác biệt là ý tưởng đằng sau. OrdinalEncoderlà để chuyển đổi các tính năng, trong khi LabelEncoderlà để chuyển đổi biến mục tiêu.

Đó là lý do tại sao OrdinalEncodercó thể phù hợp với dữ liệu có hình dạng (n_samples, n_features)trong khi LabelEncoderchỉ có thể phù hợp với dữ liệu có hình dạng (n_samples,)(mặc dù trước đây được sử dụng LabelEncodertrong vòng lặp để xử lý những gì đã trở thành công việc OrdinalEncoderhiện tại)


Khi nào sử dụng OrdinalEncoder?
stackunderflow


Theo tài liệu được trích dẫn tại liên kết đó, "[ LabelEncoderkhông] được sử dụng cho các tính năng, chỉ dành cho các mục tiêu học tập được giám sát."
Yehuda

4

Đối với sự khác biệt trong OrdinalEncodervà cách LabelEncoder thực hiện , câu trả lời được chấp nhận đề cập đến hình dạng của dữ liệu: ( OrdinalEncoderđối với dữ liệu 2D; hình dạng (n_samples, n_features), LabelEncoderdành cho dữ liệu 1D: đối với hình dạng (n_samples,))

Đó là lý do tại sao một OrdinalEncoderlỗi sẽ xảy ra:

ValueError: Expected 2D array, got 1D array instead:

... Nếu cố gắng khớp với dữ liệu 1D: OrdinalEncoder().fit(['a','b'])

Tuy nhiên, một sự khác biệt khác giữa các bộ mã hóa là tên của tham số đã học ;

  • LabelEncoder học classes_
  • OrdinalEncoder học categories_

Lưu ý sự khác biệt trong khớp LabelEncodervs OrdinalEncodervà sự khác biệt về giá trị của các tham số đã học này. LabelEncoder.classes_là 1D, trong khi OrdinalEncoder.categories_là 2D.

LabelEncoder().fit(['a','b']).classes_
# >>> array(['a', 'b'], dtype='<U1')

OrdinalEncoder().fit([['a'], ['b']]).categories_
# >>> [array(['a', 'b'], dtype=object)]

Các bộ mã hóa khác hoạt động ở dạng 2D, bao gồm OneHotEncoder, cũng sử dụng thuộc tínhcategories_

Thông tin thêm ở đây về dtype <U1(little endian, Unicode, 1 byte; tức là một chuỗi có độ dài 1)

BIÊN TẬP

Trong các ý kiến ​​cho câu trả lời của tôi, Piotr không đồng ý ; Piotr chỉ ra sự khác biệt giữa mã hóa thứ tự và mã hóa nhãn nói chung hơn.

  • Mã hóa thứ tự là tốt cho biến thứ tự (trong đó các vấn đề trật tự, giống như cold, warm, hot);
  • vs một phi thường (aka danh nghĩa ) (trong đó thứ tự không quan trọng, như blonde, brunette)

Đây là một khái niệm tuyệt vời, nhưng câu hỏi này hỏi về sklearn lớp / thực hiện. Thật thú vị khi thấy cách triển khai không phù hợp với các khái niệm; đặc biệt là OrdinalEncoder; cụ thể như thế nào bạn phải tự làm mã hóa thứ tự .

Đối với việc thực hiện có vẻ như LabelEncoderOrdinalEncoderhành vi nhất quán theo như các số nguyên được chọn . Cả hai gán số nguyên dựa trên thứ tự bảng chữ cái . Ví dụ:

OrdinalEncoder().fit_transform([['cold'],['warm'],['hot']]).reshape((1,3))
# >>> array([[0., 2., 1.]])

LabelEncoder().fit_transform(['cold','warm','hot'])
# >>> array([0, 2, 1], dtype=int64)

Nhận thấy như thế nào cả hai bộ mã hóa được gán số nguyên theo thứ tự bảng chữ cái 'c' <'h' <'w'.

Nhưng phần này rất quan trọng: Lưu ý cách cả bộ mã hóa không thứ tự "thực" chính xác (nghĩa là thứ tự thực sẽ phản ánh nhiệt độ, trong đó thứ tự là 'lạnh' <'ấm' <'nóng'); dựa trên thứ tự "thực", giá trị 'warm'sẽ được gán cho số nguyên 1.

Trong bài đăng trên blog được tham chiếu bởi Piotr , tác giả thậm chí không sử dụngOrdinalEncoder() . Để đạt được mã hóa thứ tự , tác giả thực hiện thủ công: ánh xạ từng nhiệt độ sang số nguyên thứ tự "thực", sử dụng từ điển như {'cold':0, 'warm':1, 'hot':2}:

Tham khảo mã này bằng Pandas, nơi đầu tiên chúng ta cần gán thứ tự thực của biến thông qua một từ điển ... Mặc dù nó rất thẳng về phía trước nhưng nó yêu cầu mã hóa để nói các giá trị thứ tự và ánh xạ thực tế từ văn bản sang số nguyên theo mệnh lệnh.

Nói cách khác, nếu bạn đang tự hỏi có nên sử dụng hay không OrdinalEncoder, xin lưu ý OrdinalEncoder có thể không thực sự cung cấp "mã hóa thứ tự" theo cách bạn mong đợi !


2
Tôi rất không đồng ý. Các khái niệm đằng sau các kỹ thuật mã hóa này về cơ bản là khác nhau. Đó không chỉ là về việc thực hiện trong một thư viện.
Piotr Rarus - Phục hồi Monica

1

Bạn sử dụng mã hóa thứ tự để bảo toàn thứ tự của dữ liệu phân loại tức là lạnh, ấm, nóng; thấp trung bình cao. Bạn sử dụng mã hóa nhãn hoặc một điểm nóng cho dữ liệu phân loại, trong đó không có thứ tự nào trong dữ liệu như chó, mèo, cá voi. Kiểm tra bài này trên phương tiện. Nó giải thích những khái niệm này tốt.


1
Có lẽ có sự không nhất quán về thuật ngữ, nhưng điều này có vẻ không chính xác đối với câu hỏi của OP trên LabelEncoder của sklearn; nó mã hóa thành các số nguyên từ 0 đến n_groupes-1, giống như OrdinalEncoder.
Ben Reiniger
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.