--- title: "Algorithm" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Algorithm} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- `fastgbm` implements second-order (Newton) gradient boosting with histogram-based split search. ## Objectives For observation $i$ at iteration $m$, gradients $g_i = \partial \ell(y_i, F_i)/\partial F_i$ and Hessians $h_i = \partial^2 \ell(y_i, F_i)/\partial F_i^2$ are computed for the current objective: * **Cox** (`objective = "cox"`): negative Cox partial log-likelihood, Breslow handling of tied event times, with $g_i$/$h_i$ derived from cumulative risk-set sums computed once per boosting round in $O(n \log n)$ (sort once, reuse the ordering). * **AFT** (`objective = "aft"`): negative log-likelihood of a normal location-scale accelerated failure time model, with separate closed-form gradients/Hessians for event vs. censored observations. ## Split search For every node and feature: gradient and Hessian sums are accumulated by histogram bin (continuous features are pre-binned into up to `max_bins` quantile-based bins, default 255), cumulative left/right statistics are computed, and every valid split point is scored by $$ \text{Gain} = \frac12\left[\frac{G_L^2}{H_L+\lambda} + \frac{G_R^2}{H_R+\lambda} - \frac{(G_L+G_R)^2}{H_L+H_R+\lambda}\right] - \gamma, $$ with missing values evaluated as routed both left and right; the better direction is stored as the node's default. Leaf values are $w_j = -G_j/(H_j+\lambda)$. ## Parallelism The per-feature histogram/gain scan within each node is data-parallel (each feature's best split is independent of the others given the node's gradient/Hessian sums), so it is dispatched through `RcppParallel::parallelFor()` once the node/feature count crosses an internal threshold (below it, the same code path runs serially -- dispatch overhead isn't worth it for small nodes). Because the reduction across features is a fixed-order argmax rather than an order-dependent floating-point sum, training is bit-identical regardless of `threads`. ## What's not yet implemented Leaf-wise (`grow_policy = "lossguide"`) growth, validation-based early stopping (accepted but inactive), monotonic/interaction constraints, and AFT distributions other than the normal.