Ketika melatih model machine learning, kita terus berusaha dan mencoba mengotak-atik model hingga menghasilkan error sekecil mungkin. Tapi itu sama saja seperti mengatakan, "Rahasia untuk berhasil dalam hidup adalah membuat kesalahan sesedikit mungkin." Bukankah akan terdengar lebih positif jika kita berkata, "Ini adalah hal-hal yang dapat Anda lakukan untuk meningkatkan kehidupan Anda", dibandingkan dengan "Ini adalah hal-hal yang harus Anda hindari"? Mari kita lihat teknik regularization dengan cara ini.
Dengan menggunakan teknik regularization, kita tidak perlu melatih beberapa model kemudian mencari model yang terbaik. Sebaliknya, pelatihan dilakukan hanya sekali, namun selama pelatihan, selain meningkatkan kinerja model, kita juga akan mengurangi kompleksitas model tersebut. Kunci untuk melakukan ini adalah mengukur kinerja dan kompleksitas pada saat yang bersamaan.
Sebelumnya, mari kita analogikan tentang bagaimana mengukur kinerja dan kompleksitas model. Bayangkan kita memiliki tiga buah rumah, dan ketiga rumah tersebut atapnya bocor. Kemudian, kita memanggil tiga tukang atap dan masing-masing memperbaiki satu rumah. Tukang atap pertama, membawa perban, yang kedua membawa sirap, dan yang terakhir membawa titanium. Tentu saja kita dapat melihat dengan gamblang bahwa yang terbaik adalah tukang ada kedua yang membawa sirap, karena tukang atap pertama terlalu menggampangkan masalah (underfitting) dan tukang atap ketiga terlalu memperumitnya (overfitting).
Namun, kita perlu membuat keputusan menggunakan angka, jadi mari kita lakukan beberapa pengukuran. Cara untuk mengukur kinerja atap adalah dengan melihat seberapa banyak air yang bocor setelah mereka memperbaiki atap. Masing-masing memiliki skor sebagai berikut:
Kinerja (dalam mL air bocor)
- Atap 1 (perban): 1.000 mL air
- Atap 2 (sirap): 1 mL air
- Atap 3 (titanium): 0 mL air
Atap mana yang akan kita pilih? Pada informasi di atas, terlihat bahwa atap 1 memiliki kinerja yang sangat buruk, karena atapnya masih saja kebocoran air. Dengan demikian, kita dapat membuang pilihan pertama. Kita mungkin ingin memilih opsi yang ketiga, karena tidak ada kebocoran sama sekali. Sayangnya, ini kurang bijak. Selain kinerja, kita membutuhkan ukuran kompleksitas untuk membantu kita membuat keputusan yang tepat. Untuk mengukur kompleksitas, kita dapat menggunakan variabel biaya yang akan ditagihkan (dalam dollar). Adapun harganya adalah sebagai berikut:
Kompleksitas (dalam harga)
- Atap 1 (perban): $1
- Atap 2 (sirap): $100
- Atap 3 (titanium): $100.000
Sekarang kita dapat melihat bahwa opsi kedua lebih baik daripada opsi ketiga. Tapi jika merujuk pada biaya, bukankah opsi pertama yang paling murah? Kenapa kita tidak menggunakan opsi pertama saja? Nah.. Tampaknya kita perlu menggabungkan ukuran kinerja dan kompleksitas. Kita dapat menambahkan jumlah air pada atap yang bocor dan harganya, sehingga didapatkan data sebagai berikut:
Kinerja + Kompleksitas
- Atap 1 (perban): 1001
- Atap 2 (sirap): 101
- Atap 3 (titanium): 100.000
Sekarang jelas bahwa jenis atap 2 adalah yang terbaik, yang berarti bahwa mengoptimalkan kinerja dan kompleksitas pada saat yang sama menghasilkan hasil yang baik yang juga sesederhana mungkin. Inilah yang dimaksud dengan regularization: mengukur kinerja dan kompleksitas dengan dua error function yang berbeda dan menambahkannya untuk mendapatkan error function yang lebih kuat. Error function baru ini memastikan bahwa model kita berkinerja dengan baik namun tidak terlalu rumit.
Supaya lebih jelas lagi, kita beralih ke contoh lainnya. Bayangkan kita memiliki situs web untuk streaming film dan ingin membangun sistem pemberi rekomendasi. Agar lebih sederhana, bayangkan kita hanya memiliki 10 film: F1, F2, ..., F10. Dan sebuah film baru, F11. Kita ingin membangun model linear regression untuk merekomendasikan film 11 berdasarkan 10 film sebelumnya.
Dalam kasus ini, kita memiliki dataset 100 pengguna. Untuk setiap pengguna, terdapat 10 fitur yang merupakan waktu (dalam detik) yang dihabiskan pengguna untuk menonton masing-masing dari 10 film sebelumnya. Jika pengguna belum menonton suatu film, maka jumlahnya adalah 0. Label (yang akan diprediksi) untuk setiap pengguna adalah jumlah waktu yang akan dihabiskan oleh pengguna untuk menonton film 11. Kita ingin membangun model linear regression yang sesuai dengan dataset ini. Dengan demikian, persamaan untuk prediksi waktu yang dihabiskan pengguna untuk menonton film 11 adalah linier, dan akan tampak seperti berikut:
ŷ = w1x1 + w2x2 + w3x3+ w4x4 + w5x5 + w6x6 + w7x7 + w8x8 ++ w9x9 + w10x10 + b
Dimana:
- ŷ = jumlah waktu seorang pengguna menonton film 11 yang diprediksi model
- xi = jumlah waktu seorang pengguna menonton film i, untuk i = 1, 2, ..., 10
- wi = bobot yang terkait dengan film i
- b = bias
Sekarang mari kita uji intuisi kita. Dari dua model berikut, model mana yang mungkin overfitting?
Model 1: ŷ = 2x3 + 1.4x7 – 0.5x9 + 4
Model 2: ŷ = 22x1 – 103x2 – 14x3 + 109x4 – 93x5 + 203x6 + 87x7 – 55x8 + 378x9 – 25x10 + 8
Jika kita lihat, model 2 tampak lebih rumit dan mungkin akan overfitting. Secara intuisi, tidak mungkin jumlah waktu menonton pengguna pada film 2 dikalikan dengan -103 kemudian ditambahkan dengan angka-angka lain untuk mendapatkan prediksi. Alih-alih mempelajari data, model justru menghafal data.
Sebaliknya, model 1 terlihat jauh lebih sederhana. Fakta yang terlihat dari model 1 adalah sebagian besar koefisiennya nol, kecuali film 3, 7, dan 9. Selanjutnya, dengan fakta bahwa koefisien film 3 dan 7 positif, model memberi tahu kita bahwa jika pengguna menonton film 3 atau film 7, maka mereka cenderung menonton film 11. Sebaliknya, karena koefisien film 9 negatif, maka jika pengguna menonton film 9, mereka kemungkinan tidak menonton film 11.
Tujuan kita adalah membangun model seperti model 1 dan menghindari model seperti model 2. Sayangnya, jika model 2 memiliki error yang lebih kecil daripada model 1, maka algoritma linear regression tentu akan memilih model 2. Apa yang harus kita lakukan? Di sinilah peran regularization diperlukan. Hal pertama yang kita perlukan adalah ukuran yang memberi tahu kita bahwa model 2 jauh lebih kompleks daripada model 1.
Mengukur kompleksitas model menggunakan L1-Norm dan L2-Norm
Mari kita lihat Model 1 dan Model 2 dari bagian sebelumnya. Perhatikan bahwa model dengan koefisien lebih banyak, atau koefisien dengan nilai lebih tinggi, cenderung lebih kompleks. Oleh karena itu, untuk mengukur kompleksitas model kita dapat menggunakan beberapa acuan seperti berikut ini:
- Jumlah nilai absolut dari koefisien (L1-norm)
- Jumlah kuadrat dari koefisien (L2-norm)
Tetapi sebelum kita mulai menghitung "norm", hal teknis kecil yang perlu kita ingat adalah; bias dalam model tidak termasuk dalam L1 dan L2 norm. Bias dalam model ini justru merupakan jumlah detik yang kita harapkan kepada pengguna untuk menonton film 11 jika mereka belum menonton salah satu dari 10 film sebelumnya. Angka ini tidak terkait dengan kompleksitas model. Oleh karena itu, kita akan mengabaikannya. Contoh perhitungan L1 dan L2 norm adalah sebagai berikut:
Ingatlah kedua model kita tadi
- Model 1: ŷ = 2x3 + 1.4x7 – 0.5x9 + 4
- Model 2: ŷ = 22x1 – 103x2 – 14x3 + 109x4 – 93x5 + 203x6 + 87x7 – 55x8 + 378x9 – 25x10 + 8
- Model 1: |2| + |1.4| + |–0,5| = 3,9
- Model 2: |22| + |–103| + |–14| + |109| + |–93| + |203| + |87| + |–55| + |378| + |–25| = 1.089
-
Model 1: 22 + 1.42 +
(–0.5)2 = 6.21
-
Model 2: 222 + (–103)2 +
(–14)2 + 1092 + (-93)2 +
2032 + 872 + (–55)2 +
3782 + (–25)2 = 227,131
-
Model 1: ŷ = 2x + 3
-
Model 2: ŷ = –x2 +
6x – 2
-
Model 3: ŷ = x9 + 4x8 – 9x7 + 3x6 – 14x5 – 2x4 – 9x3 + x2 + 6x + 10
L1 dan L2 norm dihitung sebagai berikut:
- Model 1: |2| = 2
- Model 2: |–1| + |6| = 7
- Model 3: |1| + |4| + |–9| + |3| + |–14| + |–2| + |–9| + |1| + |6| = 49
- Model 1: 22 = 4
-
Model 2: (–1)2 + 62 = 37
-
Model 3: 12 + 42 +
(–9)2 + 32 + (–14)2 +
(–2)2 + (–9)2 + 12 +
62 = 425
Kita telah mendapatkan cara untuk mengukur kompleksitas model, selanjutnya mari kita ke proses pelatihan model.
Memodifikasi error function
Selanjutnya kita akan melatih model linear regression menggunakan regularization. Kita sudah memiliki dua ukuran untuk model: ukuran kinerja (error function) dan ukuran kompleksitas (L1 atau L2 norm).
Ingatlah pada analogi kasus atap bocor sebelumnya, tujuan kita adalah menemukan atap dengan kualitas baik dan kompleksitas rendah. Kita melakukan ini dengan meminimalkan jumlah dua angka: ukuran kualitas dan ukuran kompleksitas. Regularization terdiri dari penerapan prinsip yang sama pada model machine learning. Dengan demikian, kita memiliki dua kuantitas: regression error dan regularization term.
- Regression Error: Ukuran kualitas model. Dalam kasus ini dapat berupa absolute error atau square error.
- Regularization Term: Ukuran kompleksitas model. Dalam kasus ini dapat berupa L1-norm atau L2-norm dari model.
Kuantitas yang ingin kita minimalkan untuk menemukan model yang baik dan tidak terlalu kompleks adalah error yang dimodifikasi, didefinisikan sebagai jumlah dari keduanya, seperti yang ditunjukkan pada rumus di bawah:
Error = Regression error + Regularization term
Regularization sangat umum digunakan sehingga model itu sendiri memiliki nama yang berbeda berdasarkan "norm" apa yang digunakan. Jika kita melatih model linear regression menggunakan L1-norm, maka model ini disebut Lasso Regression. Lasso adalah singkatan dari "least absolute shrinkage and selection operator". Dengan demikian, error function dapat dimodifikasi sebagai berikut:
Lasso regression error = Regression error + L1 normSebaliknya, jika kita melatih model menggunakan L2 norm, maka model ini disebut Ridge Regression. Istilah ridge berasal dari bentuk error function, karena menambahkan suku L2 norm ke regression error function mengubah sudut tajam menjadi lembah mulus saat kita memplotnya. Error function dapat dirumuskan menjadi:
Ridge regression error = Regression error + L2 normBaik Lasso maupun Ridge Regression bekerja dengan baik dalam praktiknya. Keputusan mana yang akan digunakan tergantung pada beberapa preferensi yang akan kita pelajari selanjutnya.
Regularization Parameter
Karena proses pelatihan model melibatkan pengurangan error function sebanyak mungkin, model yang dilatih dengan regularization, pada prinsipnya, harus memiliki kinerja tinggi dan kompleksitas rendah. Namun ini agak dilematik. Ketika kita mencoba membuat model yang berkinerja lebih baik, mode tersebut cenderung lebih kompleks, sedangkan jika kita mencoba mengurangi kompleksitas model, maka model berpotensi memiliki kinerja yang lebih buruk. Untungnya, sebagian besar teknik machine learning dilengkapi dengan hyperparameter.
Hyperparameter ini disebut regularization parameter. Tujuannya adalah untuk menentukan apakah proses pelatihan model harus menekankan kinerja atau kesederhanaan. Regularization parameter dilambangkan dengan λ (lambda). Kita akan mengalikan regularization term dengan λ, menambahkannya ke error regression, dan menggunakan hasil itu untuk melatih model. Rumus error baru menjadi sebagai berikut:
Error = Regression error + λ Regularization term
Jika kita memilih nilai 0 untuk λ, maka kita sama saja tidak menggunakan regularization. Namun ketika kita memilih nilai besar untuk λ, maka akan menghasilkan model sederhana yang mungkin tidak sesuai dengan dataset kita yang kompleks. Sangat penting untuk memilih nilai yang baik untuk λ, dan untuk ini, validasi adalah teknik yang berguna. Nilai λ yang umum digunakan adalah pangkat 10, seperti 10; 1; 0,1; 0,01, tetapi pilihan ini agak arbitrer. Kita akan memilih salah satu dari nilai tersebut yang membuat model kita bekerja paling baik di set validasi.
Dampak L1 dan L2 regularization dalam koefisien model
L1 dan L2 mungkin sekilas tampak serupa, namun keduanya memiliki efek yang berbeda pada koefisien model. Tergantung pada jenis model apa yang kita inginkan, memutuskan antara menggunakan L1 dan L2 bisa sangat penting.
Mari kita kembali ke contoh sistem rekomendasi film tadi, di mana kita sedang membangun model regresi untuk memprediksi jumlah waktu (dalam detik) yang akan dihabiskan pengguna untuk menonton film. Katakanlah kita telah melatih modelnya, dan persamaan yang kita dapatkan adalah sebagai berikut:
ŷ = 22x1 – 103x2 – 14x3 + 109x4 – 93x5 + 203x6 + 87x7 – 55x8 + 378x9 – 25x10 + 8
Jika kita menambahkan teknik regularization dan melatih model lagi, kita akan mendapatkan model yang lebih sederhana. Dua properti berikut dapat ditampilkan secara matematis:
- Jika kita menggunakan L1 (Lasso Regression), kita akan mendapatkan model dengan koefisien yang lebih sedikit. Dengan kata lain, regularisasi L1 mengubah beberapa koefisien menjadi nol. Dengan demikian, kita mungkin berakhir dengan persamaan seperti ŷ = 2x3 + 1,4x7 – 0,5x9 + 8
- Jika kita menggunakan L2 (Ridge Regression), kita akan mendapatkan model dengan koefisien yang lebih kecil. Dengan kata lain, regularisasi L2 mengecilkan semua koefisien tetapi jarang mengubahnya menjadi nol. Dengan demikian, kita mungkin berakhir dengan persamaan seperti ŷ = 0.2x1 – 0.8x2 – 1.1x3 + 2.4x4 – 0.03x5 + 1.02x6 + 3.1x7 – 2x8 + 2.9x9 – 0.04x10 + 8.
Jadi, tergantung pada jenis persamaan apa yang ingin kita dapatkan, kita dapat memutuskan antara menggunakan L1 atau L2.
Aturan praktis dan cepat yang dapat digunakan untuk memutuskan apakah kita ingin menggunakan L1 atau L2 adalah sebagai berikut: jika kita memiliki terlalu banyak fitur dan kita ingin menyingkirkan sebagian besar dari mereka, regularisasi L1 sangat cocok untuk itu. Jika kita hanya memiliki sedikit fitur dan percaya semuanya relevan, maka regularisasi L2 adalah yang kita butuhkan, karena itu tidak akan menghilangkan fitur berguna kita.
Contoh implementasi regularization menggunakan Turi Create
Setelah mempelajari konsep regularization, sekarang kita akan mencoba menerapkannya menggunakan python dengan bantuan library Turi Create.
Full kode: Polynomial Regression Regularization Notebook
Pertama, kita telah membuat dataset untuk polynomial orde 2 (parabola) yang tampak seperti di bawah ini
5 baris pertama dari dataset yang telah dibuat adalah sebagai berikut:
Cara melakukan polynomial regression menggunakan Turi Create adalah dengan menambahkan banyak kolom ke dataset sesuai dengan pangkat fitur utama dan menerapkan linear regression ke dataset yang diperluas ini. Katakanlah fitur utamanya adalah x, maka kita akan menambahkan kolom dengan nilai x2, x3, x4, dan seterusnya. Dengan demikian, model kita dapat menemukan kombinasi linear dari pangkat x, yang tepatnya merupakan polynomial dalam x. Jika SFrame yang berisi data kita sebut sebagai `data`, kita dapat menggunakan kode berikut untuk menambah kolom untuk pangkat hingga x199.
for i in range(2,200):
string = 'x^'+str(i)
data[string] = data['x'].apply(lambda x:x**i)
5 baris pertama dataset yang telah kita perluas tampak seperti berikut:
train, test = data.random_split(.8)
Sekarang dataset kita terbagi menjadi 2, set pelatihan yang disebut train dan set pengujian yang disebut test.
Cara menggunakan regularization dalam Turi Create sederhana: yang perlu kita lakukan hanyalah menentukan parameter l1_penalty dan l2_penalty di dalam create method ketika kita melatih model. Penalti 0 berarti kita tidak menggunakan regularization. Dengan demikian, kita akan melatih tiga model berbeda dengan parameter berikut:
- Tanpa Regularization
- l1_penalty = 0
- l2_penalty = 0
- L1Regularization
- l1_penalty = 0.1
- l2_penalty = 0
- L2 Regularization
- l1_penalty = 0
- l2_penalty = 0.1
model_no_reg = tc.linear_regression.create(train, target='y', l1_penalty=0.0, l2_penalty=0.0)
model_L1_reg = tc.linear_regression.create(train, target='y', l1_penalty=0.1, l2_penalty=0.0)
model_L2_reg = tc.linear_regression.create(train, target='y', l1_penalty=0.0, l2_penalty=0.1)
Model pertama tidak menggunakan regularization, yang kedua menggunakan L1 regularization dengan parameter 0.1, dan yang ketiga menggunakan L2 regularization dengan parameter 0.1. Plot fungsi yang dihasilkan ditunjukkan pada gambar di bawah. Perhatikan bahwa dalam gambar ini, titik-titik dalam set pelatihan adalah lingkaran, dan yang ada di set pengujian adalah segitiga.
Perhatikan bahwa model yang tidak menerapkan regularization sangat cocok dengan dataset pelatihan, namun kacau dan tidak sesuai dengan dataset pengujian. Model dengan L1 tampak kurang cocok dengan dataset pelatihan dan pengujian. Dan model dengan L2 Regularization melakukan tugasnya dengan luar biasa dan tampaknya menjadi model yang benar-benar mampu menangkap bentuk data.
Kita harus selalu mengevaluasi model dengan mengetahui seberapa baik kinerjanya di dalam batas-batas dataset, dan kita seharusnya tidak pernah mengharapkan model untuk melakukannya dengan baik di luar batas-batas itu. Bahkan kita manusia mungkin tidak dapat membuat prediksi yang baik di luar batas-batas model. Misalnya, menurut kalian, bagaimana kurva ini akan terlihat di luar dataset? Apakah akan berlanjut sebagai parabola yang terbuka ke bawah? Ataukah akan berosilasi selamanya seperti fungsi sinus? Jika kita tidak mengetahui hal ini, kita seharusnya tidak mengharapkan model untuk mengetahuinya. Jadi, cobalah untuk mengabaikan perilaku aneh pada titik akhir pada gambar di atas, dan fokus pada perilaku model di dalam interval di mana data berada.
Untuk menemukan error pengujian, kita menggunakan baris kode berikut, dengan nama model yang sesuai. Baris kode ini mengembalikan error maksimum dan root mean square error (RMSE).
model.predict(test)
Adapun hasilnya adalah sebagai berikut
- Model tanpa regularization: 338.61
- Model dengan L1 regularization: 10.08
- Model dengan L2 regularization: 3.41
Model tanpa regularization memiliki RMSE yang sangat besar. Di antara dua model lainnya, model dengan L2 regularization berkinerja jauh lebih baik. Berikut adalah dua pertanyaan untuk dipikirkan:
- Mengapa model dengan L2 berkinerja lebih baik daripada model dengan L1?
- Mengapa model dengan L1 terlihat datar, sedangkan model dengan L2 berhasil menangkap bentuk data?
Kedua pertanyaan tersebut memiliki jawaban yang serupa, dan untuk menemukannya, kita dapat melihat koefisien polynomial. Kita dapat memperolehnya dengan baris kode berikut:
model.coefficients
Setiap polynomial memiliki 200 koefisien, namun kita tidak perlu melihat semuanya. Dapatkah kalian melihat sesuatu dari data koefisien di bawah ini?
Melalui data di atas, kita dapat melihat bahwa:
- Model tanpa regularization memiliki koefisien yang besar, ini berarti polynomial kacau dan tidak baik untuk membuat prediksi.
- Model dengan L1 regularization hampir semua koefisiennya kecil—hampir 0. Ini berarti bahwa untuk nilai yang mendekati nol, polynomial sangat mirip dengan garis horizontal dengan persamaan ŷ = 0,57. Ini lebih baik dari model sebelumnya tetapi masih belum bagus untuk membuat prediksi.
- Model dengan L2 regularization, koefisiennya cenderung semakin kecil (namun tidak terlalu kecil) seiring dengan bertambahnya orde polynomial. Dengan demikian model ini layak untuk membuat prediksi.