Changelog
Source:NEWS.md
glex 0.6.0.9000 (development version)
glex()now warns whenxcontains missing values (#41): splits are evaluated without the model’s learned missing-value direction, so the decomposition of rows withNAs is unreliable and does not sum to the model prediction. Proper missing value support needs more investigation; previously such input passed silently.glex()onxgboostmodels fit with early stopping now decomposes only the trees up tobest_iteration, matching whatpredict()evaluates by default. Previously all fitted trees were decomposed, so the components did not sum to the prediction. Closes #42.randomPlantedForest (>= 0.3.0)is now required (inSuggests:): it fixes an out-of-bounds read inpurify_3()that crashed R on Windows (PlantedML/randomPlantedForest#61), so rpf tests and examples run on all platforms.$shapis now a scalarNA(with a warning) when the decomposition is constrained viamax_interactionorfeatures: a constrained decomposition does not sum to the full model prediction, so SHAP values cannot be reconstructed from it without violating the efficiency property. Previously, misleading values were returned.$mis unaffected. Supersedes #18, closes #13.glex()objects gain a$constrainedfield naming the arguments that constrained the decomposition (character(0)if complete), solength(x$constrained) > 0tells you whether$shapis usable.A requested constraint only invalidates
$shapif it actually drops something: a model can contain a high-order term whose value is zero, in which case dropping it leaves the decomposition (and the SHAP values) unchanged.glex()confirms the constraint against the model’s own predictions and, if the dropped terms were inert, keeps$shapand emits a message instead of a warning.glex()onrandomPlantedForestmodels now returns$shapas well, computed from the components like for the other model classes (for multiclass models,$shapcolumns are class-specific like those of$m). Previously the field was absent. Constraining the decomposition post-hoc viamax_interactionorfeaturesis now detected forrpfmodels too, where it previously passed silently.glex()objects gain a$remainderfield: what the constraint’s dropped terms are collectively worth, per observation, on the scale of$m. It is present exactly when the decomposition is constrained, sointercept + rowSums(m) + remainderreconstructs the model prediction whether or not a constraint was applied.randomPlantedForestobjects already carried a$remaindercomputed bypredict_components(), but the other model classes did not; the two are now one field with one definition, computed in one place. Closes #11, supersedes #25. Unlike #25, this covers classification and other non-identity links: the remainder is taken on the scale the model is decomposed on, so forxgboostit is on the link scale (plogis(intercept + rowSums(m) + remainder)recovers abinary:logisticprobability), whilerangerprobability forests andrandomPlantedForestare decomposed on the response scale directly.For
randomPlantedForestclassification models,glex()now confirms the constraint againstpredict(type = "numeric")rather than the defaulttype = "prob". rpf decomposes the raw score, whiletype = "prob"applies rpf’s response function (a clamp to[0, 1]forloss = "L2", the inverse link for"logit"and"exponential") and for binary models returns the classes in an order whose first column is not the one being decomposed. The components reconstruct the raw score exactly, so$remaindernow measures only what the dropped terms are worth, instead of silently absorbing the back-transformation and the class mix-up.glex_explain()now reads SHAP values from$shapinstead of recomputing them from the components, so theglexobject is the single source of truth. The SHAP reference bar is omitted for constrained decompositions, where it previously showed a value reconstructed from the constrained components, and for objects created by earlier versions of glex, which have no$shap.print()on aglexobject reports when the decomposition is constrained.
glex 0.6.0
- Extended compatibility with
xgboost, now requiringxgboost (>= 3.0.0)inSuggests:- Updated tests and examples for the new API
- Plot colors are now configurable via
options()and documented in?glex_options:glex.palette(diverging palette for continuous interaction effects;NULLfor the default shap-style gradient, or the name of a scico palette),glex.palette_discrete(palette for categorical predictors: a color vector,"okabe-ito", a scico palette name, or a brewer palette name),glex.colors_sign(negative/positive colors inglex_explain()and gradient endpoints), andglex.color_line(main effect line/column color). - Default colors updated to follow the blue/red convention of the Python
shap/shapiqpackages: continuous interaction effects use a#008BFB→ white →#FF0051gradient (previously the cyclic scico palette"vikO"), andglex_explain()uses the same blue/red for negative/positive contributions.
glex 0.5.2
-
Fix newer xgboost R package compatibility:
- Updated tree schema column name from
QualitytoGain, matching xgboost commit 73713de ([R] rename Quality -> Gain (#9938), in upstream v2.1.0) - Implemented dynamic
base_scoreextraction to replace hardcoded 0.5 intercept (modern xgboost auto-estimatesbase_score) - Fixed floating-point precision mismatch in C++ split comparators by casting to float, matching xgboost predictor behavior
- Added node reindexing to ensure contiguous row ordering in tree matrices
- For CRAN users, this schema change is observed in the later 3.x package line (for example 3.1.2.1+), which requires R >= 4.3.0
- These changes ensure accurate model explanations for current CRAN xgboost releases
- Updated tree schema column name from
glex 0.5.1
- Fix path-dependent algorithm by computing the proper covers manually
- Allow
glex()to accept data frames as input
glex 0.4.2
- Optimize FastPD by only computing components up to
max_interaction(#24)
glex 0.4.1
- Added FastPD (arXiv) as default
probFunctioninglex. - Add rug plot to
plot_*_effect[s]functions for continuous predictors, defaulting to showing a rug on the bottom side (rug_side = "b").
glex 0.4.0
- Add support for ranger objects to
glex()(PR#17). - Add new optional parameter
probFunctiontoglex()which specifies the probability function for weighting/marginalization of the leaves (PR#17).
By default,glex()now uses the empirical marginal probabilities to perform the weighting. Previously, the weighting of the leaves was done based on a path-dependent method. - Add
theme_glex()as a default theme to all plots.
This is almost identical to [ggplot2::theme_minimal()] aside from increased base font size and convenience flags to toggle vertical and horizontal grid lines. - Add
subset_components()andsubset_component_names()to make it easier to extract only components belonging to a given main term. - Add pre-processed version of
Bikesharedata fromISLR2to streamlined examples. - Add
plot_pdp(), a version ofplot_main_effect()with the intercept added. - Limit
max_interactioninglex.xgb.Boostertomax_depthparameter ofxgboostmodel. Ifmax_depthis not set during model fit, the default value of6is assumed. This preventsglexfrom returning spurious higher-order interactions containing values numerically close to 0. - Extend plot functions to multiclass classification. In most cases that means facetting by the target class.
- Overhaul
glex_explainto a waterfall plot showing the SHAP decomposition for given predictors. -
autoplot.glex_vigains amax_interactionargument in line withglex_explain, and now similarly aggregates terms that either fall belowthresholdor exceedmax_interaction. - Add
glex.printfor a more compact output in case of large numbers of terms.
glex 0.3.0
- Added plotting functions for main, 2- and 3-degree interaction terms
- Added
ggplot2::autoplotS3 method forglexobjects. - Added
pkgdownsite - Added Bikesharing article
- Added
glex_vi()to compute variable importance scores including interaction terms, including a correspondingggplot2::autoplotmethod. - Added
glex_explain()to plot prediction components of a single observation.
glex 0.2.0
- Convert
glex()to an S3 generic function with methods forxgboostandrandomPlantedForestmodels. - Fix bug in
xgboostmethod that could lead to wrongly computed shap values in certain cases. - Added a
NEWS.mdfile to track changes to the package.