Skip to content

SACE

SACE Counterfactual Methods

SACE provides multiple variants for generating counterfactual explanations.

Variants

  • Standard SACE: Base implementation
  • Case-based SACE: Uses case-based reasoning
  • Feature SACE: Feature-focused approach
  • Random SACE: Randomized search
  • Neighbor SACE: Neighbor-based generation
  • Tree SACE: Tree-structured search
  • Distribution SACE: Distribution-aware generation

Usage

from counterfactuals.cf_methods.local_methods.sace import SACE

method = SACE(
    gen_model=gen_model,
    disc_model=classifier,
    disc_model_criterion=criterion,
    device="cuda"
)

result = method.explain(
    X=instance,
    y_origin=0,
    y_target=1,
    X_train=X_train,
    y_train=y_train
)

API Reference

SACE

SACE(variable_features=None, weights=None, metric='euclidean', feature_names=None, continuous_features=None, categorical_features_index_lists=None, normalize=True, pooler=None, tol=0.01)

Bases: ABC

Source code in counterfactuals/cf_methods/local_methods/sace/sace.py
def __init__(
    self,
    variable_features=None,
    weights=None,
    metric="euclidean",
    feature_names=None,
    continuous_features=None,
    categorical_features_index_lists=None,
    normalize=True,
    pooler=None,
    tol=0.01,
):
    self.variable_features = variable_features
    self.weights = weights
    self.metric = metric
    self.feature_names = feature_names
    self.continuous_features = continuous_features
    self.categorical_features_index_lists = categorical_features_index_lists
    self.normalize = normalize
    self.pooler = pooler
    self.tol = tol

    self.b = None
    self.X = None
    self.y = None
    self.nbr_features = None
    self.non_variable_features = None
    self.nbr_variable_features = None
    self.scaler = None
    self.nX = None

fit abstractmethod

fit(b, X)

:param b: black box predict function :param X: training set of b :param V: list of features to vary

Source code in counterfactuals/cf_methods/local_methods/sace/sace.py
@abstractmethod
def fit(self, b, X):
    """

    :param b: black box predict function
    :param X: training set of b
    :param V: list of features to vary
    """

    self.b = b
    self.y = self.b.predict(X)

    if self.pooler:
        X_p = self.pooler.transform(X)
        self.X = X_p
    else:
        self.X = X

    self.nbr_features = self.X.shape[1]
    self.variable_features = (
        self.variable_features
        if self.variable_features is not None
        else np.arange(self.nbr_features).tolist()
    )
    self.non_variable_features = [
        i for i in range(self.nbr_features) if i not in self.variable_features
    ]
    self.nbr_variable_features = len(self.variable_features)

    self.scaler = StandardScaler() if self.normalize else DummyScaler()
    self.scaler.fit(self.X)
    self.nX = self.scaler.transform(self.X)

    self.__init_cont_cat_features(self.continuous_features)
    self.__detect_ranges()