Light Gbm: v4.7.0 Release
Release date:
July 18, 2026
Previous version:
v4.6.0
(released March 15, 2025)
Magnitude:
6,844
Diff Delta
Contributors:
13 total committers
105 Commits
in this Release
Ordered by the degree to which they evolved the repo in this version.
Authored October 17, 2025
Authored January 19, 2026
Authored December 2, 2025
Authored February 17, 2025
Authored October 18, 2025
Authored October 11, 2025
Authored October 16, 2025
Authored October 13, 2025
Authored September 30, 2025
Authored October 14, 2025
Authored November 28, 2025
Authored December 8, 2025
Browse Other Releases
Latest Pending
Unreleased π
v4.7.0
Released July 18, 2026
6,844 Ξ
v4.6.0
Released March 15, 2025
21,163 Ξ
v4.5.0
Released July 25, 2024
1,636 Ξ
v4.4.0
Released June 14, 2024
5,571 Ξ
v4.3.0
Released January 25, 2024
395 Ξ
v4.2.0
Released December 21, 2023
2,957 Ξ
v4.1.0
Released September 11, 2023
1,587 Ξ
v4.0.0
Released July 13, 2023
26,415 Ξ
v3.3.5
Released January 7, 2023
2,537 Ξ
v3.3.4
Released December 29, 2022
756 Ξ
Top Contributors in v4.7.0
Release Notes Published
Highlights
The Python package now supports polars inputs, thanks to narwhals.
Thanks to @borchero for the main implementation and to everyone who contributed design work, especially on https://github.com/lightgbm-org/LightGBM/issues/6204 (@maxzw @detrin @jmoralez @lcrmorin @Ic3fr0g @MarcoGorelli @kylebarron @vyasr).
Significantly improved GPU support including the first ROCm builds (https://github.com/lightgbm-org/LightGBM/pull/6086) and multi-GPU support for NVIDIA GPUs via NCCL (https://github.com/lightgbm-org/LightGBM/pull/6138). (@jeffdaily @shiyu1994 @StrikerRUS)
Improvements to distributed training / Dask. Lots of bugfixes in this area, still ongoing work, thanks especially to @wagner-austin for all the help.
Some organizational changes. The project has changed GitHub orgs (Microsoft -> lightgbm-org) and default branch names (master -> main).
Changes
π‘ New Features
- [python-package] allow access to eval result attributes by name @jameslamb (#7161)
- [python-package] Allow to pass Arrow array & Polars series as position @maxzw (#7260)
- [c++][python-package] Leverage Arrow PyCapsule Interface for Arrow interoperability (including polars support) @borchero (#7275)
- [python-package] publish nightlies to pypi.anaconda.org @jameslamb (#7245)
- [python-package] Add decision_function() to LGBMClassifier @CoderWota (#7159)
- [CUDA] Multi-GPU for CUDA Version @shiyu1994 (#6138)
- [python-package] scikit-learn fit() methods: add eval_X, eval_y, deprecate eval_set @lorentzenchr (#6857)
- [CUDA] Add CUDA version of binary error metric @nicklamiller (#7070)
- [c++] Add CPU version of standard R-squared metric @nicklamiller (#7008)
- [python-package] Follow symlinks to lib_lightgbm in library-loading @gmhewett (#6977)
- [ROCm] add support for ROCm/HIP device @jeffdaily (#6086)
- [python-package][sklearn] Support PyArrow Table as an input in scikit-learn methods @StrikerRUS (#6910)
- [ci] [dask] test
lightgbm.dask on macOS @jameslamb (#6677)
π¨ Breaking
- [ci] avoid overwriting installed 'build' in build-python.sh @jameslamb (#7356)
- change default branch from 'master' to 'main' @jameslamb (#7287)
- [CUDA] support CUDA 13, support user-supplied CUDA architecture list, update default GPU architectures @jameslamb (#7271)
- [python-package] make some imports lazy: 'dask', 'graphviz', 'joblib', 'matplotlib', 'psutil' @jameslamb (#7340)
- [python-package] Make Dataset.set_position() update self.position @maxzw (#7344)
- [c++][python-package] Leverage Arrow PyCapsule Interface for Arrow interoperability (including polars support) @borchero (#7275)
- [c++] Remove incorrect
const modifier from Arrow-related C API @borchero (#7284)
- [python-package] Bump minimum supported Python version to 3.10 @borchero (#7276)
- [ci] [docs] update handling of artifacts, stop publishing zip archive of complete source code @jameslamb (#7080)
- [c++] default to C++17 for most builds @jameslamb (#7016)
- [ci] [C++] drop support for Visual Studio 2015 (fixes #6803) @jameslamb (#7022)
- [R-package] [ci] drop support for R 3.x (fixes #7023) @jameslamb (#7038)
- [CUDA] default to C++17 for CUDA builds @jameslamb (#7013)
- [ci] Drop support for Python 3.7 and Python 3.8 @borchero (#6896)
- [python-package] drop support for h2o datatable @jameslamb (#6894)
- [python-package] Load parameters from model string @Samsagax (#6852)
- [R-package] make finalize() in R6 classes private @jameslamb (#6833)
π Efficiency Improvement
- [CUDA] Multi-GPU for CUDA Version @shiyu1994 (#6138)
π Bug Fixes
- [c++] fail on incomplete binary file writes @wgu9 (#7348)
- Fix calculation of percentiles for weighted training with regression objectives (including
mape, quantile, and regression_l1) @JKDasondee (#7224)
- [python-package] fix misleading feature name warning on sklearn 1.6+ predict() @FranciscoRMendes (#7232)
- [python-package] Enable ruff rule
B905 @borchero (#7278)
- [cuda] Fix dense histogram offset issue for global-memory @maxwbuckley (#7261)
- [python-package] fix misleading redundant parameter warnings in Booster.refit() @arjunprakash027 (#7124)
- [c++] fix multithreading pragma in LeafSplits::Init() @jameslamb (#7200)
- [ROCm] fix build, add rccl support @jeffdaily (#7185)
- [ROCm] add ROCm support (pt. 2) @jeffdaily (#7039)
- [python-package] plot_importance(): raise clearer exception when model has 0 splits @juanf-0gravity (#7160)
- [python-package] [dask] [ci] fix predict() type hints, enforce mypy in CI @jameslamb (#7140)
- [c++] fix socket timeout on POSIX systems @wagner-austin (#7137)
- [C-API] Avoid C++ includes from arrow.h when including c_api.h @desertstsung (#6973)
- [python-package] add PyArrow Table to get_data @suk1yak1 (#6911)
- [python-package] Fix mypy checks in
compat.py @borchero (#6898)
- [swig] fix memory leak in swig interface @s-rwe (#6923)
- [R-package] Ensure print.lgb.Booster() works when objective is not explicitly set @walkerjameschris (#6850)
- prohibit use of regression_l1 objective with linear trees @jameslamb (#6859)
π Documentation
- [docs] [python-package] Update pandas categorical feature encoding details @maxzw (#7250)
- [docs] add 'darts' and 'nvForest' to list of external repositories @jameslamb (#7272)
- [docs] add LightGBM-MoE to external repositories list @kyo219 (#7247)
- [docs] add Michael Mayer to CODEOWNERS and docs @jameslamb (#7239)
- [docs] Added an icon for the Winget package for when the relevant PR gets merged in Winget-pkgs. @DandelionSprout (#7110)
- [docs] Add weight to LeafSplits->Init() docs @roychan (#7079)
- [docs] update badges in README @StrikerRUS (#7057)
- [docs] Update list of winning solutions @JAroyan (#7042)
- [docs] add Ray Train API @sotagg (#7020)
- [docs] add StackOverflow badge in README @StrikerRUS (#7026)
- [docs] [python-package] document how to run Python tests @jameslamb (#6995)
- [docs] Fix docs of
Booster.update's return value is_finished @mlondschien (#6890)
- [docs] add GBNet to External Repositories list @jameslamb (#6965)
- [docs] fix link to "Parallel Algorithm for Decision Tree" paper @PriyadarshiAkshay (#6933)
- [docs] document use of EffVer @jameslamb (#6905)
- [docs][python] update types in docstring @StrikerRUS (#6897)
- [docs] update Python-package installation guide @StrikerRUS (#6767)
- [docs] add a note about DART in early_stopping docstring @jameslamb (#6846)
π§° Maintenance
- release v4.7.0 @jameslamb (#7129)
- [python-package] Add pandas tests for categorical handling and dtype validation @maxzw (#7359)
- [ci] add ppc64le C++ test job @asifsheikhibm (#7345)
- [ci] remove lingering references to 'master' branch @jameslamb (#7353)
- [ci] [R-package] use a Windows-specific download link for SWIG, stop using '<<-' in R code @jameslamb (#7364)
- [python-package] remove unnecessary old import paths in compat.py @jameslamb (#7358)
- [ci] Update pre-commit hooks @anjmon (#7351)
- [ci]: Bump the ci-dependencies group with 3 updates @dependabot[bot] (#7349)
- [python-package] remove unused 'cffi' fixture @jameslamb (#7341)
- [python-package] remove dependency on typing_extensions.TypeGuard @jameslamb (#7339)
- [ci] use pixi to manage end-of-life Python environments @jameslamb (#7328)
- [ci]: Bump the ci-dependencies group with 2 updates @dependabot[bot] (#7329)
- [python-package] [dask] remove an unnecessary check on Dask installation @jameslamb (#7332)
- [R-package] clean up more autoconf / automake files @jameslamb (#7331)
- [python-package] [ci] simplify test-skipping logic @jameslamb (#7297)
- [ci] exclude more files from biome config @jameslamb (#7293)
- normalize line endings to LF, enforce that with gitattributes @jameslamb (#7291)
- [R-package] Skip compilation of Arrow-related C++ code @borchero (#7283)
- [ci] [R-package] fix docs build, test pkgdown build in CI @jameslamb (#7268)
- [python-package] Add official support for Python 3.14 @borchero (#7279)
- [python-package] Bump minimum pyarrow version to v16.0.0 @borchero (#7280)
- [python-package] Bump minimum pyarrow dependency version to v14.0.2 @borchero (#7277)
- [ci]: Bump the ci-dependencies group with 3 updates @dependabot[bot] (#7252)
- [ci] update to r-lib/actions v2.12.0, align 'pip' and 'python' to same interpreter in 'build-python.sh' @jameslamb (#7249)
- [ci] cut some macOS jobs @jameslamb (#7223)
- [c++] mark a few more read-only methods const @jameslamb (#7228)
- [ci] adapt to scikit-learn ClassifierChain changes, fix {fs} install, work around pyarrow type-checking issues @jameslamb (#7236)
- [ci] [R-package] drop 'icc' test job, update clang and GCC r-hub container jobs @jameslamb (#7222)
- [ci] remove uses of azurecr.io for CI images @jameslamb (#7199)
- [ci] enforce 'zizmor' checks in CI @jameslamb (#7218)
- [ci]: Bump actions/download-artifact from 8.0.0 to 8.0.1 in the ci-dependencies group @dependabot[bot] (#7216)
- [python-package] standardize variable naming for evaluation results @jameslamb (#7163)
- [c++] remove unused ArrayArgs::CheckAllZero(), reduce macro scope in socket_wrapper @jameslamb (#7201)
- [R-package] deprecate lgb.interprete() @jameslamb (#7148)
- [python-package] Add tests on Booster.eval() handling of new validation sets @daguirre11 (#7167)
- [cmake] move cmake_minimum_required to first line @jameslamb (#7210)
- [ci] restore nightly-scipy testing, update nightly floors @jameslamb (#7213)
- [ci] [dask] restore testing against new dask versions, fix {fs} install (again) @jameslamb (#7211)
- [ci] install 'CMake' in R-package jobs for {fs} @jameslamb (#7209)
- [ci] pin GitHub Actions to commit SHAs @jameslamb (#7192)
- [docs] [ci] Update docs and source code for org change @jameslamb (#7188)
- [ci]: Bump the ci-dependencies group with 3 updates @dependabot[bot] (#7174)
- [python-package] fix test_numeric_split_direction to test all parameter combinations @wagner-austin (#7131)
- [python-package] Added test for plot_metric ylim @daguirre11 (#7164)
- [python-package] Added test for plot_split_value_histogram ylim @daguirre11 (#7165)
- [python-package] [ci] use 'auditwheel' to check GLIBC versions for Linux wheels, update wheel tags @jameslamb (#7134)
- [python-package] Add tests for some plotting functions @DeborahOlaboye (#7144)
- [ci]: Bump release-drafter/release-drafter from 6.1.0 to 6.2.0 in the ci-dependencies group @dependabot[bot] (#7146)
- [python-package] Added test for plot_importance(figsize) @daguirre11 (#7143)
- [python-package] Added test for plotting.ylim @daguirre11 (#7142)
- [python-package] use PEP 639 license metadata, bump to
scikit-build-core>=0.11.0, use hatchling instead of setuptools @jameslamb (#7135)
- [python-package] Add test for Booster.rollback_one_iter() @wagner-austin (#7133)
- [python-package] cast numpy integer to float in plot_importance ax.text call @wagner-austin (#7130)
- [python-package] enforce keyword-only args in more internal functions @jameslamb (#7111)
- [ci] fail linting CI job if PowerShell ScriptAnalyzer failed @StrikerRUS (#7127)
- [python-package] support all-0 sample weights in scikit-learn 1.9 @jameslamb (#7128)
- [python-package] Add return type annotations to predict methods in sklearn module @wagner-austin (#7116)
- [python-package] add Literal type annotation for order variable in _np2d_to_np1d @wagner-austin (#7118)
- [python-package] Add DTypeLike annotation to fix dtype assignment in _np2d_to_np1d @wagner-austin (#7117)
- [python-package] use positional args for np.arange in _InnerPredictor @wagner-austin (#7119)
- [python-package] Add TypeGuard return type to _is_pyarrow_table() for mypy type narrowing @wagner-austin (#7115)
- [ci]: Bump the ci-dependencies group with 3 updates @dependabot[bot] (#7120)
- [ci] update pre-commit hooks, fix typos @jameslamb (#7108)
- [ci] move GPU and NuGet jobs to GitHub Actions, remove Azure DevOps @jameslamb (#7106)
- [python-package] fix mypy errors about sklearn_tags() @jameslamb (#7107)
- [ci][tests] enable
test_int32_max_sparse_contribs back @StrikerRUS (#7104)
- [ci] move more Python jobs to GitHub Actions @jameslamb (#7096)
- [python-package] Add test for converting a
ctypes int64 pointer array to a NumPy array @nicklamiller (#7071)
- [ci]: Bump actions/checkout from 5 to 6 in the ci-dependencies group @dependabot[bot] (#7095)
- [ci] move creation of source archives to GitHub Actions @jameslamb (#7092)
- [ci] skip conda installation in swig jobs @StrikerRUS (#7097)
- [ci] move MPI jobs to GitHub Actions @jameslamb (#7089)
- [ci] display real OS name in action names @StrikerRUS (#7090)
- [ci] [R-package] implement efficiency suggestions from lintr 3.3.0-1 @jameslamb (#7091)
- [ci] move Windows Python jobs to GitHub Actions @jameslamb (#7086)
- [ci] resolve 'invalid spec' conda errors in Windows jobs @jameslamb (#7087)
- [ci] [c++] update macOS x86_64 jobs to macOS-15, used std::tolower() for case changes @jameslamb (#7083)
- [python-package] Added test for
plotting.xlim @daguirre11 (#7077)
- [ci] move macOS Python jobs to GitHub Actions @jameslamb (#7081)
- [ci] generate valgrind suppressions in logs @jameslamb (#7068)
- [ci] fix PR status checks for optional CI workflows @jameslamb (#7072)
- [ci]: Bump the ci-dependencies group with 2 updates @dependabot[bot] (#7076)
- [python-package][tests] enhance
test_set_field_none_removes_field test @StrikerRUS (#7044)
- [docs] [R-package] fix HTML generation errors in R docs, update to roxygen2 7.3.3 @jameslamb (#7074)
- [ci] use GitHub built-in token, switch comment-triggered jobs to workflow dispatch (fixes #7012) @jameslamb (#7035)
- [ci] move js and json linter
biome to pre-commit @StrikerRUS (#7059)
- [ci][c++] fixed
build/header_guard errors from cpplint @StrikerRUS (#7055)
- [ci] move mypy to pre-commit @StrikerRUS (#7062)
- [ci] Add sha of cpplint commit to
.git-blame-ignore-revs @StrikerRUS (#7061)
- [ci][cmake] make cmake-lint more strict @StrikerRUS (#7060)
- [ci][c++] fixed
whitespace/indent_namespace errors from cpplint @StrikerRUS (#7056)
- [ci][docs] use lychee GitHub actions for checking broken links @StrikerRUS (#7058)
- [c++][ci] fix
include_what_you_use errors from cpplint @StrikerRUS (#7052)
- [ci][docs] fix link checking action by switching from linkchecker to lychee and update some links @StrikerRUS (#7027)
- [ci] [swig] move SWIG jobs to GitHub Actions @jameslamb (#7024)
- [ci] move C++ test jobs to GitHub Actions @jameslamb (#7033)
- [ci] Revert fix recent conda and mamba matching error #7047 @StrikerRUS (#7049)
- [ci] update Ruff version in pre-commit @StrikerRUS (#7051)
- [ci] stop skipping Arrow test at Appveyor @StrikerRUS (#7050)
- [ci] move R-package artifact publishing to GitHub Actions @jameslamb (#7032)
- [ci] fix recent conda and mamba matching error @StrikerRUS (#7047)
- [R-package] small cleanup after R 3.x drop @StrikerRUS (#7043)
- [ci] update actions/checkout calls @jameslamb (#7037)
- [python-package] Add unit test for Dataset.set_field and no data @thomasjpfan (#7036)
- [ci] skip conda setup on cpp-tests jobs @jameslamb (#7029)
- [ci]: Bump actions/checkout from 4 to 5 in the ci-dependencies group @dependabot[bot] (#7019)
- [ci] separate configs and scripts for linting and docs CI @jameslamb (#7003)
- [python-package] Fix mypy checks in
engine.py @borchero (#6900)
- [ci] [c++] use 'pre-commit' to run 'cpplint', upgrade to 'cpplint' 2.0.2 @jameslamb (#7002)
- [ci] [python-package] work around missing pyarrow manylinux nightlies @jameslamb (#7004)
- [docs] [ci] automatically re-generate parameter docs via pre-commit @jameslamb (#7001)
- [ci] use 'pre-commit' to run 'rstcheck' @jameslamb (#6989)
- [ci] [python-package] skip ranking Dask tests on macOS @jameslamb (#6997)
- [ci] use 'pre-commit' to run 'cmakelint' @jameslamb (#6993)
- [ci] pin graphite2 in Python 3.9 environment @jameslamb (#6992)
- [ci] update pre-commit versions, add some pixi things to config files @jameslamb (#6986)
- [ci] combine pip installs in Python test scripts @jameslamb (#6981)
- [ci] [CUDA] Switch to GitHub runner for GPU CI @letmaik (#6958)
- [cpp] rename is_finished to produced_empty_tree in cpp and R code @StrikerRUS (#6970)
- [docs] [ci] skip scikit-learn 1.7.1 in docs build, make tests compatible with pandas 3.0, use new Azure DevOps pool @jameslamb (#6979)
- [ci] fix PowerShell linter @StrikerRUS (#6971)
- [ci][python-package] Enforce and fix ruff flake8-pytest-style (PT) linting codes @nicklamiller (#6959)
- [ci] stop testing on Windows Server 2019 @jameslamb (#6953)
- [python-package] Add specific error messages to
test_dask tests @nicklamiller (#6955)
- [ci] [R-package] Add period after specified linter names in
nolint comments @nicklamiller (#6950)
- [R-package] Add specific error messages to
test_Predictor and test_dataset @nicklamiller (#6931)
- [ci] update to 1ES image pool @shiyu1994 (#6866)
- [python-package] Add specific error messages to
test_sklearn @nicklamiller (#6929)
- [python-package] Add specific error messages to
test_plotting @nicklamiller (#6927)
- [python-package] Add more specific error messages to
test_engine @nicklamiller (#6926)
- [ci] skip NuGet creation @StrikerRUS (#6921)
- [python-package] Add specific error messages to
test_engine @nicklamiller (#6925)
- [python-package] Add specific error messages to
test_basic and test_dask tests @nicklamiller (#6893)
- [ci] skip self-hosted Linux CI jobs @jameslamb (#6919)
- [python-package] Add superfluous-else-raise (RET506) rule to Ruff @suk1yak1 (#6904)
- [python-package] Add specific error messages to some
test_basic tests @nicklamiller (#6887)
- [python-package] enforce keyword args in internal functions @jameslamb (#6858)
- [ci] [python-package] re-enable scikit-build-core binary stripping @jameslamb (#6872)
- [ci] build aarch64 wheel builds on a real aarch64 machine @jameslamb (#6843)
- [ci] consolidate R package installs into a CI script @jameslamb (#6808)
- [ci] [R-package] add CI job using clang-20 @jameslamb (#6837)
- bump development version to v4.6.0.99 @jameslamb (#6826)