bve_select — BVE — Backward Variable Elimination

Group: Variable selector · Registry tolerance: 1e-06

Description

Backward Variable Elimination (§18 Phase 5k)

Registry note — R plsVarSel::bve_pls backward elimination with VIP cut (Mehmood et al.). Default _bve_select_pls4all path mirrors the same R call with seed=11, giving bit-exact mask parity. The C++ greedy step-count RMSE backward-elimination kernel is opt-in via legacy=True.

Parameters

Name

Type

Default

Notes

n_components

int

2

current public binding signature

n_steps

int

10

current public binding signature

min_features

int | None

None

current public binding signature

n_folds

int

3

current public binding signature

Explanations

Bibliographic source

Mehmood, T. et al. (2011). A Partial Least Squares based algorithm for parsimonious variable selection. Algorithms for Molecular Biology 6, 27. DOI 10.1186/1748-7188-6-27.

Mathematical principle

Starting from the full variable set, the routine performs exactly n_steps backward-elimination rounds. At every round it scores every available one-variable removal by CV RMSE, removes the candidate with the smallest RMSE, and stores the resulting subset. It finally returns the stored step whose CV RMSE is smallest over the complete trajectory; it does not stop when a single removal increases RMSE.

Appropriate uses

Backward variable elimination using a PLS-derived relevance score.

Limits and validation

The greedy path is not globally optimal. Correlated predictors can exchange predictive signal, making the removal order and the selected trajectory step unstable; repeat the whole elimination inside an outer validation protocol rather than treating one CV minimum as unbiased evidence.

Implementation

cpp/src/core/bve_selection.cpp evaluates the CV RMSE of every one-variable removal at each of the exact n_steps, records all generated subsets, then returns the global RMSE minimum. The registry’s plsVarSel::bve_pls reference documents the canonical comparison; it does not establish identical behavior for every compatibility path.

Sources and provenance

Current implementation: cpp/src/core/bve_selection.cpp.

API and bindings

C ABI (ABI 2): n4m_feature_selection_bve_select. Use the linked public header for the exact signature, configuration, and result handles.

Python (verified public re-export):

from n4m.feature_selection.wrapper import BVE

Source signature: BVE(*, n_components: int = 2, n_steps: int = 10, min_features: int | None = None, n_folds: int = 3) (n4m/_impl/selection.py).

R (source-verified): bve_select(X, Y, n_components, n_steps = 10L, min_features = 5L).

The source signature has additional required inputs, so no example call is fabricated.

MATLAB / Octave (source-verified): bve_select(X, Y, n_components, n_steps, min_features).

The source signature has additional required inputs, so no example call is fabricated.

Registry parity references 📐

  • 📐 ref.r_plsvarsel (R · r) — plsVarSel 0.10.0 · strict (rmse_rel ≤ 1e-06) — R plsVarSel::bve_pls — backward variable elimination with VIP filter.

Benchmarks

Archived measurement identity. Backend labels in this table are the raw IDs recorded when the benchmark ran (including historical pls4all.* IDs). They preserve measurement provenance and do not describe a current public Python, R, or MATLAB binding; use the source-verified API and bindings section above for current entry points.

Adaptive wall-clock per cell measured against full_matrix.csv. Only backends that implement this method are listed; libraries without the method are omitted.

Verdict  ·  ✓ ref / ≈ ref / ~ shape mark a reference-gate pass at strict / relaxed / qualitative tolerance  ·  ✓ bind = archived binding-harness result agrees with the C++ baseline  ·  ⇄ cross-check = documented by-design selector/RNG/model, noncanonical API/facade convention, or secondary oracle  ·  ✗ divergent  ·  ⚠ error  ·  — not run. The fastest backend per column is marked 🏆.

Reference gate: strict — numeric equivalence (rmse_rel_tol ≤ 1e-06).

Rows tagged with 📐 are the canonical parity references for this method (declared in parity_timing.registry). C++ and external rows show reference parity; archived language-harness rows show binding parity against the C++ backend. Hover the icon for role and tolerance band.

BackendParity200×40 (ms)
C++ native · libn4m
pls4all.cpp.blas+omp✓ J 1.00510.0 ms
Python · archived pls4all benchmark
pls4all.python✓ J 1.00563.8 ms
pls4all.sklearn⇄ J 0.4042.4 ms🏆
R · archived pls4all benchmark
pls4all.R⇄ J 0.4058.7 ms
pls4all.R.formula⇄ J 0.4066.5 ms
pls4all.R.mdatools⇄ J 0.40152.1 ms
pls4all.R.pls⇄ J 0.40141.0 ms
R · external
📐ref.r_plsvarselsource46.9 ms
BackendParity200×40 (ms)
C++ native · libn4m
pls4all.cpp.blas+omp✓ J 1.00491.1 ms
Python · archived pls4all benchmark
pls4all.python✓ J 1.00491.1 ms
pls4all.sklearn⇄ J 0.4043.0 ms🏆
R · archived pls4all benchmark
pls4all.R⇄ J 0.4061.4 ms
pls4all.R.formula⇄ J 0.4062.6 ms
pls4all.R.mdatools⇄ J 0.4062.1 ms
pls4all.R.pls⇄ J 0.4061.3 ms
R · external
📐ref.r_plsvarselsource47.3 ms
BackendParity200×40 (ms)
C++ native · libn4m
pls4all.cpp.blas+omp✓ J 1.00507.2 ms
Python · archived pls4all benchmark
pls4all.python✓ J 1.00479.8 ms
pls4all.sklearn⇄ J 0.4043.9 ms🏆
R · archived pls4all benchmark
pls4all.R⇄ J 0.4061.3 ms
pls4all.R.formula⇄ J 0.4062.1 ms
pls4all.R.mdatools⇄ J 0.40109.1 ms
pls4all.R.pls⇄ J 0.4060.9 ms
R · external
📐ref.r_plsvarselsource45.8 ms

See also: benchmark overview · methods index · interactive dashboard