Perbedaan antara OrdinalEncoder dan LabelEncoder

21

Saya membaca dokumentasi resmi scikit-belajar belajar setelah membaca buku tentang ML dan menemukan hal-hal berikut:

Dalam Dokumentasi itu diberikan tentang sklearn.preprocessing.OrdinalEncoder()sedangkan dalam buku itu diberikan tentang sklearn.preprocessing.LabelEncoder(), ketika saya memeriksa fungsionalitasnya itu tampak sama bagi saya. Bisakah Seseorang tolong beri tahu saya perbedaan antara keduanya?

Saurabh Singh
sumber

Jawaban:

15

Afaik, keduanya memiliki fungsi yang sama. Sedikit perbedaan adalah ide di baliknya. OrdinalEncoderuntuk konversi fitur, sedangkan LabelEncoderuntuk konversi variabel target.

Itu sebabnya OrdinalEncoderdapat memuat data yang berbentuk (n_samples, n_features)sementara LabelEncoderhanya dapat memuat data yang berbentuk (n_samples,)(meskipun di masa lalu digunakan LabelEncoderdalam lingkaran untuk menangani apa yang telah menjadi pekerjaan OrdinalEncodersekarang)

bakka
sumber
Kapan menggunakannya OrdinalEncoder?
stackunderflow
Sesuai dokumentasi yang dikutip di tautan itu, " LabelEncodertidak dimaksudkan untuk digunakan pada fitur, hanya pada target pembelajaran yang diawasi."
Yehuda
5

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 !

Kacang Merah
sumber
2
Saya sangat tidak setuju. Konsep di balik teknik pengkodean ini pada dasarnya berbeda. Ini bukan hanya tentang implementasi di perpustakaan.
Piotr Rarus - Reinstate Monica
1

Anda menggunakan pengodean ordinal untuk menjaga urutan data kategorikal yaitu dingin, hangat, panas; rendah sedang Tinggi. Anda menggunakan pengkodean label atau satu hot untuk data kategorikal, di mana tidak ada urutan dalam data yaitu anjing, kucing, paus. Periksa pos ini di media. Ini menjelaskan konsep-konsep ini dengan baik.

Piotr Rarus - Pasang kembali Monica
sumber
1
Mungkin ada ketidakkonsistenan dalam terminologi, tetapi ini tampaknya tidak benar sehubungan dengan pertanyaan OP pada LabelEncoder sklearn; itu dikodekan sebagai bilangan bulat dari 0 ke n_classes-1, sama seperti OrdinalEncoder.
Ben Reiniger