Data kategorik: Kosakata dan encoding one-hot

Istilah dimensi adalah sinonim untuk jumlah elemen dalam vektor fitur. Beberapa fitur kategorikal memiliki dimensi rendah. Contoh:

Nama fitur # kategori Kategori sampel
snowed_today 2 Benar, Salah
skill_level 3 Pemula, Praktisi, Pakar
season 4 Musim Dingin, Musim Semi, Musim Panas, Musim Gugur
day_of_week 7 Senin, Selasa, Rabu
planet 8 Merkurius, Venus, Bumi

Jika fitur kategorikal memiliki sedikit kemungkinan kategori, Anda dapat mengenkodenya sebagai kosakata. Dengan encoding kosakata, model akan memperlakukan setiap nilai kategorik yang mungkin sebagai fitur terpisah. Selama pelatihan, mempelajari bobot yang berbeda untuk setiap kategori.

Misalnya, Anda membuat model untuk memprediksi harga mobil, sebagian, pada fitur kategoris yang bernama car_color. Mungkin mobil merah bernilai lebih dari sekadar mobil hijau. Karena produsen menawarkan jumlah warna eksterior yang terbatas, car_color fitur kategorikal berdimensi rendah. Ilustrasi berikut menyarankan kosakata (nilai yang mungkin) untuk car_color:

Gambar 1. Setiap warna dalam palet 
direpresentasikan sebagai satu warna
      aplikasi baru. Artinya, setiap warna adalah fitur terpisah dalam vektor fitur.
      Misalnya, 'Merah' adalah fitur 'Oranye' adalah fitur terpisah,
      dan seterusnya.
Gambar 1. Fitur unik untuk setiap kategori.

Latihan: Periksa intuisi Anda

Benar atau Salah: Model machine learning dapat dilatih langsung di nilai string mentah, seperti "Red" dan "Black", tanpa mengonversi nilai-nilai ini menjadi vektor numerik.
Benar
Selama pelatihan, suatu model hanya dapat memanipulasi bilangan floating point. String "Red" bukan bilangan floating point. Anda harus mengonversi string seperti "Red" menjadi angka floating point.
Salah
Model machine learning hanya dapat dilatih pada fitur yang memiliki nilai floating point, jadi Anda harus mengonversi string tersebut menjadi nilai floating point sebelum pelatihan.

Nomor indeks

Model machine learning hanya dapat memanipulasi bilangan floating point. Oleh karena itu, Anda harus mengonversi setiap string menjadi nomor indeks yang unik, seperti pada ilustrasi berikut:

Gambar 2. Setiap warna dikaitkan dengan nilai bilangan bulat yang unik. Sebagai
      contoh, 'Merah' dikaitkan dengan bilangan bulat 0, 'Oranye' dengan
      bilangan bulat 1, dan seterusnya.
Gambar 2. Fitur yang diindeks.

Periksa intuisi Anda

Apakah model Anda harus berlatih langsung pada nomor indeks yang ditampilkan pada Gambar 2?
Ya
Jika model dilatih dengan angka indeks, model itu akan salah memperlakukan masing-masing sebagai nilai numerik dan pertimbangkan "Black" (nomor indeks 5) menjadi 5 kali lebih bermakna pada model daripada "Orange" (nomor indeks 1).
Tidak
Model Anda tidak boleh berlatih dengan nomor indeks. Jika ya, model Anda akan memperlakukan setiap nomor indeks sebagai angka dan menganggap "Black" (nomor indeks 5) sebagai 5 kali lebih bermakna bagi model dibandingkan "Orange" (indeks nomor 1).

Enkode one-hot

Langkah berikutnya dalam membangun kosakata adalah mengonversi setiap nomor indeks menjadi enkode one-hot-nya. Dalam encoding one-hot:

  • Setiap kategori diwakili oleh vektor (array) elemen N, dengan N adalah jumlah kategori. Misalnya, jika car_color memiliki delapan kemungkinan kategori, maka vektor one-hot yang merepresentasikan akan memiliki delapan elemen.
  • Tepat salah satu elemen dalam vektor one-hot memiliki nilai 1,0; semua elemen yang tersisa memiliki nilai 0.0.

Misalnya, tabel berikut menunjukkan encoding one-hot untuk masing-masing car_color:

Fitur Merah Orange Biru Kuning Hijau Hitam Ungu Cokelat
"Merah" 1 0 0 0 0 0 0 0
"Oranye" 0 1 0 0 0 0 0 0
"Biru" 0 0 1 0 0 0 0 0
"Kuning" 0 0 0 1 0 0 0 0
"Hijau" 0 0 0 0 1 0 0 0
"Hitam" 0 0 0 0 0 1 0 0
"Ungu" 0 0 0 0 0 0 1 0
"Cokelat" 0 0 0 0 0 0 0 1

Ini adalah vektor one-hot, bukan string atau nomor indeks, yang diteruskan ke vektor fitur. Model mempelajari bobot terpisah untuk setiap elemen vektor fitur.

Ilustrasi berikut menunjukkan berbagai transformasi dalam representasi kosakata:

Gambar 3. Diagram proses menyeluruh untuk memetakan kategori
      beberapa vektor fitur. Pada diagram, fitur inputnya adalah 'Kuning',
      'Oranye', 'Biru', dan 'Biru' untuk kedua kalinya.  Sistem menggunakan
      kosakata ('Merah' adalah 0, 'Oranye' adalah 1, 'Biru' adalah 2, 'Kuning' adalah 3, dan
      seterusnya) untuk memetakan nilai input ke ID. Dengan demikian, sistem memetakan 'Yellow',
      'Oranye', 'Biru', dan 'Biru' menjadi 3, 1, 2, 2. Sistem kemudian mengonversi
      nilai-nilai tersebut ke vektor fitur one-hot. Misalnya, jika suatu sistem
      dengan delapan kemungkinan warna, 3 menjadi 0, 0, 0, 1, 0, 0, 0, 0.
Gambar 3. Proses menyeluruh untuk memetakan kategori ke vektor fitur.

Representasi renggang

Fitur yang nilainya sebagian besar nol (atau kosong) disebut sebagai fitur renggang. Banyak fitur kategorik, seperti car_color, cenderung merupakan fitur yang jarang. Representasi renggang berarti menyimpan posisi kelas 1.0 dalam vektor renggang. Misalnya, vektor one-hot untuk "Blue" adalah:

[0, 0, 1, 0, 0, 0, 0, 0]

Karena 1 berada di posisi 2 (saat memulai hitungan dari 0), nilai representasi sparse untuk vektor one-hot sebelumnya adalah:

2

Perhatikan bahwa representasi renggang memakai memori yang jauh lebih sedikit daripada vektor one-hot delapan elemen. Yang penting, model harus dilatih berdasarkan vektor one-hot, bukan representasi renggang.

Pencilan dalam data kategorik

Seperti data numerik, data kategoris juga berisi {i>outlier<i}. Misalkan car_color tidak hanya berisi warna-warna populer, tetapi juga beberapa warna yang jarang digunakan warna pencilan, seperti "Mauve" atau "Avocado". Alih-alih memberikan masing-masing warna {i>outlier<i} ini kategori yang terpisah, Anda dapat mengelompokkannya menjadi satu "{i>catch-all<i}" kategori bernama kehabisan kosakata (OOV). Dengan kata lain, semua warna {i>outlier<i} digabungkan menjadi satu bucket outlier. Sistem mempelajari satu bobot untuk bucket pencilan tersebut.

Mengenkode fitur kategorik berdimensi tinggi

Beberapa fitur kategorikal memiliki jumlah dimensi yang tinggi, seperti pesan dalam tabel berikut:

Nama fitur # kategori Kategori sampel
words_in_english ~500.000 "bahagia", "berjalan"
US_postal_codes ~42.000 "02114", "90301"
last_names_in_Germany ~850.000 "Schmidt", "Schneider"

Ketika jumlah kategori tinggi, enkode one-hot biasanya merupakan pilihan yang buruk. Embedding, dijelaskan dalam Modul embedding, biasanya pilihan yang jauh lebih baik. Embedding secara substansial mengurangi jumlah dimensi kustom, yang menguntungkan model dalam dua cara penting:

  • Model ini biasanya dilatih lebih cepat.
  • Model yang dibuat biasanya menyimpulkan prediksi dengan lebih cepat. Yaitu, memiliki latensi yang lebih rendah.

Hashing (juga disebut hashing ) adalah cara yang kurang umum untuk mengurangi jumlah dimensi.