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_plsbackward elimination with VIP cut (Mehmood et al.). Default_bve_select_pls4allpath 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 vialegacy=True.
Parameters¶
Name |
Type |
Default |
Notes |
|---|---|---|---|
|
|
|
current public binding signature |
|
|
|
current public binding signature |
|
|
|
current public binding signature |
|
|
|
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) —plsVarSel0.10.0 · strict (rmse_rel ≤ 1e-06) — RplsVarSel::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.
| Backend | Parity | 200×40 (ms) |
|---|---|---|
| C++ native · libn4m | ||
pls4all.cpp.blas+omp | ✓ J 1.00 | 510.0 ms |
| Python · archived pls4all benchmark | ||
pls4all.python | ✓ J 1.00 | 563.8 ms |
pls4all.sklearn | ⇄ J 0.40 | 42.4 ms🏆 |
| R · archived pls4all benchmark | ||
pls4all.R | ⇄ J 0.40 | 58.7 ms |
pls4all.R.formula | ⇄ J 0.40 | 66.5 ms |
pls4all.R.mdatools | ⇄ J 0.40 | 152.1 ms |
pls4all.R.pls | ⇄ J 0.40 | 141.0 ms |
| R · external | ||
📐ref.r_plsvarsel | source | 46.9 ms |
| Backend | Parity | 200×40 (ms) |
|---|---|---|
| C++ native · libn4m | ||
pls4all.cpp.blas+omp | ✓ J 1.00 | 491.1 ms |
| Python · archived pls4all benchmark | ||
pls4all.python | ✓ J 1.00 | 491.1 ms |
pls4all.sklearn | ⇄ J 0.40 | 43.0 ms🏆 |
| R · archived pls4all benchmark | ||
pls4all.R | ⇄ J 0.40 | 61.4 ms |
pls4all.R.formula | ⇄ J 0.40 | 62.6 ms |
pls4all.R.mdatools | ⇄ J 0.40 | 62.1 ms |
pls4all.R.pls | ⇄ J 0.40 | 61.3 ms |
| R · external | ||
📐ref.r_plsvarsel | source | 47.3 ms |
| Backend | Parity | 200×40 (ms) |
|---|---|---|
| C++ native · libn4m | ||
pls4all.cpp.blas+omp | ✓ J 1.00 | 507.2 ms |
| Python · archived pls4all benchmark | ||
pls4all.python | ✓ J 1.00 | 479.8 ms |
pls4all.sklearn | ⇄ J 0.40 | 43.9 ms🏆 |
| R · archived pls4all benchmark | ||
pls4all.R | ⇄ J 0.40 | 61.3 ms |
pls4all.R.formula | ⇄ J 0.40 | 62.1 ms |
pls4all.R.mdatools | ⇄ J 0.40 | 109.1 ms |
pls4all.R.pls | ⇄ J 0.40 | 60.9 ms |
| R · external | ||
📐ref.r_plsvarsel | source | 45.8 ms |
See also: benchmark overview · methods index · interactive dashboard