brulee 1.2.0
predict()for regressionbrulee_tab_icl()models gained two newtypevalues."quantile"returns a.pred_quantilecolumn (ahardhat::quantile_pred()vector) at the levels given by the new predict-timequantile_levelsargument, which defaults to(1:9) / 10."variance"returns the variance of the predictive distribution in a.pred_variancecolumn. The TabICL regression head was already a quantile regression head internally, so this exposes a distribution the model was always computing;type = "numeric"is unchanged and remains the default. Unlikebrulee_chronos(), the levels are not fixed when the model is created and any value in the open interval (0, 1) can be requested. See?predict.brulee_tab_iclfor how ensemble members are pooled for each type.-
Added
augment()methods for all brulee model fits.- For regression models,
.predand.residare added. For the latter, it is computed when the outcome is present in the data. See the exceptions below for foundational models. - For classification, the hard class predictions and class probability estimates are added.
- For
brulee_chronos()models, the forecast columns are aligned to the rows ofnew_datarather than to the internal per-series prediction order. - For
brulee_tab_icl()regression models, quantile regression estimates and the prediction variance can be obtained by setting thequantile_levelsargument to a non-null value..residis then measured against the median of the predictive distribution.
- For regression models,
The error thrown when
predict()is given an unsupportedtypeis now attributed topredict()rather than to brulee’s internal helper.predict()now clamps anepochlarger than the number of epochs actually fit, which is what its documentation and its warning have always promised. Previously it warned and then failed with asubscript out of boundserror, and anepochexactly equal tolength(fit$estimates)failed with no warning at all. Because early stopping makes the number of epochs fit vary by platform, a fixedepochcould work on one machine and fail on another.coef()was already correct and now shares the same check (#138).
brulee 1.1.1
CRAN release: 2026-07-13
Pretrained model weights (for
brulee_tab_icl()andbrulee_chronos()) are no longer downloaded automatically when the package is attached. When the weights are missing, bothbrulee_tab_icl()andbrulee_chronos()now prompt to download them in an interactive session and error otherwise. TabICL weights can also be downloaded explicitly withtab_icl_download_weights()(#130).Downloaded model weights are now cached in the per-user cache directory returned by
tools::R_user_dir("brulee", "cache"), which respects platform conventions, rather than under~/.cache(#130).brulee_resnet()no longer returns all-NApredictions when the training-set size leaves a single-row trailing batch (e.g.mtcarswith default settings). Such a batch made batch-normalization compute a variance over one sample, corrupting its buffers withNaN(#122).
brulee 1.1.0
CRAN release: 2026-07-02
brulee_tab_icl()makes the open-source foundational model TabICL available. On first use, there is a substantial download (~ 400MB) for the model weights that is cached locally.brulee_saint()andbrulee_auto_int()now support gradient clipping via thegrad_value_clipandgrad_norm_cliparguments (both default to5), matchingbrulee_mlp()andbrulee_resnet(). This prevents the loss from overflowing toNaNduring training with aggressive learning rates.There is now a
typeargument topredict.brulee_chronos():"all"returns.predand.pred_quantile(unchanged default),"numeric"returns only.pred,"quantile"returns only.pred_quantile. The id column is still prepended for multi-series models regardless of type.Fixed a bug where torch’s L-BFGS optimizers internal convergence flag is NA, throwing an unhelpful error.
Breaking Changes
The
brulee_saint()argumentuse_target_tokenwas renamed totarget_token.predict()forbrulee_chronos()models was reworked. The historical context is always the data supplied tobrulee_chronos()(the model is pretrained and does no training), so the formernew_datacontext-override was removed. The argument previously calledfuture_dfis nownew_data: it describes the future window to forecast for and may have at mostprediction_lengthrows per series (previously exactlyprediction_length). When fewer rows are supplied, the forecast is truncated to those rows.predict()also gained atypeargument ("all","numeric", or"quantile") to select which prediction columns are returned.-
All estimated models now include epoch zero (the randomly initialized parameters, before any training) as the first element of
lossandestimates, matching the neural-network models. These vectors are now lengthepochs + 1,epoch = 0is a valid argument topredict()andcoef(), and the entry forbest_epochis at positionbest_epoch + 1. Predictions and coefficients for a given (positive) epoch are unchanged. Note: objects serialized by earlier versions of these three functions predict off by one epoch under the new indexing, so refit any stored models.- The
print()methods now report the loss from the best epoch. Previously the displayed loss was taken one epoch too early (it ignored the prepended epoch-zero entry inloss).
- The
brulee 1.0.0
CRAN release: 2026-06-17
New models for tabular data:
Regularization Learning Networks (
brulee_rln()) use a conventional MLP architecture but each weight learns its own adaptive regularization coefficient.ResNet (
brulee_resnet()) can fit a multilayer neural network with skip (i.e. residual) connections and batch normalization.AutoInt (
brulee_auto_int()) uses residual connections and columnwise attention mechanisms to create embeddings that encourage in-context learning of features.Saint (
brulee_saint()) uses column and/or row attention mechanisms.Chronos2 (
brulee_chronos()) is a foundational model for forecasting.All modeling functions now support GPU acceleration via the
deviceparameter. Users can specifydevice = "cpu",device = "cuda", ordevice = "mps"(Apple Silicon). Whendevice = NULL(default), the package automatically selects CUDA if available, otherwise defaults to CPU. Note: MPS is not auto-selected because it doesn’t support float64 dtype required by brulee. See?training_efficiencyfor some related notes.
Breaking Changes
Float tensors were changed from 64-bit floats to 32-bit. This is to enable GPU usage on MPS devices.
Parameters are initialized on CPU devices and then converted to the chosen device. In some cases, the RNG initialization code is independent of the seed.
For classification, the softmax was moved out of every model’s forward pass so the loss can use
torch::nnf_cross_entropy()(which applies the log-sum-exp trick internally) instead ofnll_loss(log(softmax(x))). This avoidslog(0)underflow that producedNaNlosses and “numerical overflow” early stopping on overspecifiedbrulee_saint()/brulee_auto_int()fits. Affectsbrulee_mlp(),brulee_logistic_reg(),brulee_multinomial_reg(),brulee_resnet(),brulee_auto_int(), andbrulee_saint(). New fits carryoutput_type = "logits"so the predict path applies softmax; serialized fits from earlier versions of brulee continue to predict correctly.
brulee 0.6.0
CRAN release: 2025-09-02
Transition from the magrittr pipe to the base R pipe.
-
To try to help avoiding numeric overflow in the loss functions:
Tensors are stored as a 64-bit float instead of 32-bit.
Starting values were transitioned to using Gaussian distribution (instead of uniform) with a smaller standard deviation.
The results always contain the initial results to use as a fallback if there is overflow during the first epoch.
brulee_mlp()has two additional parameters,grad_value_clipandgrad_value_clip, that prevent issues.The warning was changed to “Early stopping occurred at epoch {X} due to numerical overflow of the loss function.”
Several new SGD optimizers were added:
"ADAMw","Adadelta","Adagrad", and"RMSprop".Mixture parameter values different than zero cannot be used for several optimizers since they require L2 penalties.
brulee 0.5.0
CRAN release: 2025-04-07
- Removed a unit test for numerical overflow since it occurs less frequently and has become increasingly more challenging to reproduce.
brulee 0.4.0
CRAN release: 2025-01-30
Added a convenience function,
brulee_mlp_two_layer(), to more easily fit two-layer networks with parsnip.Various changes and improvements to error and warning messages.
Fixed a bug that occurred when linear activation was used for neural networks (#68).
brulee 0.3.0
CRAN release: 2024-02-14
Fixed bug where
coef()didn’t would error if used on abrulee_logistic_reg()that was trained with a recipe. (#66)Fixed a bug where SGD always being used as the optimizer (#61).
Additional activation functions were added (#74).
brulee 0.2.0
CRAN release: 2022-09-19
Several learning rate schedulers were added to the modeling functions (#12).
An
optimizerwas added to [brulee_mlp()], with a new default being LBFGS instead of stochastic gradient descent.
