Perkenalan

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

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:

  1. Mempersiapkan data set \(\mathcal{X}\) dan \(\boldsymbol{y}\).
  2. Membagi \(\mathcal{X}\) dan \(\boldsymbol{y}\) menjadi data training (\(\mathcal{X}_{\text{train}}\) dan \(\boldsymbol{y}_{\text{train}}\)) dan data tes (\(\mathcal{X}_{\text{tes}}\) dan \(\boldsymbol{y}_{\text{tes}}\)).
  3. Menentukan model regresi yang akan anda gunakan (misal: Random forest) dan juga parameter-parameter model tersebut.
  4. Membuat model regresi \(\hat{f}(\boldsymbol{x})\) dengan menggunakan data training \(\mathcal{X}_{\text{train}}\) dan \(\boldsymbol{y}_{\text{train}}\)).
  5. Menganalisis akurasi dari \(\hat{f}(\boldsymbol{x})\) dengan menggunakan teknik seperti cross-validation atau bootstrap, dan juga dengan melihat prediksi pada data tes (\(\mathcal{X}_{\text{tes}}\) dan \(\boldsymbol{y}_{\text{tes}}\)).

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)

Persiapan Data Set

Data set

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})\]

Analisis awal data

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

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

Mempersiapkan data set

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,]

Membuat model regresi dengan Random Forest

Pembuatan model

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.

Prediksi dengan random forest

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

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)

Penutup

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:

Sekian dan semoga bermanfaat.