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
: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()
|