Adapun perbedaan OrdinalEncoder
dan LabelEncoder
implementasi , jawaban yang diterima menyebutkan bentuk data: ( OrdinalEncoder
untuk data 2D; bentuk (n_samples, n_features)
, LabelEncoder
untuk data 1D: untuk bentuk (n_samples,)
)
Karena itulah a OrdinalEncoder
akan mendapatkan kesalahan:
ValueError: Expected 2D array, got 1D array instead:
... jika mencoba menyesuaikan data 1D: OrdinalEncoder().fit(['a','b'])
Namun, perbedaan lain antara pembuat enkode adalah nama parameter yang dipelajari ;
LabelEncoder
belajar classes_
OrdinalEncoder
belajar categories_
Perhatikan perbedaan dalam fitting LabelEncoder
vs OrdinalEncoder
, dan perbedaan dalam nilai-nilai dari parameter yang dipelajari ini. LabelEncoder.classes_
adalah 1D, sedangkan OrdinalEncoder.categories_
2D.
LabelEncoder().fit(['a','b']).classes_
# >>> array(['a', 'b'], dtype='<U1')
OrdinalEncoder().fit([['a'], ['b']]).categories_
# >>> [array(['a', 'b'], dtype=object)]
Penyandi lain yang bekerja dalam 2D, termasuk OneHotEncoder
, juga menggunakan properticategories_
Info lebih lanjut di sini tentang dtype <U1
(little-endian, Unicode, 1 byte; yaitu string dengan panjang 1)
EDIT
Dalam komentar atas jawaban saya, Piotr tidak setuju ; Piotr menunjukkan perbedaan antara pengodean ordinal dan pengodean label secara lebih umum.
- Encoding ordinal yang baik untuk variabel ordinal (di mana hal-hal order, seperti
cold
, warm
, hot
);
- vs variabel non-ordinal (alias nominal ) (di mana pesanan tidak masalah, seperti
blonde
, brunette
)
Ini adalah konsep yang hebat, tetapi pertanyaan ini menanyakan tentang sklearn
kelas / implementasi. Sangat menarik untuk melihat bagaimana implementasi tidak sesuai dengan konsep; khususnya OrdinalEncoder
; khusus bagaimana Anda harus melakukan penyandian ordinal sendiri .
Adapun implementasi sepertinya LabelEncoder
dan OrdinalEncoder
memiliki perilaku yang konsisten sejauh bilangan bulat yang dipilih . Mereka berdua bilangan bulat menetapkan berdasarkan urutan abjad . Sebagai contoh:
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)
Perhatikan bagaimana kedua enkode menetapkan bilangan bulat dalam urutan abjad 'c' <'h' <'w'.
Tetapi bagian ini penting: Perhatikan bagaimana tidak ada pembuat kode yang mendapatkan urutan "nyata" yang benar (yaitu urutan nyata harus mencerminkan suhu, di mana urutannya 'dingin' <'hangat' <'panas'); berdasarkan urutan "nyata", nilainya 'warm'
akan diberi bilangan bulat 1.
Dalam posting blog yang dirujuk oleh Piotr , penulis bahkan tidak menggunakanOrdinalEncoder()
. Untuk mencapai penyandian ordinal , penulis melakukannya secara manual: memetakan setiap suhu ke integer orde "nyata", menggunakan kamus seperti{'cold':0, 'warm':1, 'hot':2}
:
Lihat kode ini menggunakan Pandas, di mana pertama-tama kita perlu menetapkan urutan nyata dari variabel melalui kamus ... Meskipun sangat lurus ke depan tetapi membutuhkan pengkodean untuk memberi tahu nilai-nilai ordinal dan apa pemetaan sebenarnya dari teks ke integer sesuai pesanan.
Dengan kata lain, jika Anda bertanya-tanya apakah akan digunakan OrdinalEncoder
, harap dicatat OrdinalEncoder
mungkin sebenarnya tidak memberikan "penyandian ordinal" seperti yang Anda harapkan !
OrdinalEncoder
?