How to use breakDown package for SVM models

Przemyslaw Biecek

2024-03-11

This example demonstrates how to use the breakDown package for models created with the kernlab package.

library("breakDown")
library(kernlab)
#> 
#> Attaching package: 'kernlab'
#> The following object is masked from 'package:ggplot2':
#> 
#>     alpha

wine_svm_model <- ksvm(quality~., data = wine)
wine_svm_model
#> Support Vector Machine object of class "ksvm" 
#> 
#> SV type: eps-svr  (regression) 
#>  parameter : epsilon = 0.1  cost C = 1 
#> 
#> Gaussian Radial Basis kernel function. 
#>  Hyperparameter : sigma =  0.083888616644614 
#> 
#> Number of Support Vectors : 4187 
#> 
#> Objective Function Value : -2260.233 
#> Training error : 0.519335

# or with the e1071:::svm

library(e1071)
wine_svm_model <- svm(quality~., data = wine)
wine_svm_model
#> 
#> Call:
#> svm(formula = quality ~ ., data = wine)
#> 
#> 
#> Parameters:
#>    SVM-Type:  eps-regression 
#>  SVM-Kernel:  radial 
#>        cost:  1 
#>       gamma:  0.09090909 
#>     epsilon:  0.1 
#> 
#> 
#> Number of Support Vectors:  4176

Now we are ready to call the broken() function. Since kernlab is useing S4 methods we need to pass here the hook to kernlab:::predict method.

library("breakDown")
nobs <- wine[5, , drop = FALSE]
base_prediction <- predict(wine_svm_model, nobs)
set.seed(1313)

explain_5_up <- broken(wine_svm_model, new_observation = nobs, 
                    data = wine, predict.function = predict,
                    baseline = "intercept", direction = "up")
explain_5_up
#>                              contribution
#> (Intercept)                         0.000
#> + density = 0.9956                 -0.290
#> + chlorides = 0.058                -0.061
#> + alcohol = 9.9                    -0.079
#> + pH = 3.19                        -0.031
#> + total.sulfur.dioxide = 186       -0.023
#> + sulphates = 0.4                  -0.027
#> + free.sulfur.dioxide = 47         -0.005
#> + quality = 6                       0.000
#> + citric.acid = 0.32                0.019
#> + residual.sugar = 8.5              0.098
#> + volatile.acidity = 0.23           0.102
#> + fixed.acidity = 7.2               0.146
#> final_prognosis                    -0.152
#> baseline:  5.842347

explain_5_down <- broken(wine_svm_model, new_observation = nobs, 
                    data = wine, predict.function = predict,
                    baseline = "intercept", direction = "down")
explain_5_down
#>                              contribution
#> (Intercept)                         0.000
#> - density = 0.9956                 -0.290
#> - residual.sugar = 8.5              0.195
#> - alcohol = 9.9                    -0.080
#> - volatile.acidity = 0.23           0.103
#> - total.sulfur.dioxide = 186       -0.071
#> - sulphates = 0.4                  -0.066
#> - fixed.acidity = 7.2               0.072
#> - pH = 3.19                        -0.025
#> - citric.acid = 0.32                0.049
#> - free.sulfur.dioxide = 47         -0.038
#> - chlorides = 0.058                -0.001
#> - quality = 6                       0.000
#> final_prognosis                    -0.152
#> baseline:  5.842347

And plot it.

library(ggplot2)
plot(explain_5_up) + ggtitle(paste0("Prediction for SVM model ", round(base_prediction, 3)))

plot(explain_5_down) +  ggtitle(paste0("Prediction for SVM model ", round(base_prediction, 3)))