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 # of categories Contoh kategori
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 jumlah kemungkinan kategori yang rendah, Anda dapat mengenkodenya sebagai kosakata. Dengan encoding kosakata, model memperlakukan setiap kemungkinan nilai kategori sebagai fitur terpisah. Selama pelatihan, model akan mempelajari bobot yang berbeda untuk setiap kategori.

Misalnya, Anda membuat model untuk memprediksi harga mobil, sebagian, berdasarkan fitur kategoris bernama car_color. Mungkin mobil merah bernilai lebih dari mobil hijau. Karena produsen menawarkan sejumlah kecil warna eksterior, car_color adalah fitur kategoris dimensi rendah. Ilustrasi berikut menyarankan kosakata (kemungkinan nilai) untuk car_color:

Gambar 1. Setiap warna dalam palet direpresentasikan sebagai fitur
      terpisah. 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 secara langsung pada nilai string mentah, seperti "Merah" dan "Hitam", tanpa mengonversi nilai ini menjadi vektor numerik.
Benar
Selama pelatihan, model hanya dapat memanipulasi bilangan floating point. String "Red" bukan angka floating point. Anda harus mengonversi string seperti "Red" menjadi bilangan floating point.
Salah
Model machine learning hanya dapat dilatih pada fitur dengan nilai floating point, sehingga 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 ke nomor indeks unik, seperti dalam ilustrasi berikut:

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

Latihan: Periksa intuisi Anda

Haruskah model Anda dilatih langsung pada nomor indeks yang ditampilkan dalam Gambar 2?
Ya
Jika model dilatih dengan nomor indeks, model tersebut akan salah memperlakukan setiap nomor sebagai nilai numerik dan menganggap "Black" (nomor indeks 5) 5 kali lebih bermakna bagi model daripada "Orange" (nomor indeks 1).
Tidak
Model Anda tidak boleh berlatih dengan nomor indeks. Jika demikian, model Anda akan memperlakukan setiap nomor indeks sebagai nilai numerik dan menganggap "Black" (nomor indeks 5) 5 kali lebih bermakna bagi model daripada "Orange" (nomor indeks 1).

Enkode one-hot

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

  • Setiap kategori direpresentasikan oleh vektor (array) elemen N, dengan N adalah jumlah kategori. Misalnya, jika car_color memiliki delapan kemungkinan kategori, vektor one-hot yang mewakili akan memiliki delapan elemen.
  • 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 setiap car_color:

Fitur Merah Orange Biru Kuning Hijau Hitam Ungu Cokelat
"Merah" 1 0 0 0 0 0 0 0
"Orange" 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 ke vektor fitur. Dalam diagram, fitur input adalah 'Kuning',
      'Oranye', 'Biru', dan 'Biru' untuk kedua kalinya.  Sistem menggunakan kosakata
      yang disimpan ('Merah' adalah 0, 'Oranye' adalah 1, 'Biru' adalah 2, 'Kuning' adalah 3, dan
      seterusnya) untuk memetakan nilai input ke ID. Dengan demikian, sistem memetakan 'Kuning',
      'Oranye', 'Biru', dan 'Biru' ke 3, 1, 2, 2. Sistem kemudian mengonversi
      nilai tersebut menjadi vektor fitur one-hot. Misalnya, dengan sistem
      yang memiliki 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 sebagian besar nilainya nol (atau kosong) disebut sebagai fitur jarang. Banyak fitur kategori, seperti car_color, cenderung merupakan fitur jarang. Representasi sparse berarti menyimpan posisi 1.0 dalam vektor sparse. Misalnya, vektor one-hot untuk "Blue" adalah:

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

Karena 1 berada di posisi 2 (saat memulai penghitungan dari 0), representasi yang jarang untuk vektor one-hot sebelumnya adalah:

2

Perhatikan bahwa representasi sparse menggunakan memori yang jauh lebih sedikit daripada vektor one-hot delapan elemen. Yang penting, model harus melatih pada vektor one-hot, bukan representasi jarang.

Outlier dalam data kategorik

Seperti data numerik, data kategoris juga berisi {i>outlier<i}. Misalkan car_color tidak hanya berisi warna populer, tetapi juga beberapa warna ekstrem yang jarang digunakan, seperti "Mauve" atau "Avocado". Daripada memberi setiap warna outlier ini kategori terpisah, Anda dapat menggabungkannya ke dalam satu kategori "umum" yang disebut out-of-vocabulary (OOV). Dengan kata lain, semua warna outlier dikelompokkan ke dalam satu bucket outlier. Sistem mempelajari satu bobot untuk bucket outlier tersebut.

Mengenkode fitur kategoris berdimensi tinggi

Beberapa fitur kategori memiliki banyak dimensi, seperti pada tabel berikut:

Nama fitur # of categories Contoh kategori
words_in_english ~500.000 "happy", "walking"
US_postal_codes ~42.000 "02114", "90301"
last_names_in_Germany ~850.000 "Schmidt", "Schneider"

Jika jumlah kategori tinggi, enkode one-hot biasanya merupakan pilihan yang buruk. Embedding, yang dijelaskan dalam modul Embedding terpisah, biasanya merupakan pilihan yang jauh lebih baik. Penyematan secara substansial mengurangi jumlah dimensi, yang menguntungkan model dengan dua cara penting:

  • Model ini biasanya berlatih lebih cepat.
  • Model yang dibuat biasanya menyimpulkan prediksi dengan lebih cepat. Artinya, model memiliki latensi yang lebih rendah.

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