Adapun perbedaan OrdinalEncoderdan LabelEncoder implementasi , jawaban yang diterima menyebutkan bentuk data: ( OrdinalEncoderuntuk data 2D; bentuk (n_samples, n_features), LabelEncoderuntuk data 1D: untuk bentuk (n_samples,))
Karena itulah a OrdinalEncoderakan 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 LabelEncodervs 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 sklearnkelas / implementasi. Sangat menarik untuk melihat bagaimana implementasi tidak sesuai dengan konsep; khususnya OrdinalEncoder; khusus bagaimana Anda harus melakukan penyandian ordinal sendiri .
Adapun implementasi sepertinya LabelEncoderdan OrdinalEncodermemiliki 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?