Dalam tulisan ini saya akan mencoba melakukan model prediksi kedatangan wisatawan mancanegara menggunakan SVR (Support Vector Regression). Data yang digunakan adalah data time series yang diambil dari kemenparekraf yaitu data kedatangan wisatawan mancanegara dalam setiap bulannya mulai dari bulan januari 2014 - september 2021.
STEP 1 : REGRESI LINIER SEDERHANA DALAM R
di sini saya sudah menyimpan set datanya dalam sebuah file bernama kedatangan.csv. dibawah ini jika kita mau tampilkan datanya
#load data dari file .csv
data = read.csv("kedatangan.csv", header=TRUE, encoding="UTF-8", sep="")
#menampilkan list data sejumlah n
head(data, n =100)
## X.Y
## 1 1,753079
## 2 2,702666
## 3 3,765607
## 4 4,726332
## 5 5,752363
## 6 6,851475
## 7 7,777210
## 8 8,826821
## 9 9,791296
## 10 10,808767
## 11 11,764461
## 12 12,915334
## 13 13,785973
## 14 14,843928
## 15 15,841071
## 16 16,801873
## 17 17,852388
## 18 18,872385
## 19 19,877584
## 20 20,911704
## 21 21,920128
## 22 22,877798
## 23 23,835408
## 24 24,986519
## 25 25,814303
## 26 26,888309
## 27 27,915019
## 28 28,901095
## 29 29,915206
## 30 30,872385
## 31 31,1032741
## 32 32,1031986
## 33 33,1006653
## 34 34,1040651
## 35 35,1002333
## 36 36,1113328
## 37 37,1107968
## 38 38,1023388
## 39 39,1059777
## 40 40,1171386
## 41 41,1148588
## 42 42,1144001
## 43 43,1370591
## 44 44,1393243
## 45 45,1250231
## 46 46,1161565
## 47 47,1062030
## 48 48,1147031
## 49 49,1097839
## 50 50,1197503
## 51 51,1363426
## 52 52,1302321
## 53 53,1242705
## 54 54,1322674
## 55 55,1547231
## 56 56,1511021
## 57 57,1370943
## 58 58,1291605
## 59 59,1157483
## 60 60,1405554
## 61 61,1201735
## 62 62,1243996
## 63 63,1311911
## 64 64,1274231
## 65 65,1249536
## 66 66,1434103
## 67 67,1468173
## 68 68,1530268
## 69 69,1388719
## 70 70,1346434
## 71 71,1280781
## 72 72,1377867
## 73 73,1272083
## 74 74,863960
## 75 75,470970
## 76 76,158718
## 77 77,163646
## 78 78,158256
## 79 79,157939
## 80 80,163185
## 81 81,151275
## 82 82,153918
## 83 83,144467
## 84 84,164088
## 85 85,137230
## 86 86,115765
## 87 87,130933
## 88 88,125001
## 89 89,152604
## 90 90,137247
## 91 91,135438
## 92 92,124751
## 93 93,126513
kemudian kita gunakan regresi linier sederhana untuk perbandingan awal :
#load data
data <- read.csv(paste("kedatangan.csv", sep=""), header = TRUE)
head(data)
## X Y
## 1 1 753079
## 2 2 702666
## 3 3 765607
## 4 4 726332
## 5 5 752363
## 6 6 851475
#mem-plot data
plot(data,pch=16)
#membuat model regresi linear
model <- lm(Y~X, data)
#menambahkan garis fit
abline(model)
STEP 2 :
langkah selanjutnya yaitu menampilkan prediksi yang mampu dilakukan oleh regresi linier
#load data
data <- read.csv(paste("kedatangan.csv", sep=""), header = TRUE)
head(data)
## X Y
## 1 1 753079
## 2 2 702666
## 3 3 765607
## 4 4 726332
## 5 5 752363
## 6 6 851475
#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("kedatangan.csv", sep=""), header = TRUE)
head(data)
## X Y
## 1 1 753079
## 2 2 702666
## 3 3 765607
## 4 4 726332
## 5 5 752363
## 6 6 851475
#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)
#prediksiY <- prediksiY[-94]
length(data$X); length(prediksiY)
## [1] 93
## [1] 93
#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.1 512
##
## - best performance: 22046917047
# 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.17 512
##
## - best performance: 19814065752
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('kedatangan.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.2 512
##
## - best performance: 21067479319
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## epsilon cost
## 0.19 512
##
## - best performance: 24681426374
# akhir model svr =======================================
Sekian. Tunggu tulisan selanjutnya yang lebih menarik pastinya
referensi : https://www.svm-tutorial.com/2014/10/support-vector-regression-r/