From ee5a004d4c03ca846d3632b1a6f5e6c5c6ccfeb5 Mon Sep 17 00:00:00 2001 From: Michael Mayer Date: Sat, 20 Sep 2025 15:41:27 +0200 Subject: [PATCH] Random seed should be set before background selection --- NEWS.md | 6 ++++++ R/kernelshap.R | 9 +++++---- R/permshap.R | 8 ++++---- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/NEWS.md b/NEWS.md index 8209be7..2b5ff4d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -4,6 +4,12 @@ - More pre-calculations for exact part of the methods ([#175](https://github.com/ModelOriented/kernelshap/pull/175)). +### Bug fixes + +- Setting the random seed in `kernelshap()` or `permshap()` would not respect the random selection of the background dataset. + ([#177](https://github.com/ModelOriented/kernelshap/pull/177)). + + # kernelshap 0.9.0 ### Bug fix diff --git a/R/kernelshap.R b/R/kernelshap.R index 785ef77..82d6a45 100644 --- a/R/kernelshap.R +++ b/R/kernelshap.R @@ -205,16 +205,17 @@ kernelshap.default <- function( p == 1L || exact || hybrid_degree %in% 0:(p / 2), "m must be even" = trunc(m / 2) == m / 2 ) + + if (!is.null(seed)) { + set.seed(seed) + } + prep_bg <- prepare_bg(X = X, bg_X = bg_X, bg_n = bg_n, bg_w = bg_w, verbose = verbose) bg_X <- prep_bg$bg_X bg_w <- prep_bg$bg_w bg_n <- nrow(bg_X) n <- nrow(X) - if (!is.null(seed)) { - set.seed(seed) - } - # Calculate v1 and v0 bg_preds <- align_pred(pred_fun(object, bg_X, ...)) v0 <- wcolMeans(bg_preds, bg_w) # Average pred of bg data: 1 x K diff --git a/R/permshap.R b/R/permshap.R index d25782f..3e03e1d 100644 --- a/R/permshap.R +++ b/R/permshap.R @@ -124,6 +124,10 @@ permshap.default <- function( message(txt) } + if (!is.null(seed)) { + set.seed(seed) + } + basic_checks(X = X, feature_names = feature_names, pred_fun = pred_fun) prep_bg <- prepare_bg(X = X, bg_X = bg_X, bg_n = bg_n, bg_w = bg_w, verbose = verbose) bg_X <- prep_bg$bg_X @@ -131,10 +135,6 @@ permshap.default <- function( bg_n <- nrow(bg_X) n <- nrow(X) - if (!is.null(seed)) { - set.seed(seed) - } - # Baseline and predictions on explanation data bg_preds <- align_pred(pred_fun(object, bg_X, ...)) v0 <- wcolMeans(bg_preds, w = bg_w) # Average pred of bg data: 1 x K