Bayesian Feature Selection and Attribution Suite
Project description
bxai
Bayesian Feature Selection and Attribution Suite
A Python package implementing rigorous Bayesian methods for feature selection and model explainability. Where conjugate structure permits, bxai uses closed-form analytical updates (Beta-Binomial, Normal-Inverse-Gamma) to keep iteration fast. Where the model demands full posterior inference — Horseshoe GLMs, BART, and the optional MCMC path in BayLIME; it delegates to PyMC. The result is a unified toolkit that matches computational cost to statistical necessity.
Features
-
Global Non-Linear Selection
BayesianBorutaSHAP: Tree-based feature selection using SHAP values, swapping frequentist p-values for Bayesian credible intervals, with dynamic pruning for fast performance. Supports discrete (Beta-Binomial) and continuous (Normal-Inverse-Gamma) modes.BayesianPermutation: Model-agnostic importance tracking using paired validation loss drops updated via the Student-t continuous engine.
-
Local Interpretability
BayLIME: Stable, prior-informed local explanations wrapping standard/custom perturbations in a Bayesian linear regression. The default backend uses a closed-form analytical posterior; an optionalbackend='mcmc'path (requiresmcmcextra) adds heteroscedastic noise and Horseshoe priors for richer uncertainty quantification. Can be seeded with global SHAP weights from Phase 1.
-
Parametric & Native Bayesian Importance
ShrinkagePIP: High-dimensional GLMs with Horseshoe and Lasso regularizing priors, tracking Posterior Inclusion Probabilities (PIP). Uses the posterior shrinkage factor κ_j = 1/(1+λ_j²τ²) for the Horseshoe prior (correct for continuous shrinkage distributions) and an auto-data-scaled |β_j| threshold for the Lasso (requiresmcmcextra).BARTImportance: Variable inclusion frequency (VIF) tracking from native Bayesian Additive Regression Trees (requiresmcmcextra).
Installation
Install using uv:
uv add bxai
Or install with optional dependencies (e.g., SHAP/LightGBM for Boruta, PyMC for MCMC methods, catboost, xgboost):
uv add bxai --optional boruta --optional mcmc --optional xgboost --optional catboost
Quick Start
We will load the real-world Breast Cancer Wisconsin (Diagnostic) dataset as our dataset of choice:
from sklearn.datasets import load_breast_cancer
data = load_breast_cancer(as_frame=True)
X, y = data.data, data.target
BayesianBorutaSHAP
import lightgbm as lgb
from bxai.selection import BayesianBorutaSHAP
# Fit Bayesian BorutaSHAP
clf = lgb.LGBMClassifier(random_state=42, verbose=-1)
selector = BayesianBorutaSHAP(model=clf, mode="discrete", max_iter=20, random_state=42)
selector.fit(X, y)
print("Confirmed Features:", selector.confirmed_)
BayesianPermutation
from bxai.selection import BayesianPermutation
from sklearn.ensemble import RandomForestClassifier
clf_perm = RandomForestClassifier(random_state=42).fit(X, y)
# Permutation feature selection with parallel jobs (n_jobs=2) and ROPE (Region of Practical Equivalence)
selector_perm = BayesianPermutation(
model=clf_perm,
scoring="accuracy",
n_repeats=10,
rope=0.001, # CIs inside [-0.001, 0.001] or entirely below -0.001 are Rejected
n_jobs=2,
random_state=42
)
selector_perm.fit(X, y)
print("Confirmed Features:", selector_perm.confirmed_)
print(selector_perm.summary()[["feature", "mean", "hdi_lower", "hdi_upper", "status"]])
BayLIME
from bxai.explanation import BayLIME
# Instantiate BayLIME with pandas DataFrame column names
explainer = BayLIME(
training_data=X,
feature_names=list(X.columns)
)
# Fit the base model before explaining
clf.fit(X, y)
# Explain the first patient's instance
explanation = explainer.explain_instance(
instance=X.iloc[0].values,
predict_fn=clf.predict_proba
)
print(explanation.as_dataframe())
ShrinkagePIP
from bxai.parametric import ShrinkagePIP
# Horseshoe prior — uses kappa-based PIP by default (pip_method='auto')
# PIP = P(κ_j < 0.5 | data), where κ_j = 1/(1 + λ_j² τ²)
# For binary target, model_type='logistic' must be specified
selector_hs = ShrinkagePIP(
model_type="logistic",
prior="horseshoe",
kappa_threshold=0.5, # κ < 0.5 → local scale dominates → signal
pip_threshold=0.80,
n_samples=500,
random_state=42,
)
selector_hs.fit(X, y)
print("Selected features (Horseshoe):", selector_hs.confirmed_)
print(selector_hs.summary()[["feature", "pip", "kappa_mean", "selected"]])
from bxai.parametric import ShrinkagePIP
# Lasso prior — uses auto-scaled |β| threshold (epsilon = 0.1 on log-odds scale)
selector_lasso = ShrinkagePIP(
model_type="logistic",
prior="lasso",
pip_threshold=0.80,
n_samples=500,
random_state=42,
)
selector_lasso.fit(X, y)
print(f"Effective epsilon: {selector_lasso.epsilon_:.4f}")
print("Selected features (Lasso):", selector_lasso.confirmed_)
BARTImportance
from bxai.parametric import BARTImportance
# Classification example (Probit BART)
bart_clf = BARTImportance(model_type="classification", n_trees=20, n_samples=200, tune=100, chains=1, random_state=42)
bart_clf.fit(X, y)
print("Classification Selected features:", bart_clf.confirmed_)
BayesianCorrelation
Calculates posterior distributions of Pearson's $r$, Spearman's $\rho$, or Kendall's $\tau$ correlation coefficients using MCMC sampling. Exposes an adaptive plot() method (beautifully smooth KDE density curve for bivariate single-feature inputs, and a forest-style interval line plot for multivariate inputs) color-coded by magnitude-based significance rules of thumb.
Bivariate Correlation Example:
from bxai.parametric import BayesianCorrelation
# Estimate Pearson correlation between two features
model = BayesianCorrelation(
method="pearson",
backend="quick",
chains=1, # chains=1, cores=1 is recommended for macOS inside Jupyter
cores=1,
random_state=42
)
model.fit(X["mean radius"], X["mean perimeter"])
# Get the summary DataFrame with columns: "Feature 1", "Feature 2", "Posterior Mean", "Strength"
print(model.summary()[["Feature 1", "Feature 2", "Posterior Mean", "95% HDI Lower", "95% HDI Upper", "Strength"]])
# Render a KDE density plot with mean reference line and 95% HDI bar
model.plot()
Multivariate Correlation Example:
# Estimate correlation of multiple features against a single target variable
features = ["mean radius", "mean texture", "mean perimeter"]
target = "mean area"
model_multi = BayesianCorrelation(
method="pearson",
backend="quick",
chains=1,
cores=1,
random_state=42
)
model_multi.fit(X[features], X[target])
# Get the summary DataFrame with columns: "Feature", "Target", "Posterior Mean", "Strength"
print(model_multi.summary()[["Feature", "Target", "Posterior Mean", "Strength"]])
# Render a stacked forest plot of all feature correlations on the y-axis
model_multi.plot()
License
MIT License
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bxai-0.1.4.tar.gz.
File metadata
- Download URL: bxai-0.1.4.tar.gz
- Upload date:
- Size: 2.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.17
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
702b240cd13671a8911d450ed295aaf89d409bdd993b4a517731e820b9075fef
|
|
| MD5 |
8b633024becc30eea0e652f73e9737d5
|
|
| BLAKE2b-256 |
9d9c8a78782b4ee4cbb8c9d581eeea353ef5a74beed2aa780f42108913fbafc9
|
File details
Details for the file bxai-0.1.4-py3-none-any.whl.
File metadata
- Download URL: bxai-0.1.4-py3-none-any.whl
- Upload date:
- Size: 53.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.8.17
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1557af6708c498a26f4d13a6177e4832f406cc55a2c645dc96a3cd6c902b9f6e
|
|
| MD5 |
ea0f8d3555b3f0410687bf0cf7ff40f1
|
|
| BLAKE2b-256 |
763122de9dbe56ab8450cb0c5678fad6aea219427214e85005c41dafd2e66dc6
|