Interpretable Machine Learning

Exercise on Functional Decomposition

Author

Munir Eberhardt Hiabu

Published

April 3, 2024

In the lecture, we discussed local and global explanations as well as functional decompositions. In this exercise we want to take a deeper look via simulated data.

library(mlr3)
library(mlr3learners)
library(mlr3tuning)
library(DALEX)
library(DALEXtra)
library(ALEPlot)
## 1-dim pdp plot at a fixed point
pdp_xk <- function(data,learner,k,x_k){
  newX <- data
  newX[,k] <- x_k
  mean(predict(learner, as.data.frame(newX)))
}

## 2-dim pdp plot at a fixed point
pdp_xjk <- function(data,learner,j,k,x_j,x_k){
  newX <- data
  newX[,k] <- x_k
  newX[,j] <- x_j
  mean(predict(learner, as.data.frame(newX)))
}

#### calcualtes 1-dim pdp plot over a equi-distant grid of length I
pdp <- function(dat,learner,k, I) {
  my_grid <-  seq(min(dat[,k]) , max(dat[,k]), length.out=I)
  return(list(x_k=my_grid, pdp_k=sapply(1:I, function(j) pdp_xk(dat,learner,k,my_grid[j]))))
}
m <- function(x){ x[,1]+x[,2]^2+x[,1]*x[,2] }

generate_data <- function(n){
  X1 <- X2 <- runif(n)
  X1 <- X1 + rnorm(n,sd=0.05)
  X2 <- X2 + rnorm(n,sd=0.05)
  X <- cbind(X1,X2)
  Y <-  m(X) ### no noise
  dat <- data.frame(X=X, Y=Y)
  return(dat)
}

n <- 1000
dat <- generate_data(n)