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, scalable feature selection library built for large datasets.

It combines the Boruta all-relevant selection algorithm with the native Rust backend of Bankai Random Forest. Classic Boruta is the default; greedy=True enables the fixed-round Greedy Boruta variant. BankaiRF supplies binned Extra Trees, gain importance and parallel tree training through a scikit-learn-compatible selector for classification.

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

Install

Python 3.11 or newer is required. The release installation command is:

python -m pip install bankai-boruta

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.

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

from bankai_boruta import BankaiBoruta

values, y = make_classification(
    n_samples=1_000,
    n_features=20,
    n_informative=5,
    n_redundant=3,
    random_state=2077,
)
X = pd.DataFrame(values, 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,
)

selector = BankaiBoruta(
    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; pandas inputs are converted to NumPy for training.

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 creates BankaiRF with the default configuration shown below. The supplied estimator is preserved.
n_estimators "auto" BorutaPy's feature/depth heuristic for tree count. A positive integer overrides the count; None preserves 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. Like BorutaPy 0.4.3, the loop uses iteration indices below this bound, allowing up to max_iter - 1 rounds. Ignored in greedy mode.
random_state None Integer seed, NumPy RandomState, or None. Controls shadows and per-round forest seeds without replacing constructor parameters.
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 Retain per-round real importances and shadow thresholds after fitting.

The default classifier is configured as follows; remaining parameters follow BankaiRF a15 defaults:

from bankai_random_forest import BankaiRandomForestClassifier

forest = BankaiRandomForestClassifier(
    extra_trees=True,
    extra_trees_backend="binned",
    max_bins=63,
    importance_type="gain",
    max_depth=6,
    n_jobs=-1,
)

Pass a classifier for full forest customization, then use nested parameters such as estimator__max_depth with set_params or parameter search. Weights and original training labels, including text labels, are passed to the Python adapter without re-encoding the labels supplied to the classifier.

forest = BankaiRandomForestClassifier(
    n_estimators=100,
    max_depth=5,
    class_weight="balanced",
    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)

Native forest controls for benchmarks

The validated binned Extra Trees gain configuration honors the supplied BankaiRandomForestClassifier.n_jobs and max_features on the native path. For example, this configuration keeps virtual shadows with four workers and fractional feature sampling:

forest = BankaiRandomForestClassifier(
    n_estimators=150, max_depth=8, max_bins=63,
    extra_trees=True, extra_trees_backend="binned", importance_type="gain",
    n_jobs=4, max_features=0.15,
)
selector = BankaiBoruta(forest, n_estimators=150, random_state=42)
selector.fit(X_train, y_train)
assert selector.diagnostics_["path"] == "rust"

Both controls use the pinned a15 forest's validation and resolution rules: n_jobs=None means one worker, positive values specify the worker count, and negative values resolve relative to the CPU count. max_features accepts "sqrt", "log2", a positive integer, a fraction in (0, 1], or None. Feature counts resolve against each round's current real-plus-shadow width, including after Classic rejects columns, and fractional counts are floored with a minimum of one. Integer counts must fit that round's width. The resolved worker count controls native preparation and forest training; tree parallelism is capped by the number of trees.

Other forest settings must still meet native eligibility. To benchmark the materialized Python adapter with the same forest, set importance_getter="feature_importances_" and assert selector.diagnostics_["path"] == "python". Native virtual shadows avoid the augmented dense matrix. Since a5, native float32 and float64 arrays retain their dtype; other inputs and all adapter inputs use float64. Each value is promoted to f64 only when read by Rust. Permutations and their reusable row index buffer use uint32 for up to 2**32 rows, otherwise int64 within platform addressing limits. Bins remain materialized and training is unchanged.

fit(X, y, sample_weight=None) accepts non-negative sample weights with positive total weight. Classic selection counts hits and uses binomial tests; its final median comparison marks surviving tentative features as weak. 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 retained 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. Other ranks start at 2 when there are no weak features, or 3 otherwise. 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. Constructor parameters remain unchanged during fit.
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, fallback reason, timing, augmented float-copy bytes and native storage-rebuild count.

The selector supports scikit-learn pipelines and cloning. A fresh clone is used for each round when a supplied classifier enables warm_start, preventing trees from retaining previous shadows. estimator_ contains cloned configuration on the Rust path and the last round's fitted classifier on the adapter path.

BankaiRF backend and performance foundations

The backend combines several sources of computational efficiency:

Foundation Role in Bankai Boruta
Greedy Boruta Optional fixed-round selection confirms a feature after its first hit, replacing repeated binomial confirmation tests with a bounded campaign.
Extra Trees Random cut points reduce exhaustive threshold search in the forest. BankaiRF's default here combines Extra Trees with bootstrap sampling and per-tree gain normalization.
LightGBM histogram methods Discretization replaces continuous values with compact bins and supports per-bin statistics. BankaiRF a15's binned Extra Trees stores bins by column and uses a single statistics pass for binary splits; this is its own forest backend.
BankaiRF a15 Rust engine Parallel trees and virtual shadow access avoid constructing an expanded floating-point input matrix on the validated native path. Rounds remain sequential.

The scientific papers and author article are linked under References. The LightGBM reference describes binning and histogram principles; the a15 implementation determines the actual forest storage and split behavior. The default binned Extra Trees path uses its own column-bin statistics rather than the global histogram caches of BankaiRF's ordinary Random Forest path.

Rust execution is selected automatically for the validated default binned Extra Trees gain configuration, with supported changes to tree count, random seed, depth, bins (2–255), and Extra Trees seed. Other settings, weights, monotonic constraints and custom getters use the Python adapter, preserving estimator parameters and a15 validation. Shadow monotonic constraints are always zero. diagnostics_ records the path and its reason.

Both Python and Rust dependencies are aligned to BankaiRF 0.1.0a15; the Rust revision is caa46c22ef93434cd87319490513e877d4378564. Training storage is rebuilt each round as required by a15. Immutable inputs and permutation buffers are reused within a fit; training caches are not shared across independent fits. diagnostics_ also reports input_dtype (received dtype), native_input_dtype (validated dtype on the native path, otherwise None), input_conversion_bytes (size of the converted input buffer, zero for a shared NumPy input), permutation_dtype, and permutation_bytes (largest per-round size of permutations plus the reusable row-index buffer during the fit). These are explicit buffer sizes, not RSS or total allocations. The existing copied_bytes remains cumulative augmented float-matrix writes across rounds; it excludes input conversions and permutations. For a 100,000 × 500 float32 array, a5 removes 400,000,000 input-conversion bytes and 200,400,000 permutation bytes versus a4: approximately 572.6 MiB. RSS and timings require measurement. Only local results are covered by the a5 report; the four-profile Linux campaign remains pending.

Copy metrics cover augmented float-matrix writes, while a15's internal bin and cache allocations remain part of preparation/training time and measured RSS.

See the reproducible validation report for Rust/adapter importance parity, reference-algorithm comparisons, timing, peak memory, recall and false positives. The measurements describe specific datasets and seeds; actual speed and selection quality depend on the workload and configuration.

Migration from a2

estimator is now the first argument. Configure forest parameters on that classifier instead of the removed selector arguments forest_backend, pruning, importance, importance_scale, input_mode, max_features, max_depth, n_jobs, and max_bins. greedy=True enables hit-once selection; the former aggressive pruning rule is a different algorithm. The bankai-rf, polars, and arrow-test extras were removed. This release supports NumPy and pandas; Polars and Arrow integration is outside its scope.

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 retains 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. The exact floating-point ratio is used to compute the ceiling safely at power-of-two boundaries and very small alpha.

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; the validation report measures that tradeoff without assuming a universal recall advantage.

Development

Local builds need Git, Python 3.11+, stable Rust, and uv. Install 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
git switch feature/greedy-bankai-a15
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 checks, then reproduce the benchmark campaign as needed:

uv run --no-sync pytest -q
uv run --no-sync cargo test --workspace --locked
uv run --no-sync python benchmarks/validate_a3.py
uv run --no-sync python benchmarks/summarize_a3.py

Both lockfiles are committed. CI tests Python 3.11–3.14 and builds ABI3 wheels for Linux x86_64/ARM64, macOS x86_64/ARM64 and Windows x86_64, with installed-wheel smoke tests. The scheduled BankaiRF release check reports upstream versions; upgrades must align both dependency pins and pass compatibility/performance checks.

Read the development guide, contribution guide, and 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.0a5

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.0a5
File Size Uploaded Provenance
bankai_boruta-0.1.0a5.tar.gz 194.0 kB With provenance Details

Built distributions (wheels)

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

Total release size: 2.4 MB

Release files / bankai_boruta-0.1.0a5.tar.gz

Download URL bankai_boruta-0.1.0a5.tar.gz
Size 194.0 kB
Tags Source
SHA-256 checksum
How to use checksums
318cf62a13c308ce38e5a2de60481164bb5154c257c20432145728c8dd634f8a
BLAKE2b-256 checksum
How to use checksums
458de36afacc8c7d7fe2e0895970926bb1926b2d009a17f795afea5e58f8addf
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 18, 2026.

Transparency log

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

Download URL bankai_boruta-0.1.0a5-cp311-abi3-win_amd64.whl
Size 380.3 kB
Tags CPython 3.11 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
00e4dbf79e24bac563680b1dd27d3a07085c685d9b5846ce07ae83e8e6b09259
BLAKE2b-256 checksum
How to use checksums
97222a0e511db3f70a7bb0076d634d10856982d726e83cd114f90b3888c0dc28
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 18, 2026.

Transparency log

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

Download URL bankai_boruta-0.1.0a5-cp311-abi3-manylinux_2_28_x86_64.whl
Size 477.6 kB
Tags CPython 3.11 Linux glibc 2.28+ x86-64 abi3
SHA-256 checksum
How to use checksums
4be1601509f1424c8b49eac9b33b50ca57a67b4254012cc5321429ff5a9f8d09
BLAKE2b-256 checksum
How to use checksums
b1eed608695beee44fd537929d01c031f3e15851d9127cd9e3452cca60311a10
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 18, 2026.

Transparency log

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

Download URL bankai_boruta-0.1.0a5-cp311-abi3-manylinux_2_28_aarch64.whl
Size 447.0 kB
Tags CPython 3.11 Linux glibc 2.28+ ARM64 abi3
SHA-256 checksum
How to use checksums
84e28d3d8b9036a572449610bf7f086c94b0928f37d2c1cb4244c76fdc40f914
BLAKE2b-256 checksum
How to use checksums
a4602bdfd77e8c500bf4f7893b8f349bd77e4c090bfd1e19281b87b7249890a8
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 18, 2026.

Transparency log

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

Download URL bankai_boruta-0.1.0a5-cp311-abi3-macosx_11_0_arm64.whl
Size 420.3 kB
Tags CPython 3.11 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
ce4f795f8818b921a5818685d519bd5f65ddc03a00ec1be97cfd136252db1b67
BLAKE2b-256 checksum
How to use checksums
3285b9b8db4912e40cedf5a2c5bcbc67ae7edb1e329db34c4ceb53c95dfd575d
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 18, 2026.

Transparency log

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

Download URL bankai_boruta-0.1.0a5-cp311-abi3-macosx_10_12_x86_64.whl
Size 452.6 kB
Tags CPython 3.11 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
9ffcad64d682c956505553aebb4491397cbc9eac76a84876c5975c8de6bf0221
BLAKE2b-256 checksum
How to use checksums
d84083bbcacafb53ea747aed161b1d4079dc53e37086da60f0fe1ccb4100867b
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 18, 2026.

Transparency log

Security for bankai-boruta 0.1.0a5

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.0a5.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 18, 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