From 3c21bfc8b89d6f5a197772b2ccec58a4ec349986 Mon Sep 17 00:00:00 2001 From: topepo Date: Fri, 21 Nov 2025 16:21:32 -0500 Subject: [PATCH 1/9] parameter conversion --- R/xrf.R | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/R/xrf.R b/R/xrf.R index 50f20a0..a7c9555 100644 --- a/R/xrf.R +++ b/R/xrf.R @@ -555,14 +555,15 @@ xrf.formula <- function( nrounds <- xgb_control$nrounds # necessary to remove from params to avoid false positive warnings xgb_control <- within(xgb_control, rm(nrounds)) + browser() if (is.null(prefit_xgb)) { m_xgb <- xgboost( - data = design_matrix, - label = data[[response_var]], + x = design_matrix, + y = data[[response_var]], nrounds = nrounds, objective = get_xgboost_objective(family), - params = xgb_control, + params = xgb_params(xgb_control), verbose = 0 ) rules <- extract_xgb_rules(m_xgb) @@ -828,3 +829,20 @@ smaller_formula <- function(x, ...) { } chr_form } + +xgb_params <- function(x, call = rlang::caller_env()) { + cl <- rlang::call2("xgb.params", .ns = "xgboost", !!!x) + res <- try(rlang::eval_tidy(cl, data = x), silent = TRUE) + if (inherits(res, "try-error")) { + msg <- as.character(res) + msg <- strsplit(msg, split = ":")[[1]][-(1:3)] + msg <- gsub("\\n", "", msg) + msg <- trimws(msg) + msg <- paste0(msg, collapse = "") + cli::cli_abort( + "There was an error when parsing the xgboost arguments: {msg}", + call = call + ) + } + res +} From 666038082a79d2b298198ebe22934a2f03fc329b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98topepo=E2=80=99?= Date: Sat, 22 Nov 2025 03:05:51 -0500 Subject: [PATCH 2/9] modifications for new xgboost version --- R/xrf.R | 24 +++--------------------- 1 file changed, 3 insertions(+), 21 deletions(-) diff --git a/R/xrf.R b/R/xrf.R index a7c9555..1c6f934 100644 --- a/R/xrf.R +++ b/R/xrf.R @@ -49,6 +49,7 @@ condition_xgb_control <- function( data_mutated[[response_var]] <- integer_response - min(integer_response) } + xgb_control$objective <- get_xgboost_objective(family, call = call) list(xgb_control = xgb_control, data = data_mutated) } @@ -70,22 +71,6 @@ xrf_preconditions <- function( ) } - if (!('nrounds' %in% names(xgb_control))) { - cli::cli_abort( - "Must supply an {.arg nrounds} list element to the {.arg xgb_control} - argument.", - call = call - ) - } - - if ('objective' %in% names(xgb_control)) { - cli::cli_abort( - "User may not supply an {.arg objective} element to the {.arg xgb_control} - argument.", - call = call - ) - } - if (!(response_var %in% colnames(data))) { cli::cli_abort( "Response variable {.var {response_var}} not present in supplied data", @@ -555,14 +540,11 @@ xrf.formula <- function( nrounds <- xgb_control$nrounds # necessary to remove from params to avoid false positive warnings xgb_control <- within(xgb_control, rm(nrounds)) - browser() if (is.null(prefit_xgb)) { - m_xgb <- xgboost( - x = design_matrix, - y = data[[response_var]], + m_xgb <- xgboost::xgb.train( + xgboost::xgb.DMatrix(design_matrix, label = data[[response_var]]), nrounds = nrounds, - objective = get_xgboost_objective(family), params = xgb_params(xgb_control), verbose = 0 ) From 1e40d74dc854ad65ae027cce5190062d4bdcfea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98topepo=E2=80=99?= Date: Sat, 22 Nov 2025 04:01:47 -0500 Subject: [PATCH 3/9] archive fit using previous xrf and xgb packages --- inst/xgb_1_7_11.R | 13 +++++++++++++ inst/xgb_1_7_11.RData | Bin 0 -> 55144 bytes tests/testthat/test_xgb_1_7_11.R | 11 +++++++++++ 3 files changed, 24 insertions(+) create mode 100644 inst/xgb_1_7_11.R create mode 100644 inst/xgb_1_7_11.RData create mode 100644 tests/testthat/test_xgb_1_7_11.R diff --git a/inst/xgb_1_7_11.R b/inst/xgb_1_7_11.R new file mode 100644 index 0000000..c8d9a60 --- /dev/null +++ b/inst/xgb_1_7_11.R @@ -0,0 +1,13 @@ +# pak::pak(c("xrf", "xgboost"), ask = FALSE) +library(xrf) +library(xgboost) +# xgboost_1.7.11.1 xrf_0.2.2 + +set.seed(832) +xgb_1_7_11_fit <- xrf(mpg ~ ., data = mtcars[1:28, ], family = "gaussian") +xgb_1_7_11_pred <- predict(xgb_1_7_11_fit, mtcars[29:32, ]) +save(xgb_1_7_11_fit, xgb_1_7_11_pred, file = "inst/xgb_1_7_11.RData") + +if (!interactive()) { + q("no") +} diff --git a/inst/xgb_1_7_11.RData b/inst/xgb_1_7_11.RData new file mode 100644 index 0000000000000000000000000000000000000000..19d97ceeaa90b0114f9672dce058310d9f368a0c GIT binary patch literal 55144 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 Date: Sat, 22 Nov 2025 04:02:04 -0500 Subject: [PATCH 4/9] version bump --- DESCRIPTION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DESCRIPTION b/DESCRIPTION index 3a2d434..dfbe7fb 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,7 @@ Imports: Matrix, methods, rlang, - xgboost (>= 0.71.2) + xgboost (>= 3.1.2.1) Suggests: covr, testthat (>= 3.0.0) From 0493bc87e171293d9f2179573c8feefe1bc5be63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98topepo=E2=80=99?= Date: Sat, 22 Nov 2025 04:03:00 -0500 Subject: [PATCH 5/9] version note + changes to summary method --- R/xrf.R | 19 +++++++++++++++---- man/xrf.formula.Rd | 7 +++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/R/xrf.R b/R/xrf.R index 1c6f934..5a5f10d 100644 --- a/R/xrf.R +++ b/R/xrf.R @@ -492,6 +492,14 @@ xrf <- function(object, ...) { #' @importFrom stats terms #' @importFrom stats update #' +#' @details +#' +#' In November 2025, the new version of \pkg{xgboost} (3.1.2.1) introduced +#' significant breaking changes. This version of \pkg{xrf} can reproduce +#' predictions from older versions of \pkg{xgboost}. However, there are likely +#' to be differences in \pkg{xrf} model fits between old and new versions of +#' \pkg{xgboost}. +#' #' @references #' Friedman, J. H., & Popescu, B. E. (2008). Predictive learning via rule #' ensembles. \emph{The Annals of Applied Statistics, 2}(3), 916-954. @@ -776,10 +784,13 @@ summary.xrf <- function(object, ...) { )) cat(paste0('\n\nOriginal Formula:\n\n')) cat(smaller_formula(object$base_formula)) - cat('\n\nTree model:\n\n') - show(summary(object$xgb)) - cat('\n\nGLM:\n\n') - show(summary(object$glm)) + cli::cli_rule("Tree model") + cat("\n") + print(object$xgb) + cat("\n") + cli::cli_rule("GLM") + print(object$glm$model) + invisible(object) } #' Print an eXtreme RuleFit model diff --git a/man/xrf.formula.Rd b/man/xrf.formula.Rd index 31affe6..88100d8 100644 --- a/man/xrf.formula.Rd +++ b/man/xrf.formula.Rd @@ -41,6 +41,13 @@ This method uses XGBoost to fit a tree ensemble, extracts a ruleset as the conju traversals, and fits a sparse linear model to the resulting feature set (including the original feature set) using glmnet. } +\details{ +In November 2025, the new version of \pkg{xgboost} (3.1.2.1) introduced +significant breaking changes. This version of \pkg{xrf} can reproduce +predictions from older versions of \pkg{xgboost}. However, there are likely +to be differences in \pkg{xrf} model fits between old and new versions of +\pkg{xgboost}. +} \examples{ m <- xrf(Petal.Length ~ ., iris, xgb_control = list(nrounds = 2, max_depth = 2), From c2f87f93dee2faf6f47a7addf0a375af76be14a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98topepo=E2=80=99?= Date: Sat, 22 Nov 2025 04:06:00 -0500 Subject: [PATCH 6/9] temporary changes for GHA and CI --- .github/workflows/R-CMD-check.yaml | 4 ++++ .github/workflows/test-coverage.yaml | 4 ++++ DESCRIPTION | 2 +- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 69cfc6a..a889a5a 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -56,6 +56,10 @@ jobs: extra-packages: any::rcmdcheck needs: check + - name: Install devel xgboost + run: | + install.packages("xgboost", repos = c("https://dmlc.r-universe.dev")) + - uses: r-lib/actions/check-r-package@v2 with: upload-snapshots: true diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 0ab748d..8d3f0e8 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -27,6 +27,10 @@ jobs: extra-packages: any::covr, any::xml2 needs: coverage + - name: Install devel xgboost + run: | + install.packages("xgboost", repos = c("https://dmlc.r-universe.dev")) + - name: Test coverage run: | cov <- covr::package_coverage( diff --git a/DESCRIPTION b/DESCRIPTION index dfbe7fb..45ad8b2 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,7 @@ Imports: Matrix, methods, rlang, - xgboost (>= 3.1.2.1) + xgboost Suggests: covr, testthat (>= 3.0.0) From aeb1a18f711f45c327d8de93e4fa035f7490f6ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98topepo=E2=80=99?= Date: Sat, 22 Nov 2025 04:16:12 -0500 Subject: [PATCH 7/9] forgotten `shell: Rscript {0}` --- .github/workflows/R-CMD-check.yaml | 3 ++- .github/workflows/test-coverage.yaml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index a889a5a..4f3fdee 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -58,7 +58,8 @@ jobs: - name: Install devel xgboost run: | - install.packages("xgboost", repos = c("https://dmlc.r-universe.dev")) + install.packages("xgboost", repos = "https://dmlc.r-universe.dev") + shell: Rscript {0} - uses: r-lib/actions/check-r-package@v2 with: diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 8d3f0e8..987d358 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -30,6 +30,7 @@ jobs: - name: Install devel xgboost run: | install.packages("xgboost", repos = c("https://dmlc.r-universe.dev")) + shell: Rscript {0} - name: Test coverage run: | From 22607b7869f9d3a3b4f421171a2319b5e815ef23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98topepo=E2=80=99?= Date: Sat, 22 Nov 2025 04:29:52 -0500 Subject: [PATCH 8/9] xgboost depends on R >= 4.3.0 --- .github/workflows/R-CMD-check.yaml | 5 +---- DESCRIPTION | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 4f3fdee..11523a5 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -26,15 +26,12 @@ jobs: - {os: macos-latest, r: 'release'} - {os: windows-latest, r: 'release'} - # use 4.0 or 4.1 to check with rtools40's older compiler - - {os: windows-latest, r: 'oldrel-4'} + - {os: windows-latest, r: 'oldrel-1'} - {os: ubuntu-latest, r: 'devel', http-user-agent: 'release'} - {os: ubuntu-latest, r: 'release'} - {os: ubuntu-latest, r: 'oldrel-1'} - {os: ubuntu-latest, r: 'oldrel-2'} - - {os: ubuntu-latest, r: 'oldrel-3'} - - {os: ubuntu-latest, r: 'oldrel-4'} env: GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} diff --git a/DESCRIPTION b/DESCRIPTION index 45ad8b2..cf01895 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -17,7 +17,7 @@ License: MIT + file LICENSE URL: https://github.com/holub008/xrf BugReports: https://github.com/holub008/xrf/issues Depends: - R (>= 4.1.0) + R (>= 4.3.0) Imports: cli, dplyr, From 22868bddc4a74fef30a4e70349c3370c73b8506c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=98topepo=E2=80=99?= Date: Thu, 4 Dec 2025 08:44:56 -0500 Subject: [PATCH 9/9] xgboost version updates --- .github/workflows/R-CMD-check.yaml | 5 ----- .github/workflows/test-coverage.yaml | 5 ----- DESCRIPTION | 2 +- 3 files changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/R-CMD-check.yaml b/.github/workflows/R-CMD-check.yaml index 11523a5..28dedcb 100644 --- a/.github/workflows/R-CMD-check.yaml +++ b/.github/workflows/R-CMD-check.yaml @@ -53,11 +53,6 @@ jobs: extra-packages: any::rcmdcheck needs: check - - name: Install devel xgboost - run: | - install.packages("xgboost", repos = "https://dmlc.r-universe.dev") - shell: Rscript {0} - - uses: r-lib/actions/check-r-package@v2 with: upload-snapshots: true diff --git a/.github/workflows/test-coverage.yaml b/.github/workflows/test-coverage.yaml index 987d358..0ab748d 100644 --- a/.github/workflows/test-coverage.yaml +++ b/.github/workflows/test-coverage.yaml @@ -27,11 +27,6 @@ jobs: extra-packages: any::covr, any::xml2 needs: coverage - - name: Install devel xgboost - run: | - install.packages("xgboost", repos = c("https://dmlc.r-universe.dev")) - shell: Rscript {0} - - name: Test coverage run: | cov <- covr::package_coverage( diff --git a/DESCRIPTION b/DESCRIPTION index cf01895..82e410c 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -26,7 +26,7 @@ Imports: Matrix, methods, rlang, - xgboost + xgboost (>= 3.1.2.1) Suggests: covr, testthat (>= 3.0.0)