Mencoba Linear Regression di Golang
(Read the english version here : https://blog.gavinda.dev/posts/implementing-linear-regression-in-go/)
Minggu ini saya memutuskan untuk mempelajari salah satu algoritma yang bisa dibilang paling mudah dalam bidang Machine Learning, yaitu Linear Regression. Soalnya akhir-akhir ini saya tertarik ke Machine Learning. Kalo ada temen-temen yang lebih paham, silahkan komen di bawah ya, hehe. Tulisan ini hasil pembelajaran saya mengenai Linear Regression. Optimalnya sih pake Python sebenernya, berhubung saya belum terlalu menguasai, jadi ya udah pake yang bisa aja hehe.
Linear Regression
Apa sih Linear Regression ? Kurang lebih gini penjelasannya, salah satu metode yang digunakan untuk memodelkan hubungan independent variable dan dependent variable ke dalam sebuah garis. Contohnya gini, hubungan antara jarak dan kecepatan, luas rumah dan harganya, umur dan berat seseorang, dll. Biasanya dilambangkan dengan variabel X dan Y. Kalo digambarkan kayak gini jadinya.
Titik-titik di sekitar garis tersebut adalah data-data yang kita peroleh melalui sebuah penelitian, dataset publik, dll. Rumus yang dipake adalah
y = mx+b
Ingat pelajaran persamaan garis lurus waktu SMA ? Ya, konsepnya kurang lebih kayak gitu. Rumus tersebut adalah rumus garis lurus yang memotong sumbu Y, dimana m adalah kemiringan garis dan b adalah titik perpotongan di sumbu Y. Tugas kita adalah menemukan persamaan garis miring tersebut. Ada beberapa rumus persamaan garis lurus yang bisa dipake. Tapi kalo dicoba pake titik-titik tersebut, bakalan beda-beda garisnya. Sementara yang dibutuhin adalah 1 persamaan garis lurus yang paling optimal yang melewati kumpulan titik-titik tersebut. Gimana caranya ?
Gradient Descent
Salah satu dan yang paling sering dipake adalah Gradient Descent. Langkah-langkah algoritma ini adalah melakukan perulangan beberapa kali menggunakan pasangan X dan Y untuk menentukan persamaan garis yang optimal. Jadi tujuan akhirnya adalah menemukan nilai m dan b yang paling optimal. Nah untuk menemukan yang paling optimal, biasanya menggunakan bantuan MSE (Mean Squared Error) dan adanya variabel learning rate yang akan membantu agar garis tidak melenceng terlalu jauh. Rumus dari MSE adalah
Nah kalo rumus persamaan garis di awal kita masukin kesitu jadinya gini
Selanjutnya kita akan mencari turunan partial dari fungsi tersebut
Turunan Parsial
Lagi-lagi kita harus mengingat pelajaran matematika haha. Kita mulai dari mencari turunan fungsi dulu aja deh. Temen-temen bisa baca disini untuk me-refresh memori lama tentang turunan fungsi https://smatika.blogspot.com/2016/04/turunan-fungsi-aljabar_11.html. Nah habis baca-baca disitu, kita lanjut mencari turunan parsial dari sebuah fungsi. Temen-temen bisa baca disini https://aninpranidhana.wordpress.com/turunan/, fokus ke bagian turunan parsial dua variabel aja karena nanti kita akan pake yang itu.
Berikut adalah turunan parsial MSE terhadap m
dan ini adalah turunan parsial MSE terhadap b
Kedua fungsi tersebut lah yang akan kita gunakan untuk mencari m dan b
Talk is Cheap, Show Me the Code
Potongan kode berikut, bisa temen-temen liat di sini https://github.com/rabbitmeow/go-linear-regression. Oke kita mulai, pertama kita buat struktur datanya, kayak gini nih
XValues adalah nilai X yang akan kita masukin nanti. YValues adalah nilai Y yang juga akan kita masukin nanti. Nah Epoch ini adalah angka perulangan yang akan kita set. Tentu ada hubungannya dengan LearningRate. Jadi angka LearningRate nggk usah gede-gede nanti garisnya malah melenceng, Epoch nya juga jangan banyak-banyak biar looping-nya nggak kelamaan. Nanti saya pake Epoch 200 dan LearningRate 0.05 ya. Silahkan ntar dicoba-coba aja pake source code diatas.
Kalo method diatas, fungsinya adalah untuk menggambar data X dan Y yang kita punya ke sebuah grafik. Nanti method ini bakal dipanggil nih. Lanjut.
Nah potongan kode diatas adalah looping yang terjadi di dalam method Calculate. Epoch yang tadi kita omongin, dipake buat ini nih. Output-nya adalah hasil akhir m dan b. Lanjut.
Method di atas lah yang menjadi kunci menentukan kemiringan garis dan titik perpotongan sumbu Y pake 2 fungsi turunan parsial tadi tuh. Coba liat disitu, habis looping. Di sana lah variabel LearningRate dipake. Biar garisnya nggak melenceng kejauhan. Oke, semua method yang akan dipake udah siap nih, lanjut ke package main yak.
Package main-nya gitu doang kok. Tinggal panggil package linearregression yang kita buat diatas tadi ke situ. Terus masukin X, Y, Epoch, dan LearningRate-nya. Habis itu kita panggil method PlotTheDataset buat bikin grafiknya dari X dan Y yang kita masukin. Panggil method Calculate buat ngitung hasil akhirnya dengan parameter true yang akan gambar garisnya di grafik. Setelah kita run, akan ketemu rumus akhirnya yaitu
y = 0.80 x + 0.39
Hasilnya grafiknya bakal kayak gini nih.
Oke mungkin cukup segitu aja kali ini. Kalo ada pertanyaan atau mungkin koreksi, boleh bisa langsung komen di bawah atau kontak saya langsung ke web. Sekian, terima kasih.