Underfitting dan Overfitting adalah dua permasalahan yang kerap terjadi ketika melatih model machine learning. Sederhananya, underfitting memiliki performa yang buruk saat pelatihan sehingga tidak dapat memprediksi data baru dengan tepat. Sedangkan pada kasus overfitting, model dapat dikatakan "terlalu pintar" saat pelatihan. Bukankah malah bagus kalau model kita terlalu pintar? Sayangnya tidak, ketika diberikan data baru, ia justru akan "ragu-ragu" untuk memberikan prediksi dengan benar. Sebagaimana quotes dari seorang filsuf dan matematikawan terkenal, yaitu:
The whole problem with Artificial Intelligence is that bad models are so certain of themselves and good models are so full of doubts. – BertrAIND Russell
Untuk mengetahui lebih jelas apa itu underfitting dan overfitting, lihatlah analogi berikut. Katakanlah besok kita akan ujian, dan malam ini kita belajar untuk mempersiapkannya. Namun kita bisa saja melakukan kesalahan dalam proses belajar sehingga tidak mendapatkan hasil yang diinginkan. Misalnya saja kita bermalas-malasan dan tidak belajar dengan cukup, kita mungkin akan gagal menghadapi ujian dan mendapat nilai yang buruk. Atau kita belajar dengan sangat keras namun dengan cara yang salah. Misalnya, alih-alih berfokus pada materi yang akan diujikan, kita malah menghafal seluruh isi buku kata demi kata. Kira-kira bagaimana hasil ujian kita besok? Apakah kita akan melewatinya dengan baik? Sepertinya tidak, karena kita hanya menghafal tanpa memahaminya. Pilihan terbaik tentu saja belajar dengan benar dan dengan cara yang memungkinkan kita menjawab pertanyaan baru yang belum pernah kita lihat sebelumnya tentang topik tersebut.
Dalam machine learning, underfitting sama seperti kita yang tidak cukup belajar untuk persiapan ujian. Hal ini terjadi karena kita mencoba melatih model dengan cara yang terlalu sederhana, sehingga model tidak dapat mempelajari data dengan baik. Overfitting sangat mirip ketika kita menghafalkan keseluruhan isi buku daripada mempelajari materi ujian besok. Di dalam machine learning, ini terjadi ketika kita mencoba melatih model yang terlalu rumit, dan itu sama saja menghafal data alih-alih mempelajarinya dengan baik. Model yang baik adalah model yang terlihat seperti kita telah belajar dengan baik untuk menghadapi ujian. Dengan demikian, model mampu membuat prediksi yang baik pada data baru yang belum pernah dilihat.
Cara lain untuk melihat underfitting dan overfitting adalah ketika misalnya kita memiliki dua buah tugas, yaitu untuk memotong cabai dan memotong kayu. Bayangkan jika kita diminta untuk memotong bongkahan kayu namun hanya memiliki cutter kecil. Ini adalah contoh underfitting. Kita tidak akan bisa menyelesaikan tugas dengan baik karena terlalu meremehkan masalah dan tidak menyiapkan peralatan yang seharusnya. Sama halnya dalam machine learning, kita mungkin memiliki dataset yang sangat kompleks, namun model yang kita latih terlalu sederhana sehingga tidak dapat menangkap kompleksitas dari dataset tersebut.
Sebaliknya, jika kita diminta memotong cabai dan kita malah menggunakan kapak alih-alih pisau masak, bukankah itu berlebihan? Ini adalah contoh overfitting. Kita mungkin bisa memotong cabai, tetapi kita juga berpotensi menghancurkan benda-benda yang lain. Ini bukanlah solusi yang baik. Data kita sederhana, namun model kita terlalu rumit. Model dapat menyesuaikan data kita, namun alih-alih mempelajarinya, yang terjadi malah model tersebut menghafalnya.
Sebelumnya kita pernah membahas tentang perbedaan parameter dan hyperparameter. Mengatur hyperparameter yang tepat untuk model sangatlah penting. Jika kita salah mengatur beberapa nilai di antara hyperparameter tersebut, maka kita akan cenderung menjumpai masalah underfitting atau overfitting.
Contoh underfitting dan overfitting menggunakan polynomial regression
Perhatikan gambar di bawah. Kira-kira, jenis polynomial apa yang cocok untuk dataset pada gambar di bawah ini? Apakah polynomial orde 1 yang akan membentuk garis? atau orde 2 dengan bentuk parabola, ataukah kubik, atau mungkin polynomial orde 100? Kita sempat belajar sekilas tentang polynomial regression pada postingan berikut. Ingatlah bahwa tingkat atau orde polynomial adalah eksponen tertinggi dari sebuah persamaan. Misalnya, polynomial 2x14 + 9x6 – 3x + 2 memiliki orde 14.
Kita mungkin berpikir bahwa dataset di atas akan membentuk kurva parabola yang melengkung ke bawah (seperti wajah sedih). Jika demikian, maka itu polynomial orde 2. Mudah untuk memutuskannya ketika kita menggunakan mata kita sebagai manusia. Namun komputer tidak dapat melakukan itu. Komputer perlu mencoba banyak nilai untuk tingkat polynomial dan entah bagaimana ia akan memilih yang terbaik. Katakanlah komputer akan mencoba menyesuaikannya dengan polynomial orde 1, 2, dan 10. Ketika kita memilih menggunakan polynomial orde 1 (garis), 2 (kuadrat), dan 10 (kurva yang berosilasi paling banyak sembilan kali) ke himpunan data ini, maka kita memperoleh hasil yang ditunjukkan pada gambar di bawah.
Pada gambar di atas, kita dapat melihat 3 model; model 1, model 2, dan model 3. Perhatikanlah, model 1 terlalu sederhana, karena ini adalah garis yang mencoba menyesuaikan himpunan data kuadrat. Kita tidak akan menemukan garis yang bagus agar sesuai dengan himpunan data ini, karena himpunan data tidak terlihat seperti garis. Oleh karena itu, model 1 adalah contoh nyata dari underfitting. Selanjutnya, model 2 terlihat sangat cocok dengan dataset. Model kedua ini tidak underfitting maupun overfitting. Model 3 sangat cocok dengan data, tetapi sangat meleset dari intinya. Data dimaksudkan untuk terlihat seperti parabola dengan sedikit noise, dan model 3 justru menggambar polynomial yang sangat rumit dengan orde 10. Memang, model 3 berhasil melewati masing-masing titik, tetapi tidak menangkap esensi data. Model 3 adalah contoh nyata dari overfitting.
Sebagai manusia, kita tahu bahwa model yang paling cocok adalah model 2. Tapi apa yang dilihat komputer? Komputer hanya dapat menghitung error function. Jika teman-teman ingat, kita pernah mempelajari dua jenis error function; absolute error dan square error pada postingan berikut. Untuk kejelasan visual, dalam contoh ini kita akan menggunakan mean absolute error yang merupakan rata-rata dari jumlah nilai absolut jarak antara titik dan kurva, meskipun argumen yang sama juga akan berlaku dengan square error. Untuk model 1, titiknya jauh dari model, jadi errornya sudah pasti besar. Untuk model 2, jarak ini kecil, sehingga errornya kecil. Namun, untuk model 3, jaraknya nol karena semua titik jatuh di kurva yang sebenarnya. Ini berarti, komputer akan berpikir bahwa model yang sempurna adalah model 3. Ini tidak baik. Kita perlu cara untuk memberi tahu komputer bahwa model terbaik adalah model 2 dan model 3 itu overfitting. Bagaimana kita bisa melakukan ini? Hayoo gimana, hehehe.
Bagaimana komputer memilih model yang tepat?
Salah satu cara untuk menentukan apakah suatu model overfitting atau tidak adalah dengan melakukan testing atau pengujian. Jadi teman-teman, ketika kita akan melatih model, kita akan membagi dataset ini setidaknya menjadi dua kelompok; yaitu dataset untuk pelatihan, dan dataset untuk pengujian. Perlu diingat, dataset pengujian tidak boleh digunakan untuk melatih model. Setelah melatih model menggunakan dataset pelatihan, selanjutnya kita perlu mengevaluasi model menggunakan dataset pengujian. Dengan cara ini, kita dapat memastikan apakah modelnya pandai menggeneralisasi ke data yang tidak terlihat.
Perhatikan bahwa masalah yang sebenarnya terjadi pada model 3 bukanlah karena kurva tidak dapat menyesuaikan data, melainkan karena model ini tidak mampu menggeneralisasi data dengan baik, sehingga ketika diberikan data baru yang belum pernah terlihat, ia akan bingung, karena model hanya menghafal seluruh dataset tanpa menangkap esensinya.
Perhatikan gambar di bawah, anggap saja segitiga itu adalah dataset pengujian, dan lingkaran adalah dataset pelatihan. Sekarang mari kita periksa angka ini secara rinci. Dengan kata lain, mari kita periksa seberapa besar error atau kesalahan yang dihasilkan model pada saat pelatihan dan pengujian. Kita akan menyebut kedua error ini sebagai error pelatihan dan error pengujian.
Untuk mengilustrasikan error, kita akan menggambar garis vertikal dari titik ke kurva. Mean absolute error adalah rata-rata panjang garis-garis ini. Melihat baris atas kita dapat melihat bahwa model 1 memiliki error pelatihan besar, model 2 memiliki error pelatihan kecil, dan model 3 memiliki error pelatihan sangat kecil (nol, pada kenyataannya). Dengan demikian, model 3 melakukan pekerjaan terbaik pada set pelatihan.
Namun, ketika kita sampai pada set pengujian, banyak hal yang berubah. Model 1 masih memiliki error pengujian yang besar, yang berarti bahwa ini hanyalah model yang buruk, berkinerja buruk pada saat pelatihan dan pengujian. Model 2 memiliki error pelatihan dan error pengujian yang kecil, ini berarti model 2 adalah model yang baik. Model 3 menghasilkan error pengujian yang besar, namun memiliki error yang kecil saat pelatihan, oleh sebab itu, kita dapat menyimpulkan bahwa model 3 overfitting.
Dengan demikian, cara untuk mengetahui apakah model underfitting, overfitting, atau baik adalah dengan melihat error pada saat pelatihan dan pengujian. Jika kedua error pada keduanya tinggi, maka itu underfitting. Jika error pelatihan dan error pengujian rendah, maka itu adalah model yang baik. Jika error pelatihan rendah dan error pengujian tinggi, maka itu overfitting.
Bagaimana kita memilih dataset pengujian, dan seberapa besar seharusnya?
Jika kita melatih model dalam production di mana data selalu mengalir, maka kita dapat memilih beberapa data baru sebagai dataset pengujian. Tetapi bagaimana jika kita tidak memiliki cara untuk mendapatkan data baru, dan yang kita miliki hanyalah kumpulan data asli yang misalnya terdiri dari 10 titik data? Ketika ini terjadi, kita dapat menggunakan beberapa data saja sebagai dataset pengujian. Berapa banyak data? Itu tergantung pada berapa banyak data yang kita miliki, tetapi dalam praktiknya, menggunakan 10% hingga 20% dari data keseluruhan sebagai dataset pengujian tampaknya akan bekerja dengan baik.
Bisakah kita menggunakan data pengujian kita untuk melatih model? Tidak!
Sebelumnya telah saya sebutkan, dataset pengujian tidak boleh digunakan untuk melatih model. Dalam machine learning, kita selalu perlu mengikuti aturan penting: ketika kita membagi data kita menjadi dataset pelatihan dan pengujian, kita harus menggunakan data pelatihan untuk melatih model, dan tidak boleh sama sekali menyentuh dataset pengujian saat melatih model atau menggunakannya untuk keputusan tentang hyperparameter model.
Saat ini, aturan tersebut tampak mudah untuk diikuti. Namun pada kenyataannya, aturan tersebut sangat mudah untuk dilanggar secara tidak sengaja. Bahkan kita melakukannya pada contoh di atas, ups!
Pada contoh di atas, kita memiliki tiga model polynomial regression: orde 1, orde 2, dan orde 10, dan pada awalnya kita tidak tahu mana yang harus dipilih. Kita menggunakan data pelatihan untuk melatih ketiga model, kemudian kita menggunakan data pengujian untuk memutuskan model mana yang akan dipilih. Kita seharusnya tidak boleh menggunakan data pengujian untuk membuat keputusan apa pun tentang model. Hal ini dapat berpotensi menyebabkan overfitting setiap kali membangun model dengan dataset yang terlalu banyak.
Bagaimana solusinya? kita dapat membuat pecahan baru pada dataset kita, yaitu dataset validasi yang akan kita gunakan untuk membuat keputusan. Sederhananya, kita membagi dataset menjadi 3 bagian, yaitu:
- Dataset Pelatihan: Untuk melatih model
- Dataset Validasi: Untuk membuat keputusan model mana yang akan digunakan
- Dataset Pengujian: Untuk mengecek seberapa baik model kita
Jadi, dalam contoh di atas, kita akan memiliki dua poin data lagi yang akan digunakan untuk validasi, dan melihat error validasi untuk membantu kita memutuskan bahwa model terbaik untuk digunakan adalah model 2. Kita harus menggunakan dataset pengujian di bagian paling akhir, untuk melihat seberapa baik model kita melakukannya. Jika modelnya tidak bagus, kita harus membuang semuanya dan mulai dari awal lagi. Kasarnya, kita gagal melatih model.
Pembagian paling umum adalah menggunakan split 60-20-20 atau split 80-10-10—dengan kata lain, 60% pelatihan, validasi 20%, pengujian 20%, atau pelatihan 80%, validasi 10%, pengujian 10%.
Lalu, adakah teknik lain yang dapat dilakukan untuk menghindari overfitting? Tentu ada. Kita akan membahasnya di postingan berikutnya.
See you~