Support Vector Regression (SVR) adalah metode regresi berbasis Support Vector Machine (SVM). SVR mencoba meminimalkan error sambil menjaga margin error yang disebut epsilon-tube. Tujuan SVR adalah mencari fungsi prediksi \(f(x)\) yang tidak menyimpang lebih dari \(\epsilon\) dari nilai target \(y_i\) untuk semua data. Rumus utama dari SVR:
\[ \min_{w,b,\xi,\xi^*} \frac{1}{2} \|w\|^2 + C \sum_{i=1}^n (\xi_i + \xi^*_i) \] dengan kendala:
\[ \begin{cases} y_i - (w \cdot x_i + b) \leq \epsilon + \xi_i \\ (w \cdot x_i + b) - y_i \leq \epsilon + \xi^*_i \\ \xi_i, \xi^*_i \geq 0 \end{cases} \] Di mana \(w\) adalah bobot, \(b\) adalah bias, \(\xi_i, \xi^*_i\) adalah slack variables untuk error yang melebihi \(\epsilon\), dan \(C\) adalah parameter penalti. Model SVR memiliki dua varian utama:
\[ \min_{w,b} \sum_{i=1}^n (y_i - (w \cdot x_i + b))^2 \] yaitu residual sum of squares. OLS mudah diinterpretasikan, tapi tidak tahan terhadap outlier. SVR dan OLS akan dibandingkan dalam laporan ini menggunakan metrik: RMSE (Root Mean Square Error): \[ RMSE = \sqrt{\frac{1}{n} \sum_{i=1}^n (y_i - \hat{y}_i)^2} \] MAE (Mean Absolute Error): \[ MAE = \frac{1}{n} \sum_{i=1}^n |y_i - \hat{y}_i| \] R² (Coefficient of Determination): \[ R^2 = 1 - \frac{\sum (y_i - \hat{y}_i)^2}{\sum (y_i - \bar{y})^2} \]
Kita gunakan dataset mtcars dan memilih mpg
(miles per gallon) sebagai target variabel dan hp (horsepower)
sebagai prediktor (untuk memudahkan visualisasi 1D).
data("mtcars")
df <- mtcars %>% select(mpg, hp)
# Normalisasi fitur (diperlukan untuk SVR)
preProc <- preProcess(df, method = c("center", "scale"))
df_scaled <- predict(preProc, df)
head(df_scaled)
## mpg hp
## Mazda RX4 0.1508848 -0.5350928
## Mazda RX4 Wag 0.1508848 -0.5350928
## Datsun 710 0.4495434 -0.7830405
## Hornet 4 Drive 0.2172534 -0.5350928
## Hornet Sportabout -0.2307345 0.4129422
## Valiant -0.3302874 -0.6080186
ols_model <- lm(mpg ~ hp, data = df_scaled)
summary(ols_model)
##
## Call:
## lm(formula = mpg ~ hp, data = df_scaled)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.9477 -0.3505 -0.1469 0.2625 1.3665
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -3.149e-17 1.133e-01 0.000 1
## hp -7.762e-01 1.151e-01 -6.742 1.79e-07 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6409 on 30 degrees of freedom
## Multiple R-squared: 0.6024, Adjusted R-squared: 0.5892
## F-statistic: 45.46 on 1 and 30 DF, p-value: 1.788e-07
svr_linear <- svm(mpg ~ hp, data = df_scaled, type = "eps-regression",
kernel = "linear", cost = 1, epsilon = 0.1)
svr_rbf <- svm(mpg ~ hp, data = df_scaled, type = "eps-regression",
kernel = "radial", cost = 1, epsilon = 0.1, gamma = 0.1)
Gunakan metrik: RMSE, MAE, dan R².
# Prediksi
df_scaled$ols_pred <- predict(ols_model, df_scaled)
df_scaled$svr_linear_pred <- predict(svr_linear, df_scaled)
df_scaled$svr_rbf_pred <- predict(svr_rbf, df_scaled)
# Fungsi evaluasi
eval_metrics <- function(actual, predicted){
rmse <- rmse(actual, predicted)
mae <- mae(actual, predicted)
r2 <- cor(actual, predicted)^2
return(data.frame(RMSE=rmse, MAE=mae, R2=r2))
}
ols_metrics <- eval_metrics(df_scaled$mpg, df_scaled$ols_pred)
svr_linear_metrics <- eval_metrics(df_scaled$mpg, df_scaled$svr_linear_pred)
svr_rbf_metrics <- eval_metrics(df_scaled$mpg, df_scaled$svr_rbf_pred)
# Gabungkan hasil
results <- rbind(OLS=ols_metrics, SVR_Linear=svr_linear_metrics, SVR_RBF=svr_rbf_metrics)
knitr::kable(results)
| RMSE | MAE | R2 | |
|---|---|---|---|
| OLS | 0.6205955 | 0.4824087 | 0.6024373 |
| SVR_Linear | 0.6387548 | 0.4534672 | 0.6024373 |
| SVR_RBF | 0.5711685 | 0.3924555 | 0.7267450 |
Tabel tersebut memuat ringkasan metrik evaluasi model (RMSE, MAE, dan R²) dari tiga metode regresi yaitu OLS, SVR Linear, dan SVR RBF. Berdasarkan data yang ditampilkan:
Secara keseluruhan, evaluasi kuantitatif ini mendukung temuan
visualisasi sebelumnya yang menunjukkan superioritas model SVR RBF dalam
memodelkan hubungan antara variabel pada dataset
mtcars.
ggplot(df_scaled, aes(x=hp, y=mpg)) +
geom_point(color='blue') +
geom_line(aes(y=ols_pred), color='green', size=1, linetype="dashed", alpha=0.7) +
geom_line(aes(y=svr_linear_pred), color='red', size=1, alpha=0.7) +
geom_line(aes(y=svr_rbf_pred), color='purple', size=1, alpha=0.7) +
labs(title="Perbandingan Model: OLS, SVR Linear, SVR RBF",
x="Horsepower (scaled)", y="MPG (scaled)") +
theme_minimal()
Gambar ini memperlihatkan perbandingan garis prediksi dari tiga model (OLS, SVR Linear, dan SVR RBF) terhadap data sebenarnya (titik biru). Berikut interpretasinya:
Secara keseluruhan, SVR RBF lebih baik dalam menangkap variasi pola data yang non-linear, sedangkan OLS cenderung oversimplifikasi dan SVR Linear berada di antara keduanya.
# Visualisasi hanya untuk SVR Linear (1D)
sv_index <- svr_linear$index
ggplot(df_scaled, aes(x=hp, y=mpg)) +
geom_point(color='blue') +
geom_line(aes(y=predict(svr_linear, df_scaled)), color='red', size=1) +
geom_point(data=df_scaled[sv_index,], aes(x=hp, y=mpg), color='black', size=2, shape=8) +
labs(title="Epsilon-tube dan Support Vectors (SVR Linear)",
x="Horsepower (scaled)", y="MPG (scaled)") +
theme_minimal()
Gambar ini menunjukkan garis prediksi model SVR Linear (garis merah) serta data aktual (titik biru) dan support vectors (bintang biru). Secara akademik:
mtcars.Secara keseluruhan, gambar ini memperlihatkan peran kunci support vectors dan epsilon-tube dalam membentuk model SVR Linear yang stabil dan adaptif.
df_scaled <- df_scaled %>%
mutate(ols_resid = mpg - ols_pred,
svr_linear_resid = mpg - svr_linear_pred,
svr_rbf_resid = mpg - svr_rbf_pred)
df_long <- df_scaled %>%
pivot_longer(cols = c(ols_resid, svr_linear_resid, svr_rbf_resid),
names_to = "model", values_to = "residual")
ggplot(df_long, aes(x=model, y=residual, fill=model)) +
geom_boxplot(alpha=0.7) +
labs(title="Distribusi Residual",
y="Residual", x="Model") +
theme_minimal()
Gambar boxplot residual ini menunjukkan distribusi residual dari tiga model: OLS, SVR Linear, dan SVR RBF. Berikut interpretasinya:
Kesimpulan: Model SVR Linear dan SVR RBF menghasilkan distribusi residual yang lebih sempit, menunjukkan kecenderungan untuk memberikan prediksi yang lebih stabil dan robust dibandingkan OLS.
# Contoh: variasi epsilon
epsilon_values <- seq(0, 1, by=0.2)
epsilon_results <- data.frame()
for(eps in epsilon_values){
svr <- svm(mpg ~ hp, data=df_scaled, type='eps-regression',
kernel='radial', cost=1, gamma=0.1, epsilon=eps)
pred <- predict(svr, df_scaled)
metrics <- eval_metrics(df_scaled$mpg, pred)
metrics$epsilon <- eps
epsilon_results <- rbind(epsilon_results, metrics)
}
ggplot(epsilon_results, aes(x=epsilon, y=RMSE)) +
geom_line() + geom_point() +
labs(title="Pengaruh Nilai Epsilon pada RMSE (SVR RBF)",
x="Epsilon", y="RMSE") +
theme_minimal()
Gambar tersebut menunjukkan bahwa RMSE menurun ketika nilai epsilon meningkat hingga sekitar 0.5, lalu naik lagi. Ini mengindikasikan adanya nilai optimal epsilon untuk meminimalkan RMSE. Hasil ini menjadi petunjuk bahwa tuning parameter epsilon (dan juga parameter lain seperti C dan gamma) penting untuk mendapatkan model yang optimal. Untuk menemukan kombinasi parameter optimal tersebut, dilakukan tuning (lihat Bagian 7) yang menggunakan grid search untuk mencari nilai C dan gamma terbaik, sehingga model SVR RBF menjadi lebih akurat dan generalizable.
# Tuning C dan gamma menggunakan grid search
tune_result <- tune(svm, mpg ~ hp, data=df_scaled,
ranges=list(cost=c(0.1, 1, 10), gamma=c(0.01, 0.1, 1)),
kernel='radial', epsilon=0.1)
# Menampilkan parameter terbaik
tune_result$best.parameters
## cost gamma
## 6 10 0.1
# Menampilkan summary tuning
summary(tune_result)
##
## Parameter tuning of 'svm':
##
## - sampling method: 10-fold cross validation
##
## - best parameters:
## cost gamma
## 10 0.1
##
## - best performance: 0.2962928
##
## - Detailed performance results:
## cost gamma error dispersion
## 1 0.1 0.01 1.0001763 0.8473421
## 2 1.0 0.01 0.6326294 0.6087353
## 3 10.0 0.01 0.4332514 0.3578524
## 4 0.1 0.10 0.6762422 0.6610176
## 5 1.0 0.10 0.3782765 0.3771587
## 6 10.0 0.10 0.2962928 0.2814435
## 7 0.1 1.00 0.5762918 0.5783126
## 8 1.0 1.00 0.3490891 0.3271549
## 9 10.0 1.00 0.3693195 0.3183527
Penjelasan:
tune() dari e1071 digunakan untuk
grid search parameter C dan gamma.tune_result$best.parameters.Hasil evaluasi dan visualisasi menunjukkan bahwa model SVR RBF memiliki performa prediksi terbaik. Hal ini tercermin dari nilai RMSE dan MAE terendah, serta nilai R² tertinggi dibandingkan model lainnya. Model SVR RBF mampu menangkap pola non-linear, sehingga sangat tepat untuk diterapkan pada data dengan karakteristik serupa.
Dalam aplikasi praktis, pemilihan model yang tepat menjadi kunci. Model linier (OLS dan SVR Linear) lebih cocok untuk hubungan linier, sedangkan SVR RBF sangat disarankan ketika terdapat pola non-linear. Temuan ini menunjukkan pentingnya pemahaman karakteristik data sebelum memutuskan model regresi yang akan digunakan. Dengan demikian, hasil prediksi yang akurat dan andal dapat diperoleh, mendukung pengambilan keputusan berbasis data secara efektif.