Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

🔥 Bankai Boruta

PyPI Latest Release Package Status Python versions uv managed Downloads License: GPL-3.0-or-later CI Dependency security Coverage GitHub Release PyPI deployment GitHub stars

BankaiBoruta is a fast, memory-efficient implementation of the Boruta all-relevant feature selection algorithm for large tabular datasets.

Boruta rounds run inside the native Rust engine of Bankai Random Forest: real columns are prepared once per fit, shadow columns are shuffled in parallel and trees train without building an augmented real-plus-shadow matrix. The decision rule is the same as BorutaPy's, behind a scikit-learn-compatible selector. Classic Boruta is the default; greedy=True enables the fixed-round Greedy Boruta variant.

⚠️ Bankai Boruta is in Alpha. Its API and fitted objects may change.

Install

Python 3.11 or newer is required. Bankai Boruta is in alpha, so pin the release you install:

python -m pip install bankai-boruta==0.1.0a11

Quick start

This example generates a binary classification dataset with 1,000 rows and 20 features. It fits selection on the training partition and applies the same feature mask to the held-out partition. A pandas DataFrame supplies feature names.

The forest is the default one, written out: exact Extra Trees from Bankai Random Forest with depth 6 on all cores. Thread count, depth and backend are set on the forest. Exact forests run in the native engine with float32 input, so the features are float32; the default forest casts float64 input itself. n_estimators="auto" on the selector replaces the forest's tree count with BorutaPy's heuristic each round; use n_estimators=None to keep it.

import pandas as pd
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

from bankai_boruta import BankaiBoruta
from bankai_random_forest import BankaiRandomForestClassifier

values, y = make_classification(
    n_samples=1_000,
    n_features=20,
    n_informative=5,
    n_redundant=3,
    random_state=2077,
)
X = pd.DataFrame(values.astype("float32"), columns=[f"feature_{i}" for i in range(values.shape[1])])
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, stratify=y, random_state=2077,
)

forest = BankaiRandomForestClassifier(
    extra_trees=True,
    extra_trees_backend="exact",
    importance_type="gain",
    max_depth=6,
    n_jobs=-1,
)
selector = BankaiBoruta(
    forest,
    n_estimators="auto",
    perc=100,
    alpha=0.05,
    max_iter=100,
    random_state=2077,
)
selector.fit(X_train, y_train)

X_train_selected = selector.transform(X_train)
X_test_selected = selector.transform(X_test)
print(f"Selected features: {selector.n_features_}")
print(selector.get_feature_names_out())
print(f"Train shape: {X_train_selected.shape}; test shape: {X_test_selected.shape}")

selection = pd.DataFrame({
    "feature": selector.feature_names_in_,
    "confirmed": selector.support_,
    "tentative": selector.support_weak_,
    "rank": selector.ranking_,
})
print(selection.sort_values("rank"))

transform returns confirmed features only. fit_transform(X, y) combines the fit and transform steps. NumPy arrays and pandas DataFrames are supported.

Selector reference

BankaiBoruta follows scikit-learn's estimator conventions and uses parameter names familiar from BorutaPy. Its constructor defaults are:

from bankai_boruta import BankaiBoruta

selector = BankaiBoruta(
    estimator=None,
    n_estimators="auto",
    perc=100,
    alpha=0.05,
    two_step=True,
    max_iter=100,
    random_state=None,
    verbose=0,
    early_stopping=False,
    n_iter_no_change=20,
    greedy=False,
    bonferroni=True,
    importance_getter="auto",
    store_history=False,
)
Parameter Default Description
estimator None A clonable classifier. None uses the exact Extra Trees forest from the quick start and casts float64 input to float32, as scikit-learn's trees do. The supplied estimator is not modified.
n_estimators "auto" BorutaPy's feature/depth heuristic for tree count. A positive integer overrides the count; None keeps the estimator's setting and supports classifiers without a tree-count parameter.
perc 100 Shadow-importance percentile in (0, 100]. A real feature scores a hit only when its importance is strictly above this threshold.
alpha 0.05 Significance level in (0, 1) for classic tests and the greedy round budget.
two_step True Classic: combine Benjamini–Hochberg FDR across active features with Bonferroni across rounds. False uses Bonferroni across the original features. Ignored in greedy mode.
max_iter 100 Classic iteration bound. As in BorutaPy 0.4.3, the loop runs at most max_iter - 1 rounds. Ignored in greedy mode.
random_state None Integer seed, NumPy RandomState, or None. Controls shadows and per-round forest seeds.
verbose 0 Non-negative verbosity level. Positive values print round progress and confirmed-feature counts.
early_stopping False Classic: stop when the decisions remain unchanged beyond the patience limit. Ignored in greedy mode.
n_iter_no_change 20 Positive patience limit for classic early stopping.
greedy False Enable fixed-round, hit-once selection instead of classic binomial decisions.
bonferroni True Greedy: include the original feature count in the round-budget correction. Classic correction is controlled by two_step.
importance_getter "auto" Use feature_importances_, or coefficient magnitudes from coef_ (L2 across classes). Also accepts a dotted attribute path or a callable returning one finite score per augmented feature. Larger scores mean greater importance.
store_history False Keep per-round real importances and shadow thresholds after fitting.

fit(X, y, sample_weight=None) accepts non-negative sample weights with a positive total. The fitted selector exposes:

Attribute or method Meaning
support_, get_support(indices=False) Confirmed-feature mask, or column indices with indices=True.
support_weak_ Tentative features kept by the classic median rough fix; always false in greedy mode.
ranking_ Classic: confirmed rank 1, weak rank 2, other features ordered by median importance ranks. Greedy: rank 1 or 2.
n_features_, n_features_in_ Confirmed-feature count and original feature count.
feature_names_in_, get_feature_names_out() Original string column names when available, and selected output names.
n_iter_, max_iter_ Completed rounds and effective iteration bound.
importance_history_, shadow_threshold_history_ Available with store_history=True. Importance history starts with a zero row followed by one row per round.
diagnostics_ Execution path and its reason, storage mode, timings and buffer sizes (see below).

The selector supports scikit-learn pipelines, cloning and parameter search.

Forests

The default forest is the exact Extra Trees forest from the quick start. With estimator=None, float64 input is cast once to float32 so the fit always runs natively; diagnostics_["input_dtype"] keeps the original type.

Pass any BankaiRandomForestClassifier to choose another backend. Nested parameters such as estimator__max_depth work with set_params and parameter search:

forest = BankaiRandomForestClassifier(n_estimators=100, max_depth=5, n_jobs=-1)
selector = BankaiBoruta(forest, n_estimators=None, random_state=42)
selector.set_params(estimator__max_depth=7)
selector.fit(X_train, y_train)

All four BankaiRF backends run natively:

Backend Forest settings Native input
Exact Extra Trees extra_trees=True, extra_trees_backend="exact", max_bins=None float32
Binned Extra Trees extra_trees=True, extra_trees_backend="binned", max_bins in 2–255 float32 or float64
Exact Random Forest extra_trees=False, max_bins=None float32
Binned Random Forest extra_trees=False, max_bins in 2–255 float32 or float64

On the native path, one shadow session serves the whole fit. Real columns are stored once, as float32 values for exact forests or as one-byte bin codes for binned forests, and every round shuffles shadow columns in parallel inside that session. Float64 binned input is binned again each round so its edges come from the original float64 values. Exact forests with float64 input use the Python adapter, which preserves BankaiRF's float64 split semantics; convert to float32 to use the native path.

The native path forwards n_estimators, max_depth, max_features, n_jobs, random_state, extra_seed, criterion, min_samples_split, min_samples_leaf, min_weight_fraction_leaf, min_impurity_decrease, max_leaf_nodes, bootstrap, max_samples, max_bins, binning_strategy, bin_sample_size and binning_seed. max_features is resolved against each round's current real-plus-shadow width. Gain importance is normalized per tree for Extra Trees and over the forest for Random Forests.

Other configurations use the Python adapter, which fits the estimator on a materialized real-plus-shadow matrix each round. That includes sample or class weights, other importance types, warm_start, OOB scoring, monotonic constraints, custom importance getters and non-BankaiRF classifiers. Both paths apply the same decision rule.

selector = BankaiBoruta(forest, n_estimators=100, random_state=42)
selector.fit(X_train.astype("float32"), y_train)
print(selector.diagnostics_["path"], selector.diagnostics_["reason"])
print(selector.diagnostics_["storage_mode"])  # "shadow_session" on the native path

diagnostics_ reports the path ("rust" or "python") and the reason for it, the storage mode, preparation, training and shuffle times, and explicit buffer sizes such as real_bank_bytes, permutation_bytes, input_conversion_bytes and copied_bytes (augmented-matrix writes on the adapter path). These are buffer sizes, not RSS.

Performance

Medians over five seeds on an AWS c7a.4xlarge (16 AMD cores, 16 threads), against BorutaPy 0.4.3 with scikit-learn ExtraTreesClassifier and the same forest settings. Every method ran up to 40 rounds with the same decision rule. RSS is the fit's peak increase over the loaded data.

Profile (train n × p) Bankai exact Bankai binned BorutaPy + ExtraTrees
Industrial 200k × 500 22.5 s / 1,283 MiB 15.6 s / 667 MiB 37.5 s / 1,817 MiB
Credit 300k × 300 20.8 s / 1,474 MiB 16.1 s / 819 MiB 45.7 s / 1,806 MiB
Cybersecurity 400k × 150 54.8 s / 1,395 MiB 42.7 s / 908 MiB 107.5 s / 1,472 MiB
Bioinformatics 50k × 2000 135.6 s / 982 MiB 64.0 s / 450 MiB 145.1 s / 1,608 MiB

Both Bankai backends were faster and used less memory than BorutaPy in all 20 profile × seed pairs. No method confirmed an irrelevant feature. In Industrial, Credit and Bioinformatics, Bankai selected the same sets as BorutaPy. In Cybersecurity, every method reached the round limit and borderline features varied: median recall was 0.67 for Bankai exact, 0.65 for BorutaPy and 0.62 for Bankai binned. These are synthetic datasets; results depend on the workload. Protocol, raw results and the LightGBM comparison are in the benchmark repository.

Greedy mode

selector = BankaiBoruta(
    greedy=True,
    bonferroni=True,
    alpha=0.05,
    random_state=2077,
)
X_selected = selector.fit_transform(X_train, y_train)
print(f"Rounds: {selector.n_iter_}; effective budget: {selector.max_iter_}")

Greedy keeps every original feature throughout the campaign. With p original features, it runs K = ceil(log2(p / alpha)) rounds when bonferroni=True, or K = ceil(log2(1 / alpha)) otherwise.

A feature is confirmed after at least one importance above the shadow percentile. Features with no hits are rejected at completion. support_weak_ is always false and ranking_ uses 1 for confirmed and 2 for rejected features. max_iter, two_step, early_stopping, and n_iter_no_change do not control this mode. Greedy relaxes confirmation and can select more noise.

Development

Local builds need Git, Python 3.11+, stable Rust, and uv. Install the Xcode command-line tools on macOS or the Rust MSVC build tools on Windows.

git clone https://github.com/breno-jesus-fernandes/bankai-boruta.git
cd bankai-boruta
uv python install 3.11
uv sync --locked --no-install-project --extra test
uv run --no-sync maturin develop --release --locked

Run the Python and Rust tests:

uv run --no-sync pytest -q
uv run --no-sync cargo test --workspace --locked

CI tests Python 3.11–3.14 and builds ABI3 wheels for Linux x86_64/ARM64, macOS x86_64/ARM64 and Windows x86_64. Merging a new version to main publishes it to PyPI. See the development guide for the BankaiRF pin and release order, the changelog for release history, the contribution guide and the Code of Conduct.

References

  1. Nicolas Vana (2025), The Greedy Boruta Algorithm: Faster Feature Selection Without Sacrificing Recall, author article in Towards Data Science. The published GreedyBoruta 1.0.0 implementation supplies the fixed-round, hit-once reference used here.
  2. Pierre Geurts, Damien Ernst and Louis Wehenkel (2006), Extremely randomized trees, Machine Learning 63, 3–42. Author preprint and publication record.
  3. Guolin Ke et al. (2017), LightGBM: A Highly Efficient Gradient Boosting Decision Tree, NeurIPS 30, particularly Section 2.1 on histogram-based learning. Paper PDF and official histogram documentation.
  4. Miron B. Kursa and Witold R. Rudnicki (2010), Feature Selection with the Boruta Package, Journal of Statistical Software 36(11), 1–13. BorutaPy implementation.

License

Bankai Boruta is distributed under GPL-3.0-or-later. Its BankaiRF Rust backend includes the maintained GPL-3.0-or-later XRF fork.

Metadata

Release files for bankai-boruta 0.1.0a11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bankai-boruta 0.1.0a11
File Size Uploaded Provenance
bankai_boruta-0.1.0a11.tar.gz 322.4 kB With provenance Details

Built distributions (wheels)

Table of built distributions (wheels) for bankai-boruta 0.1.0a11
File
bankai_boruta-0.1.0a11-cp311-abi3-win_amd64.whl CPython 3.11 abi3 Windows x86-64 Details
bankai_boruta-0.1.0a11-cp311-abi3-manylinux_2_28_x86_64.whl CPython 3.11 abi3 Linux glibc 2.28+ x86-64 Details
bankai_boruta-0.1.0a11-cp311-abi3-manylinux_2_28_aarch64.whl CPython 3.11 abi3 Linux glibc 2.28+ ARM64 Details
bankai_boruta-0.1.0a11-cp311-abi3-macosx_11_0_arm64.whl CPython 3.11 abi3 macOS 11.0+ ARM64 Details
bankai_boruta-0.1.0a11-cp311-abi3-macosx_10_12_x86_64.whl CPython 3.11 abi3 macOS 10.12+ x86-64 Details

Total release size: 3.0 MB

Release files / bankai_boruta-0.1.0a11.tar.gz

Download URL bankai_boruta-0.1.0a11.tar.gz
Size 322.4 kB
Tags Source
SHA-256 checksum
How to use checksums
4ec6fb8a61742e69b53d5661a6fd2177d2ce52e4311e839017dd95e536d05440
BLAKE2b-256 checksum
How to use checksums
a0ee3b93dd925ea5a4a91c78c50d2d4bbbfb6b80b62c401243534e8560a96357
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / bankai_boruta-0.1.0a11-cp311-abi3-win_amd64.whl

Download URL bankai_boruta-0.1.0a11-cp311-abi3-win_amd64.whl
Size 481.4 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
e8e32dc759f314e8f65409072536cc7c2898823131bee7a98f111a4e8f627b60
BLAKE2b-256 checksum
How to use checksums
da6ab3fb1f04c6d6b9163569f4b39b5807d99f892e5c482060bdb26669e477ac
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / bankai_boruta-0.1.0a11-cp311-abi3-manylinux_2_28_x86_64.whl

Download URL bankai_boruta-0.1.0a11-cp311-abi3-manylinux_2_28_x86_64.whl
Size 583.1 kB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
850934652ecb07a8d40063ee98e386c7a54eaccd915a989cf9b66669d5fa4a05
BLAKE2b-256 checksum
How to use checksums
075095039a18fb56d2bd3001084245ebb615a1733ff87532f873622a0da202c0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / bankai_boruta-0.1.0a11-cp311-abi3-manylinux_2_28_aarch64.whl

Download URL bankai_boruta-0.1.0a11-cp311-abi3-manylinux_2_28_aarch64.whl
Size 539.4 kB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
c3fb527f0b209e3e95f8643294cf4e175b5de88162d66c16875ba771ce2e0f5f
BLAKE2b-256 checksum
How to use checksums
28d44781fd5269ad4e9724870896d3e36ef678dd58f5d4d6657c2130c2e40264
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / bankai_boruta-0.1.0a11-cp311-abi3-macosx_11_0_arm64.whl

Download URL bankai_boruta-0.1.0a11-cp311-abi3-macosx_11_0_arm64.whl
Size 506.7 kB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
78eacb49f853f4d830713022711b5bc72f773bd0abceb6d12248c891010a26a7
BLAKE2b-256 checksum
How to use checksums
b76680da563095fb0dff998103be542c77003515e77cd62d098e3f70dcd5de8d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Release files / bankai_boruta-0.1.0a11-cp311-abi3-macosx_10_12_x86_64.whl

Download URL bankai_boruta-0.1.0a11-cp311-abi3-macosx_10_12_x86_64.whl
Size 551.1 kB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
4e50922a7cf3c1e8b8c2cdef71250a8cc840d1b02fd0fa626e7a82b3733a785f
BLAKE2b-256 checksum
How to use checksums
48ffa3b5be9766ea95d8d1703df516f5fe5b94f88e34eb17c893301bd3bac9d6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

Security for bankai-boruta 0.1.0a11

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 6 files in this release have been uploaded with provenance metadata.

Select from 6 files

Attestation for bankai_boruta-0.1.0a11.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 23, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page