Cleveland Clinic Foundation patched build.
boostmtree.control(cv.cores > 1)) no
longer oversubscribe the host on a multithreaded BLAS such as OpenBLAS or
MKL. 2.0.6 computes each terminal node's increment as one product over the
node's stacked design rows, a product large enough for a threaded BLAS to
start one thread per visible CPU in every forked worker: a 4-core fit at
1000 subjects kept about 154 CPUs busy on a 192-CPU host and spent most of
its time in the kernel. Each worker now runs its BLAS on one thread, and the
parent drops to one thread while it forks and waits, then restores its
previous count. Forking after a threaded BLAS has started its thread pool is
also a known cause of spinning and hangs. A single-threaded BLAS, such as
R's reference BLAS, is left alone.RhpcBLASctl joins Imports; it sets the BLAS thread count.Cleveland Clinic Foundation patched build.
mu, err.rate and m.opt are identical to
2.0.5. On the same number of cores a fit can take a few percent longer,
because R collects garbage more often when it allocates long vectors.Cleveland Clinic Foundation patched build.
pmax(). That ran once per (left-out, other) subject pair, n^2 calls per
step, and pmax()'s fixed R-level cost per call made it the largest serial
cost of the fit, about three quarters of the serial time at 600 subjects. It
now runs once per subject over the subject's whole state. pmax() is
elementwise, so the fit is unchanged: mu, err.rate and m.opt are
identical to 2.0.4.Cleveland Clinic Foundation patched build.
cv.flag = TRUE fits can run the out-of-bag update on several cores with
the new boostmtree.control(cv.cores = ). Each boosting step refits the
terminal nodes once for every out-of-bag subject, which makes the
cross-validated fit cost grow with the square of the number of subjects;
those refits are independent within a step and are now forked with
parallel::mclapply(). The default of 1 core keeps the sequential path.
The refits draw no random numbers, so mu, err.rate and m.opt are
identical for any core count. Windows, which cannot fork, uses 1 core.crossprod() and reuses it for the Hessian
and the score. Neither change alters the fit.parallel returns to Imports, now that it is used again.Cleveland Clinic Foundation patched build.
parallel dependency. The 2.0.0 refactor removed every
mclapply() call, leaving importFrom("parallel", "mclapply") in
NAMESPACE and parallel in Imports with nothing using them.boostmtree.news() documents its return value as
called for side effects and gains an example; the Description uses the
lowercase <doi:...> form and fixes "is design for".Cleveland Clinic Foundation patched build.
na.action = "na.omit" is now accepted. The formal is written
c("na.omit", "na.impute")[2], which evaluates to the single string
"na.impute", and a bare match.arg() takes its choices from that
evaluated default. The documented value was therefore rejected, and the
na.omit branch of the missing-data rule (drop subjects with any missing
covariate, rather than only those missing all of them) was unreachable.vimp.boostmtree(joint = TRUE) no longer fails with "length of 'dimnames'
[1] not equal to array extent". The collapse to a single joint.vimp label
was applied only when x.names was supplied, so at the documented default
the importance matrix had one row and one label per covariate. Supplying
x.names took the working branch, which made the failure look intermittent.Both are present in CRAN boostmtree 2.0.0 and have been reported upstream.
R/utilities.R. The 2.0.0 refactor moved its contents into
boostmtree_math.R and friends under boostmtree.-prefixed names and left
the original file in the package; none of its 16 functions had a caller or
was exported. It also carried an unguarded solve() that the live code path
guards, which made it a standing source of false bug reports.partial.plot, marginal.plot, vimp.boostmtree, plot.boostmtree and
print.boostmtree had no tests at all; all plotting tests assert the absence
of warnings. Both bug fixes above were found by writing these tests.Cleveland Clinic Foundation patched build.
gamma) diverging when a model is fit
with cv.flag = TRUE. The in-sample linear predictor and mean were
refreshed only on the cv.flag = FALSE branch of the boosting loop, so
with cross-validation enabled the working fit stayed frozen at its
initialization. Residuals never shrank, the ridge penalty lambda
collapsed, and each boosting step contributed a same-sized coefficient,
so the linear predictor accumulated M unshrunk increments.
Any output reading the stored gamma was affected: predict() with
use.cv.flag = FALSE, partial.plot(), marginal.plot(),
predict(...)$muhat, and vimp() on the non-CV path.lambda also feeds
boostmtree.update.cv.step(). Cross-validated results therefore move on
this version, and the size and even the sign of the move depend on the
configuration. Measured across 18 fits (n = 60 and 120; M = 50, 150
and 250; three seeds each), the minimum of err.rate moved between 16.9%
lower and 13.3% higher, and cross-validated rmse between 41.1% lower and
15.6% higher; lambda, phi and rho shift as well. m.opt can move
substantially -- it changed in 8 of the 18 fits, including 67 to 250 and
119 to 248 -- so a stopping iteration chosen from an affected fit may have
been badly truncated. Treat err.rate, m.opt, rmse and mu from any
earlier cv.flag = TRUE fit as unusable: all of them must be re-derived
from a re-fit on this version, and none may be carried over.cv.flag = TRUE.This is a major maintenance and interface-cleanup release prepared for CRAN resubmission. The release focuses on code correctness, documentation, naming consistency, and more predictable behavior for core fitting, prediction, and visualization workflows.
ntree = 1 tree-based boosting path."continuous", "binary", "nominal", and "ordinal".boostmtree.control() as the primary user-facing control interface for resampling, reproducibility, and other fitting options.control$ntree = 1.tm and id are omitted.q) representation.seed now controls reproducibility only.bootstrap = "none" into a full in-bag user bootstrap.cv.flag = TRUE, the fit now enforces an OOB-producing resampling rule and records OOB availability in the fitted object.oob.available and oob.subject.count.predict.boostmtree() to match the refactored object structure and naming conventions.print.boostmtree() so grow and predict objects are summarized correctly and consistently.plot.boostmtree() so plotting now goes to the active graphics device by default.
vimp.boostmtree object.vimpPlot() workflow with plot() methods for variable-importance objects.partial.plot() / partial.plot.boostmtree()marginal.plot() / marginal.plot.boostmtree()boostmtree help page in a more user-facing style.print, plot, predict, variable importance, and effect-plot methods.phi, rho, lambda, mod.grad, and prediction outputs such as mu and muhat.vimpPlot(), partialPlot(), and marginalPlot() were replaced by classed objects and plot() methods or lower-case dotted interfaces.utilities.R.mu, muhat, and related fields,gamma representations used during prediction.forest.tol.