Dalam tulisan ini saya akan menunjukkan bagaimana menggunakan R untuk mengerjakan data pada sebuah Support Vector Regression (SVR). Tapi sebelumnya kita perlu melakukan sebuah regresi linier sederhana , baru kemudian kita berpindah pada SVR sehingga kamu dapat melihat bagaimana perbedaannya meski dengan data yang sama.
Untuk memulainya kita akan menggunakan sebuah data set sederhana berikut ini:
Saya hanya mengambil beberapa data saja di excel/csv. Saya lebih memilih data yang sedikit ini karena tujuan dari penulisan artikel buakan tentang datanya, tapi lebih ke bagaimana model-model yang kita gunakan.
Seperti yang kamu lihat ada beberapa jenis hubungan antara dua variabel X dan Y, dan ini terlihat seperti kita dapat menggambarkan sebuah garis dimana akan melewati masing-masing titik.
mari kita cobaaa!
STEP 1 : REGRESI LINIER SEDERHANA DALAM R
di sini sama dengan format CSV, saya sudah menyimpan set datanya dalam sebuah file bernama regression.csv. dibawah ini jika kita mau tampilkan datanya
#load data dari file .csv
data = read.csv("regression.csv", header=TRUE, encoding="UTF-8", sep="")
#menampilkan list data sejumlah n
head(data, n =20)
## X.Y
## 1 1,3
## 2 2,4
## 3 3,8
## 4 4,4
## 5 5,6
## 6 6,9
## 7 7,8
## 8 8,12
## 9 9,15
## 10 10,26
## 11 11,35
## 12 12,40
## 13 13,45
## 14 14,54
## 15 15,49
## 16 16,59
## 17 17,60
## 18 18,62
## 19 19,63
## 20 20,68
kemudian kita dapat menggunakan R untuk menampilkan data dan menempatkan sebuah garis (regresi linier):
#load data
data <- read.csv(paste("regression.csv", sep=""), header = TRUE)
head(data)
## X Y
## 1 1 3
## 2 2 4
## 3 3 8
## 4 4 4
## 5 5 6
## 6 6 9
#mem-plot data
plot(data,pch=16)
#membuat model regresi linear
model <- lm(Y~X, data)
#menambahkan garis fit
abline(model)
STEP 2 : SEBERAPA BAGUS REGRESI KITA?
Dalam rangka untuk perbandingan antara regresi linier dengan SVR kita perlu sebuah pengukuran seberapa bagusnya regresi tersebut.
Untuk melakukannya kita akan merubah sedikit kode kita untuk menampilkan masing-masing prediksi yang dibuat oleh model kita
#load data
data <- read.csv(paste("regression.csv", sep=""), header = TRUE)
head(data)
## X Y
## 1 1 3
## 2 2 4
## 3 3 8
## 4 4 4
## 5 5 6
## 6 6 9
#mem-plot data
plot(data,pch=16)
#membuat model regresi linear
model <- lm(Y~X, data)
#membuat sebuah prediksi untuk masing-masing X
prediksiY <- predict(model,data)
#menampilkan prediksi
points(data$X, prediksiY, col = "blue",pch=4)
Untuk masing-masing data titik X, model membuat sebuah prediksi Y yang ditunjukkan sebagai titik biru pada graph. Perbedaannya dengan graph yang sebelumnya adalah titik-titiknya terhubung satu sama lain.
Untuk mengukur seberapa bagus model yang kita buat kita akan menghitung seberapa banyak error yang terjadi.
Cara mudahnya adalah kita dapat membandingkan nilai Y dengan nilai prediksi Y dan lihat seberapa jauh jarak keduanya.
Catatan bahwa Y asli dikurangi dengan Y prediksi adalah error, jika kita membuat sebuah prediksi Y yang sempurna maka Y asli akan sama dengan Y prediksi dan errornya adalah 0.
Jika kita melakukan perhitungan error ini untuk masing-masing titik dan menjumlahkan errornya kita akan mendapatkan error total, dan jika kita ambil rata-rata dari nilai tersebut kita akan mendapatkan nilai Mean Squared Error (MSE).
Sebuah cara yang umum untuk mengukur error di dalam machine learning adalah dengan menggunakan Root Mean Squared Error (RMSE) sehingga kita akan gunakan ini saja.
untuk menghitung RMSE kita tarik akar dari MSE. as simple as that. Dengan menggunakan R kita dapat menghitung RMSE tersebut.
rmse <- function(error)
{
sqrt(mean(error^2))
}
error <- model$residuals # sama dengan data$Y - prediksiY
prediksiRMSE <- rmse(error) # 5.703778
Kita ketahui sekaran bahwa RMSE dari model regresi linear kita adalah 5,70. Mari kita coba improve ini dengan SVR!
STEP 3: SUPORT VECTOR REGRESSION
Dalam rangka untuk membuat sebuah model SVR menggunakan R, kita perlu package atau lebih gampang disebutnya library yaitu e1071. Pastikan untuk menginstallnya dan tambahkan baris kode library(e1071) di awal file kamu.
Berikut ini kita buat prediksi menggunakan SVR :
#load data
data <- read.csv(paste("regression.csv", sep=""), header = TRUE)
head(data)
## X Y
## 1 1 3
## 2 2 4
## 3 3 8
## 4 4 4
## 5 5 6
## 6 6 9
#mem-plot data
plot(data,pch=16)
#menjalankan library svm
library(e1071)
#membuat model svm
model <- svm(Y~X, data)
#membuat sebuah prediksi untuk masing-masing X
prediksiY <- predict(model,data)
#menampilkan prediksi
points(data$X, prediksiY, col = "red",pch=4)
Seperti yang dapat kita lihat, ini mirip sekali dengan baris kode yang kita gunakan di regresi linier. Hanya berbeda pada pemanggilan fungsi di svm. Catatannya bahwa kita memanggil fungsi svm (bukan svr) ini karena fungsi ini dapat juga digunakan untuk membuat sebuah klasifikasi menggunakan Support Vector Machine atau SVM. Fungsi tersebut akan secara otomatis memilih SVM jika fungsi mendeteksi bahwa datanya adalah kategorik (jika variabelnya adalah sebuah faktor di R)
Nah, sekarang prediksinya lebih mendekati dengan nilai asli. Mari kita hitung RMSE dari model SVR kita !
# /!\ saat ini svrModel$residuals tidak sama dengan data$Y - prediksiY
# sehingga kita hitung seperti ini
error <- data$Y - prediksiY
svrPredictionRMSE <- rmse(error) # 3.157061
Seperti ekspektasi bahwa RMSE nya lebih baik yaitu 3.15 dibandingkan dengan yang sebelumnya yaitu 5.70.
Tapi bisakah kita buat lebih mantab lagi?
STEP 4 : TUNING ATAU PENYETELAN TAMBAHAN MODEL SVM
Dalam rangka untuk meng-improve perforam dari SVR kita perlu memilih parameter terbaik untuk modelnya. Pada contoh sebelumnya, kita tampilkan sebuah regresi epsilon, kita tidak mengatur setiap nilai untuk epsilon, melainkan mengambil dari nilai default 0.1. Ada juga sebuah cost parameter dimana kita dapat merubahnya untuk menghindari overfitting.
Proses pemilihan parameter-parameter tersebut dinamakan hyperparameter optimization, atau model selection. Cara setandar untuk melakukannya adalah dengan melakukan grid search. Ini berarti kita akan melatih atau mentraining banyak model untuk pasangan-pasangan yang berbeda dari epsilon dan cost, dan memilih satu yang terbaik.
Ada dua poin penting dari baris kode dibawah : pertama, epsilon = 0, 0.1, 0.2, …, 1 dan cost = 2 pangkat 2, 2 pangkat 3, 2 pangkat 4, …, 2 pangkat 9 yang berarti ini akan mentraining 88 model (ini dapat memakan banyak waktu). kedua, hasil tuning kembali ke MSE, jangan lupa untuk mengkonversinya menjadi RMSE sebelum membandingkan nilainya dengan model kita yang sebelumnya.
dan berikut ini performa dari svm
# menampilkan grid search
tuneResult <- tune(svm, Y ~ X, data = data,
ranges = list(epsilon = seq(0,1,0.1), cost = 2^(2:9))
)
print(tuneResult)
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## epsilon cost
## 0 128
##
## - best performance: 8.431078
# menggambarkan hasil tuning
plot(tuneResult)
pada graph di atas kita dapat melihat bahwa daerah yang lebih gelap adalah model kita yang lebih baik (karena RMSE nya lebih dekat ke 0 pada daerah lebih gelap). Ini berarti kita dapat mencoba grid search yang lain pada range lebih sempit. Kita akan coba dengan nilai epsilon antara 0 dan 0.2. Untuk sekilas ini tidak terlihat seperti cost value yang memiliki sebuah efek sehingga kita akan tetap melihatnya jika terjadi perubahan.
Kita mentraining 168 model yang berbeda dengan sedikit baris kode dibawah ini.
Seperti kita zoom-in ke dalam area gelap kita dapat liaht bahwa ada beberapa bagian lebih gelap. Dari graph tersebut kita dapat melihat bahwa model-model dengan cost antara 200 dan 300 dan epselon antara 0.08 dan 0.09 memiliki sedikit error.
tuneResult <- tune(svm, Y ~ X, data = data,
ranges = list(epsilon = seq(0,0.2,0.01), cost = 2^(2:9))
)
print(tuneResult)
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## epsilon cost
## 0 512
##
## - best performance: 8.806606
plot(tuneResult)
tunedModel <- tuneResult$best.model
tunedModelY <- predict(tunedModel, data)
error <- data$Y - tunedModelY
# nilai ini akan bisa berbeda dengan yang ada di komputermu
# karena metode tuningnya mengacak data secara random
tunedModelRMSE <- rmse(error) # 2.219642
Harapannya, kita tidak harus memilih model terbaik dengan mata kita dan R memberi kesempatan kita untuk mendapatkan model terbaik ini dengan mudah dan menggunakannya untuk membuat prediksi.
kita improve lagi RMSE dari model SVR kita!
Jika kita mau kita dapat membuat visualisasi dari kedua model kita. Model SVR pertama tergambar dalam garis merah, dan model SVR yang sudah dituning dengan garis merah seperti dibawah ini
library(e1071)
data <- read.csv(paste('regression.csv', sep=""), header = TRUE)
rmse <- function(error)
{
sqrt(mean(error^2))
}
plot(data)
# svr model ==============================================
if(require(e1071)){
model <- svm(Y ~ X , data)
predictedY <- predict(model, data)
points(data$X, predictedY, col = "red", pch=17)
error <- data$Y - predictedY
svrPredictionRMSE <- rmse(error)
tuneResult <- tune(svm, Y ~ X, data = data,
ranges = list(epsilon = seq(0,1,0.1), cost = 2^(2:9))
)
print(tuneResult)
plot(tuneResult)
tuneResult <- tune(svm, Y ~ X, data = data,
ranges = list(epsilon = seq(0,0.2,0.01), cost = 2^(2:9))
)
print(tuneResult)
plot(tuneResult)
plot(data, pch=16)
tunedModel <- tuneResult$best.model
tunedModelY <- predict(tunedModel, data)
points(data$X, predictedY, col = "red", pch=4)
lines(data$X, predictedY, col = "red", pch=4)
points(data$X, tunedModelY, col = "blue", pch=4)
lines(data$X, tunedModelY, col = "blue", pch=4)
error <- data$Y - tunedModelY
# nilai ini bisa jadi berbeda karena model terbaiknya dihasilkan oleh cross-validation melalui pengacakan data secara random
tunedModelRMSE <- rmse(error) # 2.219642
}
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## epsilon cost
## 0 256
##
## - best performance: 8.817917
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## epsilon cost
## 0 128
##
## - best performance: 8.599168
# akhir model svr =======================================
Semoga kalian suka dengan pengenalan Support Vector Regerssion menggunakan R ini.
*tulisan ini disadur dari Alexandre KOWALCZYK