Machine learning (ML), atau dalam bahasa Indonesia dikenal dengan Pembelajaran Mesin, adalah salah satu teknologi terpenting di era saat ini. Terdapat sangat banyak varian dari algoritma ML yang dapat digunakan untuk berbagai keperluan, mulai dari memprediksi data yang belum diobservasi hingga mengklasifikasikan penyakit dari gambar X-Ray. Pada tutorial, ini kita akan mempelajari dasar-dasar ML untuk keperluan regresi menggunakan R. Gambar bawah di memberikan illustrasi singkat bagaimana regresi digunakan untuk mendekati suatu fungsi asli dimana kita memiliki data dalam bentuk pasangan antara variabel masukan dan juga observasi. Bersama dengan klasisfikasi, regresi merupakan bagian dari supervised learning, yaitu pembelajaran mesin dengan adanya label.
Contoh prediksi menggunakan Random Forest
Apa itu regresi? Seperti yang telah kita pelajari pada tutorial sebelumnya mengenai regresi linear, tugas kita adalah memprediksi suatu label \(y\) dari vektor data yang dimiliki \(\boldsymbol{x}=\{x_{1},x_{2},\ldots,x_{m}\}\), dimana \(m\) adalah jumlah variabel input (atau fitur). Komponen penyusun \(\boldsymbol{x}\) dapat berupa variabel kontinyu, diskrit, ataupun kategori. Mengambil contoh dari analisis struktur, \(\boldsymbol{x}\) dapat berisikan variabel Modulus Young, Poisson ratio, area dari beam, ataupun geometri struktur, yang perubahan dari variabel-variabel tersebut akan mempengaruhi suatu variabel luaran, misal, tegangan. Dalam hal ini, tegangan adalah variabel luaran yang ingin kita prediksi (\(y\)). Hubungan antara variabel-variabel masukan dan luaran dapat kita tuliskan sebagai berikut: \(y=f(\boldsymbol{x})\), dimana \(f(.)\) adalah fungsi yang menghubungkan \(\boldsymbol{x}\) dan \(y\). Perhatikan bahwa bentuk \(f(\boldsymbol{x})\) yang sebenarnya tidak kita ketahui. Dalam hal ini, yang kita miliki adalah data pada titik-titik \(\boldsymbol{x}\) tertentu dengan angka \(y\) tertentu sejumlah \(n\) buah. Lebih formalnya kita akan menyebut kumpulan data ini \(\mathcal{X}\), dimana \(\mathcal{X}=\{\boldsymbol{x}^{(1)},\boldsymbol{x}^{(2)},\ldots,\boldsymbol{x}^{(n)}\}\), dan \(\boldsymbol{y}=\{y^{(1)},y^{(2)},\ldots,y^{(n)}\}\) adalah angka luaran untuk setiap titik yang berada di dalam \(\mathcal{X}\). Data set \(\mathcal{X}\) dan \(\boldsymbol{y}\) ini bisa didapatkan dari eksperimen di lapangan, eksperimen menggunakan komputer, ataupun dari sumber-sumber lain.
Supervised ML pada dasarnya adalah memprediksi bentuk \(f(\boldsymbol{x})\) dengan suatu fungsi pengganti yang kita beri nama \(\hat{f}(\boldsymbol{x})\). Fungsi pengganti ini harus dapat seakurat dan sedekat mungkin dengan fungsi asli, dengan kata lain, \(f(\boldsymbol{x}) \approx \hat{f}(\boldsymbol{x})\). Secara umum, tahap-tahap pembuatan suatu model ML regresi adalah sebagai berikut:
Tutorial singkat ini tidak akan membahas detil-detil penting ML. Tutorial ini lebih menekankan pada praktek langsung penggunaan metode ML. Saya sendiri sangat menyarankan anda untuk mempelajari ML lebih detail dan bukan sebagai pengguna saja.
Pada tutorial ini kita akan menggunakan package khusus ML bernama
caret (Classification and REgression Training),
yang merupakan perangkat ML dalam bahasa R yang paling banyak digunakan.
Kita akan mencoba menggunakan satu model regresi dalam tutorial ini,
yakni dan random forest. Langkah pertama yang harus dilakukan
adalah mengunduh dan memasang caret ke komputer lokal
anda:
install.packages('caret')
## Warning: package 'caret' is in use and will not be installed
Setelah itu, anda dapat menggunakan caret dengan
mengetikkan library(caret) pada Console R anda.
library(caret)
Tahap pertama yang harus dilakukan adalah mempersiapkan data set. Umumnya data set ini tidak langsung datang dalam format yang ‘bersih’, sehingga harus melalui proses data cleansing terlebih dahulu. Tujuan utama dari data cleansing adalah agar data set yang ada siap dimasukkan ke model ML. Kita tidak akan membahas data cleansing pada tutorial ini karena kita akan langsung menggunakan data set yang sudah melalui proses tersebut.
Kita akan menggunakan data marketing yang akan kita
unduh dari package datarium. Package datarium
tidak secara otomatis disediakan oleh R, sehingga anda harus
mengunduhnya terlebih dahulu dengan mengetikkan
install.packages('datarium') pada console R. Setelah itu,
eksekusi kode berikut untuk menggunakan data marketing.
data("marketing",package="datarium")
head(marketing) # Data disimpan dalam variabel bernama marketing
## youtube facebook newspaper sales
## 1 276.12 45.36 83.04 26.52
## 2 53.40 47.16 54.12 12.48
## 3 20.64 55.08 83.16 11.16
## 4 181.80 49.56 70.20 22.20
## 5 216.96 12.96 70.08 15.48
## 6 10.44 58.68 90.00 8.64
Data marketing berisi tiga variabel masukan, yaitu
youtube, facebook, newspaper,
dimana variabel-variabel ini adalah budget pengiklanan (satuan ribuan
Dolar US). Variabel luaran untuk data marketing adalah
total penjualan (sales). Tugas dari model ML regresi
nantinya adalah membuat model yang dapat memprediksi sales
berdasarkan tiga variabel masukan.
Secara matematik, Sales merupakan fungsi dari tiga
variabel seperti dapat ditulis sebagai berikut \[\text{Sales=}f(\text{Youtube},\text{Facebook},\text{Newspaper})
+ \varepsilon\] Dimana \(\varepsilon\) adalah variabel acak yang
bersifat sebagai noise pada pemodelan. Tujuan kita pada
akhirnya adalah membuat model ML: \[\text{Sales=}\hat{f}(\text{Youtube},\text{Facebook},\text{Newspaper})\]
Sebelum kita membuat model regresi, ada baiknya kita melakukan
eksplorasi terhadap data yang anda terlebih dahulu. Sebagai contoh, kita
dapat membuat boxplot dari tiga variabel masukan untuk mengetahui
bagaimana persebaran budgeting pada tiga media yang ada. Kita akan
menggunakan fungsi boxplot sebagai berikut:
boxplot(list(marketing$youtube,marketing$facebook,marketing$newspaper),
names=c('Youtube','Facebook','Newspaper'),
ylab='Sales')
Boxplot variabel masukan
Fungsi summary() dapat digunakan untuk melihat statistik
dari data:
summary(marketing)
## youtube facebook newspaper sales
## Min. : 0.84 Min. : 0.00 Min. : 0.36 Min. : 1.92
## 1st Qu.: 89.25 1st Qu.:11.97 1st Qu.: 15.30 1st Qu.:12.45
## Median :179.70 Median :27.48 Median : 30.90 Median :15.48
## Mean :176.45 Mean :27.92 Mean : 36.66 Mean :16.83
## 3rd Qu.:262.59 3rd Qu.:43.83 3rd Qu.: 54.12 3rd Qu.:20.88
## Max. :355.68 Max. :59.52 Max. :136.80 Max. :32.40
Andapun juga dapat menghitung korelasi antara semua variabel dengan
menggunakan fungsi cor():
cor(marketing)
## youtube facebook newspaper sales
## youtube 1.00000000 0.05480866 0.05664787 0.7822244
## facebook 0.05480866 1.00000000 0.35410375 0.5762226
## newspaper 0.05664787 0.35410375 1.00000000 0.2282990
## sales 0.78222442 0.57622257 0.22829903 1.0000000
Pada intinya, data anda membutuhkan data set \(\mathcal{X}\) dan \(\boldsymbol{y}\). Umumnya, data set ini dibagi menjadi minimal dua pembagian, yaitu training set dan test set. Training set adalah data yang digunakan untuk membuat/melatih model ML, dimana model ini akan diuji kualitasnya dengan menggunakan test set. Satu analogi yang umum digunakan adalah sebagai berikut: training set adalah contoh-contoh soal yang diberikan Dosen saat latihan di kelas, dan test set adalah soal ujian yang belum anda lihat di kelas. Pembagian Training set dan test set ini bisa menggunakan rasio 80%:20%, atau 60%:40% (disesuaikan dengan kebutuhan anda).
Fungsi yang akan kita gunakan adalah
createDataPartition() yang kita ambil dari library
caret. Argumen tambahan yang dapat kita masukkan pada
createDataPartition() adalah p, yaitu proporsi
dari data yang akan menjadi training set.
idx <- createDataPartition(marketing$sales, p=0.80, list=FALSE)
# 20% dari data untuk test
marketing_tes <- marketing[-idx,]
# 80% dari data untuk melatih model
marketing_train <- marketing[idx,]
Setelah partisi data, langkah selanjutnya adalah menyiapkan model ML
yang akan dibuat. Model ML umumnya memiliki parameter-parameter tertentu
yang harus ditentukan, dimana pemilihan parameter ini akan mempengaruhi
kualitas prediksi dari model. RF yang akan kita gunakan pada tutorial
ini adalah varian yang paling sederhana untuk memberikan gambaran
bagaimana model RF. Seperti telah dijelaskan sebelumnya, kita akan
menggunakan package caret dengan metode rf.
Mari kita membuat model yang akan kita beri nama
mdl_rf_r:
mdl_rf_r <- train(sales~.,data=marketing_train,method="rf")
## note: only 2 unique complexity parameters in default grid. Truncating the grid to 2 .
Anda dapat melihat performa dari model yang telah dibuat dengan
mengetikkan kembali mdl_rf_r pada console R anda.
Metrik-metrik akurasi yang dikeluarkan mencakup Root-mean-squared-error
(RMSE), \(R^{2}\) (Rsquared), dan Mean
Absolute Error (MAE). Metrik-metrik akurasi pada fungsi
train dihitung menggunakan teknik bootstrapping, walaupun
teknik lain seperti cross-validation dapat juga digunakan. Untuk
interpretasi yang mudah dapat cepat anda dapat melihat angka \(R^{2}\), dimana \(R^{2}\) yang mendekati satu menandakan
akurasi yang baik.
Perlu dicatat bahwa model RF yang anda buat akan berbeda-beda setiap kali anda melatih model RF. Hal ini terjadi karena terdapat unsur acak dalam proses pembuatan model RF. Oleh karena itu, anda tidak perlu terkejut jika model RF yang dibuat oleh anda berbeda dengan rekan anda. Ini berbeda dengan model seperti regresi linear dimana hasil yang didapat akan sama setiap kali model dilatih.
Tahap selanjutnya adalah menggunakan mdl_rf_r untuk
melakukan prediksi. Akan tetapi sebelum itu baiknya kita mencoba melihat
kualitas prediksi mdl_rf pada data tes
marketing_tes. Kita akan menggunakan fungsi
predict() dimana argumen model yang digunakan dan data
dimana prediksi dilakukan harus dimasukkan:
y_pred <- predict(mdl_rf_r, newdata = marketing_tes)
Mari kita menghitung akurasi pada marketing_tes dengan
menghitung coefficient of determination dan juga RMSE secara manual:
Rsq <- cor(y_pred,marketing_tes$sales)
rmse <- sqrt(mean((y_pred-marketing_tes$sales)^2))
Angka Rsq cukup mudah dibayangkan akan tetapi angka
rmse harus dilihat relatif terhadap angka
sales secara umum. Satu cara yang umum digunakan adalah
melakukan normalisasi RMSE dengan jarak interkuartil (IQR):
nrmse <- rmse/IQR(marketing$sales)
Hal lain yang bisa anda lakukan adalah membuat plot antara
y_pred versus marketing_tes$sales. Hubungan
yang baik ditandakan dengan kedua variabel tersebut hampir membentuk
garis lurus:
plot(y_pred,marketing_tes$sales,xlab='Prediksi',ylab='Aktual')
Plot prediksi vs aktual
Sebutlah jika anda ingin melakukan prediksi pada angka-angka variabel
masukan yang belum pernah anda coba sebelumnya. Misalkan, anda ingin
mengetahui harga penjualan sales pada \(\boldsymbol{x}=\{\text{Youtube}=180,\text{Facebook}=40\,\text{Newspaper}=50\}\),
maka anda harus membuat vektor tersebut menjadi dalam format data frame
terlebih dahulu:
x_new <- data.frame(youtube=180,facebook=40,newspaper=50)
y_new <- predict(mdl_rf_r, newdata = x_new)
print(y_new)
Tutorial ini memberikan gambaran singkat mengenai bagaimana model ML dapat digunakan untuk melakukan regresi. Model regresi ML, di luar regresi linear, akan sangat berguna ketika fungsi yang coba didekati bersifat nonlinear. RF merupakan salah satu metode yang paling umum digunakan, oleh karena itulah tutorial ini memakai RF untuk tujuan perkenalan. Selain RF, metode lain yang juga berbasis tree adalah Gradient Boosting yang bekerja dengan prinsip berbeda. Anda dapat mencoba menggunakan data set sendiri untuk lebih memahami bagaimana sebenarnya model ML regresi bekerja.
Beberapa hal penting yang tidak dibahas mendetail di tutorial ini mencakup:
train() sudah melakukan proses hyperparameter
optimization di dalamnya. - Masih banyak model ML regresi yang
lain, seperti support vector regression, deep neural
network, Gaussian process regression, dan lain-lain.
Metode-metode yang berbeda ini memiliki pendekatan yang berbeda dengan
RF. Akan tetapi, pada prinsipnya semua metode ini dapat digunakan dengan
langkah-langkah yang sama dengan bagaimana RF digunakan. Saya sangat
menyarankan anda mempelajari metode-metode ini baik secara teori dan
juga praktek langsung.tidyverse.Sekian dan semoga bermanfaat.