Đối với sự khác biệt trong OrdinalEncoder
và 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)
, LabelEncoder
dành cho dữ liệu 1D: đối với hình dạng (n_samples,)
)
Đó là lý do tại sao một OrdinalEncoder
lỗ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 LabelEncoder
vs OrdinalEncoder
và 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ư LabelEncoder
và OrdinalEncoder
có hà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 có 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 !
OrdinalEncoder
?