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 #6204 (@maxzw @detrin @jmoralez @lcrmorin @Ic3fr0g @MarcoGorelli @kylebarron @vyasr).
Significantly improved GPU support including the first ROCm builds (#6086) and multi-GPU support for NVIDIA GPUs via NCCL (#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.
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.daskon 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
constmodifier 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, andregression_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 valueis_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, usehatchlinginstead ofsetuptools@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_contribsback @StrikerRUS (#7104) - [ci] move more Python jobs to GitHub Actions @jameslamb (#7096)
- [python-package] Add test for converting a
ctypesint64 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_fieldtest @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
biometo pre-commit @StrikerRUS (#7059) - [ci][c++] fixed
build/header_guarderrors 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_namespaceerrors from cpplint @StrikerRUS (#7056) - [ci][docs] use lychee GitHub actions for checking broken links @StrikerRUS (#7058)
- [c++][ci] fix
include_what_you_useerrors 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_dasktests @nicklamiller (#6955) - [ci] [R-package] Add period after specified linter names in
nolintcomments @nicklamiller (#6950) - [R-package] Add specific error messages to
test_Predictorandtest_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_basicandtest_dasktests @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_basictests @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)