From 05dc38fecee9e325738e97822145385d0d2be259 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Thu, 15 Feb 2024 14:59:21 +0100 Subject: [PATCH 01/11] REL scikit-learn 1.4.1.post1 (#28423) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Loïc Estève --- doc/templates/index.html | 2 +- doc/whats_new/v1.4.rst | 9 +++++++-- setup.py | 6 ++++++ sklearn/__init__.py | 2 +- 4 files changed, 15 insertions(+), 4 deletions(-) diff --git a/doc/templates/index.html b/doc/templates/index.html index 1b36022fc6adf..a085921fa760d 100644 --- a/doc/templates/index.html +++ b/doc/templates/index.html @@ -169,7 +169,7 @@

News

  • On-going development: scikit-learn 1.5 (Changelog)
  • -
  • February 2024. scikit-learn 1.4.1 is available for download (Changelog). +
  • February 2024. scikit-learn 1.4.1.post1 is available for download (Changelog).
  • January 2024. scikit-learn 1.4.0 is available for download (Changelog).
  • diff --git a/doc/whats_new/v1.4.rst b/doc/whats_new/v1.4.rst index 4f6b8d461dcd2..176504409fbc4 100644 --- a/doc/whats_new/v1.4.rst +++ b/doc/whats_new/v1.4.rst @@ -15,11 +15,16 @@ For a short description of the main highlights of the release, please refer to .. _changes_1_4_1: -Version 1.4.1 -============= +Version 1.4.1.post1 +=================== **February 2024** +.. note:: + The 1.4.1.post1 release includes a packaging fix requiring `numpy<2` to account for + incompatibilities with NumPy 2.0 ABI. Note that the 1.4.1 release is not available + on PyPI and conda-forge. + Metadata Routing ---------------- diff --git a/setup.py b/setup.py index bc1921a06ebb8..10296aed5f2eb 100755 --- a/setup.py +++ b/setup.py @@ -614,6 +614,12 @@ def setup_package(): }, ) + # Overwrite the dependencies to not allow for NumPy >= 2.0 + metadata["install_requires"] = [ + f"{dep},<2.0" if dep.startswith("numpy") else dep + for dep in metadata["install_requires"] + ] + commands = [arg for arg in sys.argv[1:] if not arg.startswith("-")] if not all( command in ("egg_info", "dist_info", "clean", "check") for command in commands diff --git a/sklearn/__init__.py b/sklearn/__init__.py index fcdfe5cb608b0..8bd976e6ccd29 100644 --- a/sklearn/__init__.py +++ b/sklearn/__init__.py @@ -42,7 +42,7 @@ # Dev branch marker is: 'X.Y.dev' or 'X.Y.devN' where N is an integer. # 'X.Y.dev0' is the canonical version of 'X.Y.dev' # -__version__ = "1.4.1" +__version__ = "1.4.1.post1" # On OSX, we can get a runtime error due to multiple OpenMP libraries loaded From 719c0c6036ac99d45ffb45ed7c8b4e4b221384b5 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Thu, 15 Feb 2024 15:00:08 +0100 Subject: [PATCH 02/11] [cd build][azure parallel] Trigger CI/CD From 6eff1757ec3698f7cc0b3cc1ed0aefd241529f8c Mon Sep 17 00:00:00 2001 From: Olivier Grisel Date: Fri, 16 Feb 2024 18:10:54 +0100 Subject: [PATCH 03/11] DOC update funders about page and index (#28436) Co-authored-by: Guillaume Lemaitre --- doc/about.rst | 74 ++++++++++++------ doc/images/probabl.png | Bin 0 -> 20223 bytes doc/templates/index.html | 1 + .../scikit-learn-modern/static/css/theme.css | 1 - 4 files changed, 51 insertions(+), 25 deletions(-) create mode 100644 doc/images/probabl.png diff --git a/doc/about.rst b/doc/about.rst index 2ef0718b92f7e..2a689646c1abb 100644 --- a/doc/about.rst +++ b/doc/about.rst @@ -154,6 +154,34 @@ The project would like to thank the following funders. ................................... + +.. raw:: html + +
    +
    + +`:probabl. `_ funds Adrin Jalali, Arturo Amor, +François Goupil, Guillaume Lemaitre, Jérémie du Boisberranger, Olivier Grisel, and +Stefanie Senger. + +.. raw:: html + +
    + +
    + +.. image:: images/probabl.png + :width: 75pt + :align: center + :target: https://probabl.ai + +.. raw:: html + +
    +
    + +.......... + .. raw:: html
    @@ -161,39 +189,39 @@ The project would like to thank the following funders. The `Members `_ of the `Scikit-Learn Consortium at Inria Foundation -`_ fund Arturo Amor, -François Goupil, Guillaume Lemaitre, Jérémie du Boisberranger, and Olivier Grisel. +`_ help at maintaining and +improving the project through their financial support. .. raw:: html
    .. |chanel| image:: images/chanel.png - :width: 70pt + :width: 55pt :target: https://www.chanel.com .. |axa| image:: images/axa.png - :width: 50pt + :width: 40pt :target: https://www.axa.fr/ .. |bnp| image:: images/bnp.png - :width: 150pt + :width: 120pt :target: https://www.bnpparibascardif.com/ .. |dataiku| image:: images/dataiku.png - :width: 70pt + :width: 55pt :target: https://www.dataiku.com/ .. |hf| image:: images/huggingface_logo-noborder.png - :width: 70pt + :width: 55pt :target: https://huggingface.co .. |nvidia| image:: images/nvidia.png - :width: 70pt + :width: 55pt :target: https://www.nvidia.com .. |inria| image:: images/inria-logo.jpg - :width: 100pt + :width: 75pt :target: https://www.inria.fr @@ -202,7 +230,7 @@ François Goupil, Guillaume Lemaitre, Jérémie du Boisberranger, and Olivier Gr
    .. table:: - :class: sk-sponsor-table align-default + :class: sk-sponsor-table +----------+-----------+ | |chanel| | @@ -255,7 +283,6 @@ and is part of the scikit-learn consortium at Inria.
    - .......... .. raw:: html @@ -263,8 +290,7 @@ and is part of the scikit-learn consortium at Inria.
    -`Hugging Face `_ funded Adrin Jalali in 2022, -2023 and is part of the scikit-learn consortium at Inria. +`Microsoft `_ funds Andreas Müller since 2020. .. raw:: html @@ -272,10 +298,10 @@ and is part of the scikit-learn consortium at Inria.
    -.. image:: images/huggingface_logo-noborder.png - :width: 55pt +.. image:: images/microsoft.png + :width: 100pt :align: center - :target: https://huggingface.co/ + :target: https://www.microsoft.com/ .. raw:: html @@ -289,7 +315,7 @@ and is part of the scikit-learn consortium at Inria.
    -`Microsoft `_ funds Andreas Müller since 2020. +`Quansight Labs `_ funds Lucy Liu since 2022. .. raw:: html @@ -297,25 +323,26 @@ and is part of the scikit-learn consortium at Inria.
    -.. image:: images/microsoft.png +.. image:: images/quansight-labs.png :width: 100pt :align: center - :target: https://www.microsoft.com/ + :target: https://labs.quansight.org .. raw:: html
    -........... +Past Sponsors +............. .. raw:: html
    -`Quansight Labs `_ funds Lucy Liu and -Meekail Zain since 2022 and funded Thomas J. Fan from 2021 to 2023. +`Quansight Labs `_ funded Meekail Zain in 2022 and 2023 and, +funded Thomas J. Fan from 2021 to 2023. .. raw:: html @@ -333,8 +360,7 @@ Meekail Zain since 2022 and funded Thomas J. Fan from 2021 to 2023.
    -Past Sponsors -............. +........... .. raw:: html diff --git a/doc/images/probabl.png b/doc/images/probabl.png new file mode 100644 index 0000000000000000000000000000000000000000..aab532ba62d95c1c03fe573e5176f6bae4182bc4 GIT binary patch literal 20223 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 uses scikit-learn?

    scikit-learn development and maintenance are financially supported by

    + diff --git a/doc/themes/scikit-learn-modern/static/css/theme.css b/doc/themes/scikit-learn-modern/static/css/theme.css index 31697578f84e0..774c25f18e7cc 100644 --- a/doc/themes/scikit-learn-modern/static/css/theme.css +++ b/doc/themes/scikit-learn-modern/static/css/theme.css @@ -1001,7 +1001,6 @@ table.docutils { margin-bottom: 1rem; line-height: 1rem; max-width: 100%; - display: block; overflow-x: auto; } From a9547207c480767fbe75b374de007a3b45778a59 Mon Sep 17 00:00:00 2001 From: "Thomas J. Fan" Date: Mon, 19 Feb 2024 02:29:04 -0500 Subject: [PATCH 04/11] CI Adds environment to upload_anaconda (#28441) (#28444) --- .github/workflows/wheels.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/wheels.yml b/.github/workflows/wheels.yml index 9e8d1f9566f18..6d0e2eb06106e 100644 --- a/.github/workflows/wheels.yml +++ b/.github/workflows/wheels.yml @@ -221,6 +221,7 @@ jobs: upload_anaconda: name: Upload to Anaconda runs-on: ubuntu-latest + environment: upload_anaconda needs: [build_wheels, build_sdist] # The artifacts cannot be uploaded on PRs if: github.event_name != 'pull_request' From d139ff234b0f8ec30287e26e0bc801bdafdfbb1a Mon Sep 17 00:00:00 2001 From: "Thomas J. Fan" Date: Mon, 19 Feb 2024 11:31:36 -0500 Subject: [PATCH 05/11] CI Adds environment for publishing to pypi (#28445) (#28466) --- .github/workflows/publish_pypi.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish_pypi.yml b/.github/workflows/publish_pypi.yml index 826aa0ed8a4b1..98ff6881ac368 100644 --- a/.github/workflows/publish_pypi.yml +++ b/.github/workflows/publish_pypi.yml @@ -13,6 +13,7 @@ on: jobs: publish: runs-on: ubuntu-latest + environment: publish_pypi permissions: # IMPORTANT: this permission is mandatory for trusted publishing id-token: write From 92c9b1866fab77412d8fe93cb3716c03d80ad8ed Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Tue, 20 Feb 2024 18:11:48 +0100 Subject: [PATCH 06/11] MAINT make sure canonical link is https://scikit-learn.org (#28487) --- .github/PULL_REQUEST_TEMPLATE.md | 2 +- CONTRIBUTING.md | 6 +++--- doc/README.md | 6 +++--- doc/themes/scikit-learn-modern/layout.html | 4 ++-- doc/whats_new/older_versions.rst | 8 ++++---- sklearn/__init__.py | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8528d5386b58a..f59f9bc2fbcd7 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -26,7 +26,7 @@ review, either the pull request needs some benchmarking, tinkering, convincing, etc. or more likely the reviewers are simply busy. In either case, we ask for your understanding during the review process. For more information, see our FAQ on this topic: -http://scikit-learn.org/dev/faq.html#why-is-my-pull-request-not-getting-any-attention. +https://scikit-learn.org/dev/faq.html#why-is-my-pull-request-not-getting-any-attention. Thanks for contributing! --> diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f6f65883c65b2..92a673462e3a6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -18,7 +18,7 @@ Documentation can be found under the But there are many other ways to help. In particular answering queries on the [issue tracker](https://github.com/scikit-learn/scikit-learn/issues), investigating bugs, and [reviewing other developers' pull -requests](http://scikit-learn.org/dev/developers/contributing.html#code-review-guidelines) +requests](https://scikit-learn.org/dev/developers/contributing.html#code-review-guidelines) are very valuable contributions that decrease the burden on the project maintainers. @@ -30,8 +30,8 @@ link to it from your website, or simply star it in GitHub to say "I use it". Quick links ----------- -* [Submitting a bug report or feature request](http://scikit-learn.org/dev/developers/contributing.html#submitting-a-bug-report-or-a-feature-request) -* [Contributing code](http://scikit-learn.org/dev/developers/contributing.html#contributing-code) +* [Submitting a bug report or feature request](https://scikit-learn.org/dev/developers/contributing.html#submitting-a-bug-report-or-a-feature-request) +* [Contributing code](https://scikit-learn.org/dev/developers/contributing.html#contributing-code) * [Coding guidelines](https://scikit-learn.org/dev/developers/develop.html#coding-guidelines) * [Tips to read current code](https://scikit-learn.org/dev/developers/contributing.html#reading-the-existing-code-base) diff --git a/doc/README.md b/doc/README.md index 8cace706efd35..537ed85006006 100644 --- a/doc/README.md +++ b/doc/README.md @@ -1,6 +1,6 @@ # Documentation for scikit-learn This directory contains the full manual and website as displayed at -http://scikit-learn.org. See -http://scikit-learn.org/dev/developers/contributing.html#documentation for -detailed information about the documentation. +https://scikit-learn.org. See +https://scikit-learn.org/dev/developers/contributing.html#documentation for +detailed information about the documentation. diff --git a/doc/themes/scikit-learn-modern/layout.html b/doc/themes/scikit-learn-modern/layout.html index 779435323be20..c95184d42c671 100644 --- a/doc/themes/scikit-learn-modern/layout.html +++ b/doc/themes/scikit-learn-modern/layout.html @@ -20,7 +20,7 @@ {% block htmltitle %} {{ title|striptags|e }}{{ titlesuffix }} {% endblock %} - + {% if favicon_url %} @@ -69,7 +69,7 @@ {%- endif %} diff --git a/doc/whats_new/older_versions.rst b/doc/whats_new/older_versions.rst index 2765e80c27c76..f4e1d1c0cdf10 100644 --- a/doc/whats_new/older_versions.rst +++ b/doc/whats_new/older_versions.rst @@ -1124,7 +1124,7 @@ Changelog --------- - New `stochastic gradient - `_ descent + `_ descent module by Peter Prettenhofer. The module comes with complete documentation and examples. @@ -1256,9 +1256,9 @@ Documentation - Improved documentation for many modules, now separating narrative documentation from the class reference. As an example, see `documentation for the SVM module - `_ and the + `_ and the complete `class reference - `_. + `_. Fixes ----- @@ -1280,7 +1280,7 @@ Examples :ref:`sphx_glr_auto_examples_text_plot_document_classification_20newsgroups.py` - Many more examples. `See here - `_ + `_ the full list of examples. diff --git a/sklearn/__init__.py b/sklearn/__init__.py index 8bd976e6ccd29..8c674b3635181 100644 --- a/sklearn/__init__.py +++ b/sklearn/__init__.py @@ -14,7 +14,7 @@ # that are accessible to everybody and reusable in various contexts: # machine-learning as a versatile tool for science and engineering. # -# See http://scikit-learn.org for complete documentation. +# See https://scikit-learn.org for complete documentation. import logging import os From 5c4aa5d0d90ba66247d675d4c3fc2fdfba3c39ff Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Thu, 22 Feb 2024 16:41:00 +0100 Subject: [PATCH 07/11] DOC: improve plot_compare_calibration.py (#28231) Co-authored-by: Olivier Grisel Co-authored-by: Thomas J. Fan Co-authored-by: Christian Lorentzen Co-authored-by: Adrin Jalali --- .../calibration/plot_compare_calibration.py | 169 +++++++++++++----- 1 file changed, 120 insertions(+), 49 deletions(-) diff --git a/examples/calibration/plot_compare_calibration.py b/examples/calibration/plot_compare_calibration.py index b2ec219c9ca1c..389e231c8f07c 100644 --- a/examples/calibration/plot_compare_calibration.py +++ b/examples/calibration/plot_compare_calibration.py @@ -26,8 +26,14 @@ # We will use a synthetic binary classification dataset with 100,000 samples # and 20 features. Of the 20 features, only 2 are informative, 2 are # redundant (random combinations of the informative features) and the -# remaining 16 are uninformative (random numbers). Of the 100,000 samples, -# 100 will be used for model fitting and the remaining for testing. +# remaining 16 are uninformative (random numbers). +# +# Of the 100,000 samples, 100 will be used for model fitting and the remaining +# for testing. Note that this split is quite unusual: the goal is to obtain +# stable calibration curve estimates for models that are potentially prone to +# overfitting. In practice, one should rather use cross-validation with more +# balanced splits but this would make the code of this example more complicated +# to follow. from sklearn.datasets import make_classification from sklearn.model_selection import train_test_split @@ -86,17 +92,26 @@ def predict_proba(self, X): from sklearn.calibration import CalibrationDisplay from sklearn.ensemble import RandomForestClassifier -from sklearn.linear_model import LogisticRegression +from sklearn.linear_model import LogisticRegressionCV from sklearn.naive_bayes import GaussianNB -# Create classifiers -lr = LogisticRegression() +# Define the classifiers to be compared in the study. +# +# Note that we use a variant of the logistic regression model that can +# automatically tune its regularization parameter. +# +# For a fair comparison, we should run a hyper-parameter search for all the +# classifiers but we don't do it here for the sake of keeping the example code +# concise and fast to execute. +lr = LogisticRegressionCV( + Cs=np.logspace(-6, 6, 101), cv=10, scoring="neg_log_loss", max_iter=1_000 +) gnb = GaussianNB() svc = NaivelyCalibratedLinearSVC(C=1.0, dual="auto") -rfc = RandomForestClassifier() +rfc = RandomForestClassifier(random_state=42) clf_list = [ - (lr, "Logistic"), + (lr, "Logistic Regression"), (gnb, "Naive Bayes"), (svc, "SVC"), (rfc, "Random forest"), @@ -150,60 +165,116 @@ def predict_proba(self, X): plt.show() # %% -# :class:`~sklearn.linear_model.LogisticRegression` returns well calibrated -# predictions as it directly optimizes log-loss. In contrast, the other methods -# return biased probabilities, with different biases for each method: # -# * :class:`~sklearn.naive_bayes.GaussianNB` tends to push -# probabilities to 0 or 1 (see histogram). This is mainly -# because the naive Bayes equation only provides correct estimate of +# Analysis of the results +# ----------------------- +# +# :class:`~sklearn.linear_model.LogisticRegressionCV` returns reasonably well +# calibrated predictions despite the small training set size: its reliability +# curve is the closest to the diagonal among the four models. +# +# Logistic regression is trained by minimizing the log-loss which is a strictly +# proper scoring rule: in the limit of infinite training data, strictly proper +# scoring rules are minimized by the model that predicts the true conditional +# probabilities. That (hypothetical) model would therefore be perfectly +# calibrated. However, using a proper scoring rule as training objective is not +# sufficient to guarantee a well-calibrated model by itself: even with a very +# large training set, logistic regression could still be poorly calibrated, if +# it was too strongly regularized or if the choice and preprocessing of input +# features made this model mis-specified (e.g. if the true decision boundary of +# the dataset is a highly non-linear function of the input features). +# +# In this example the training set was intentionally kept very small. In this +# setting, optimizing the log-loss can still lead to poorly calibrated models +# because of overfitting. To mitigate this, the +# :class:`~sklearn.linear_model.LogisticRegressionCV` class was configured to +# tune the `C` regularization parameter to also minimize the log-loss via inner +# cross-validation so as to find the best compromise for this model in the +# small training set setting. +# +# Because of the finite training set size and the lack of guarantee for +# well-specification, we observe that the calibration curve of the logistic +# regression model is close but not perfectly on the diagonal. The shape of the +# calibration curve of this model can be interpreted as slightly +# under-confident: the predicted probabilities are a bit too close to 0.5 +# compared to the true fraction of positive samples. +# +# The other methods all output less well calibrated probabilities: +# +# * :class:`~sklearn.naive_bayes.GaussianNB` tends to push probabilities to 0 +# or 1 (see histogram) on this particular dataset (over-confidence). This is +# mainly because the naive Bayes equation only provides correct estimate of # probabilities when the assumption that features are conditionally -# independent holds [2]_. However, features tend to be positively correlated -# and is the case with this dataset, which contains 2 features -# generated as random linear combinations of the informative features. These -# correlated features are effectively being 'counted twice', resulting in -# pushing the predicted probabilities towards 0 and 1 [3]_. -# -# * :class:`~sklearn.ensemble.RandomForestClassifier` shows the opposite -# behavior: the histograms show peaks at approx. 0.2 and 0.9 probability, -# while probabilities close to 0 or 1 are very rare. An explanation for this -# is given by Niculescu-Mizil and Caruana [1]_: "Methods such as bagging and -# random forests that average predictions from a base set of models can have -# difficulty making predictions near 0 and 1 because variance in the -# underlying base models will bias predictions that should be near zero or -# one away from these values. Because predictions are restricted to the -# interval [0,1], errors caused by variance tend to be one- sided near zero -# and one. For example, if a model should predict p = 0 for a case, the only -# way bagging can achieve this is if all bagged trees predict zero. If we add -# noise to the trees that bagging is averaging over, this noise will cause -# some trees to predict values larger than 0 for this case, thus moving the -# average prediction of the bagged ensemble away from 0. We observe this -# effect most strongly with random forests because the base-level trees -# trained with random forests have relatively high variance due to feature -# subsetting." As a result, the calibration curve shows a characteristic -# sigmoid shape, indicating that the classifier is under-confident -# and could return probabilities closer to 0 or 1. -# -# * To show the performance of :class:`~sklearn.svm.LinearSVC`, we naively -# scale the output of the :term:`decision_function` into [0, 1] by applying -# min-max scaling, since SVC does not output probabilities by default. -# :class:`~sklearn.svm.LinearSVC` shows an -# even more sigmoid curve than the -# :class:`~sklearn.ensemble.RandomForestClassifier`, which is typical for -# maximum-margin methods [1]_ as they focus on difficult to classify samples -# that are close to the decision boundary (the support vectors). +# independent holds [2]_. However, features can be correlated and this is the case +# with this dataset, which contains 2 features generated as random linear +# combinations of the informative features. These correlated features are +# effectively being 'counted twice', resulting in pushing the predicted +# probabilities towards 0 and 1 [3]_. Note, however, that changing the seed +# used to generate the dataset can lead to widely varying results for the +# naive Bayes estimator. +# +# * :class:`~sklearn.svm.LinearSVC` is not a natural probabilistic classifier. +# In order to interpret its prediction as such, we naively scaled the output +# of the :term:`decision_function` into [0, 1] by applying min-max scaling in +# the `NaivelyCalibratedLinearSVC` wrapper class defined above. This +# estimator shows a typical sigmoid-shaped calibration curve on this data: +# predictions larger than 0.5 correspond to samples with an even larger +# effective positive class fraction (above the diagonal), while predictions +# below 0.5 corresponds to even lower positive class fractions (below the +# diagonal). This under-confident predictions are typical for maximum-margin +# methods [1]_. +# +# * :class:`~sklearn.ensemble.RandomForestClassifier`'s prediction histogram +# shows peaks at approx. 0.2 and 0.9 probability, while probabilities close to +# 0 or 1 are very rare. An explanation for this is given by [1]_: +# "Methods such as bagging and random forests that average +# predictions from a base set of models can have difficulty making +# predictions near 0 and 1 because variance in the underlying base models +# will bias predictions that should be near zero or one away from these +# values. Because predictions are restricted to the interval [0, 1], errors +# caused by variance tend to be one-sided near zero and one. For example, if +# a model should predict p = 0 for a case, the only way bagging can achieve +# this is if all bagged trees predict zero. If we add noise to the trees that +# bagging is averaging over, this noise will cause some trees to predict +# values larger than 0 for this case, thus moving the average prediction of +# the bagged ensemble away from 0. We observe this effect most strongly with +# random forests because the base-level trees trained with random forests +# have relatively high variance due to feature subsetting." This effect can +# make random forests under-confident. Despite this possible bias, note that +# the trees themselves are fit by minimizing either the Gini or Entropy +# criterion, both of which lead to splits that minimize proper scoring rules: +# the Brier score or the log-loss respectively. See :ref:`the user guide +# ` for more details. This can explain why +# this model shows a good enough calibration curve on this particular example +# dataset. Indeed the Random Forest model is not significantly more +# under-confident than the Logistic Regression model. +# +# Feel free to re-run this example with different random seeds and other +# dataset generation parameters to see how different the calibration plots can +# look. In general, Logistic Regression and Random Forest will tend to be the +# best calibrated classifiers, while SVC will often display the typical +# under-confident miscalibration. The naive Bayes model is also often poorly +# calibrated but the general shape of its calibration curve can vary widely +# depending on the dataset. +# +# Finally, note that for some dataset seeds, all models are poorly calibrated, +# even when tuning the regularization parameter as above. This is bound to +# happen when the training size is too small or when the model is severely +# misspecified. # # References # ---------- # # .. [1] `Predicting Good Probabilities with Supervised Learning -# `_, -# A. Niculescu-Mizil & R. Caruana, ICML 2005 +# `_, A. +# Niculescu-Mizil & R. Caruana, ICML 2005 +# # .. [2] `Beyond independence: Conditions for the optimality of the simple # bayesian classifier # `_ # Domingos, P., & Pazzani, M., Proc. 13th Intl. Conf. Machine Learning. # 1996. +# # .. [3] `Obtaining calibrated probability estimates from decision trees and # naive Bayesian classifiers # `_ From f07e0138bfee41cd2c0a5d0251dc3fe03e6e1084 Mon Sep 17 00:00:00 2001 From: Guillaume Lemaitre Date: Thu, 14 Mar 2024 17:20:45 +0100 Subject: [PATCH 08/11] DOC fix align table in API doc page (#28600) (#28627) --- doc/themes/scikit-learn-modern/static/css/theme.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/themes/scikit-learn-modern/static/css/theme.css b/doc/themes/scikit-learn-modern/static/css/theme.css index 774c25f18e7cc..bd447d88e0b3b 100644 --- a/doc/themes/scikit-learn-modern/static/css/theme.css +++ b/doc/themes/scikit-learn-modern/static/css/theme.css @@ -1001,6 +1001,7 @@ table.docutils { margin-bottom: 1rem; line-height: 1rem; max-width: 100%; + display: block; overflow-x: auto; } @@ -1319,6 +1320,10 @@ div.sk-sponsor-div-box, div.sk-testimonial-div-box { } } +div.sk-sponsor-div-box table.sk-sponsor-table { + display: table; +} + table.sk-sponsor-table tr, table.sk-sponsor-table tr:nth-child(odd) { border-style: none; background-color: white; From d675b8dd7b671a57c9143b665c41c9e15fd24a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20du=20Boisberranger?= Date: Tue, 9 Apr 2024 16:02:00 +0200 Subject: [PATCH 09/11] Release 1.4.2 (#28774) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Guillaume Lemaitre Co-authored-by: Loïc Estève --- doc/templates/index.html | 2 ++ doc/whats_new/v1.4.rst | 9 +++++++++ pyproject.toml | 2 +- setup.py | 6 ------ sklearn/__init__.py | 2 +- sklearn/preprocessing/_label.py | 2 +- sklearn/preprocessing/tests/test_data.py | 8 +++++++- sklearn/utils/fixes.py | 7 +++++-- sklearn/utils/tests/test_validation.py | 1 - 9 files changed, 26 insertions(+), 13 deletions(-) diff --git a/doc/templates/index.html b/doc/templates/index.html index 85f286520a7ba..ad54eb877c413 100644 --- a/doc/templates/index.html +++ b/doc/templates/index.html @@ -169,6 +169,8 @@

    News

  • On-going development: scikit-learn 1.5 (Changelog)
  • +
  • April 2024. scikit-learn 1.4.2 is available for download (Changelog). +
  • February 2024. scikit-learn 1.4.1.post1 is available for download (Changelog).
  • January 2024. scikit-learn 1.4.0 is available for download (Changelog). diff --git a/doc/whats_new/v1.4.rst b/doc/whats_new/v1.4.rst index 176504409fbc4..c41476a8ff91b 100644 --- a/doc/whats_new/v1.4.rst +++ b/doc/whats_new/v1.4.rst @@ -13,6 +13,15 @@ For a short description of the main highlights of the release, please refer to .. include:: changelog_legend.inc +.. _changes_1_4_2: + +Version 1.4.2 +============= + +**April 2024** + +This release only includes support for numpy 2. + .. _changes_1_4_1: Version 1.4.1.post1 diff --git a/pyproject.toml b/pyproject.toml index d55bf62b55ed0..815402cc4f783 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ requires = [ "setuptools", "wheel", "Cython>=3.0.8", - "numpy>=1.25", + "numpy==2.0.0rc1", "scipy>=1.6.0", ] diff --git a/setup.py b/setup.py index 10296aed5f2eb..bc1921a06ebb8 100755 --- a/setup.py +++ b/setup.py @@ -614,12 +614,6 @@ def setup_package(): }, ) - # Overwrite the dependencies to not allow for NumPy >= 2.0 - metadata["install_requires"] = [ - f"{dep},<2.0" if dep.startswith("numpy") else dep - for dep in metadata["install_requires"] - ] - commands = [arg for arg in sys.argv[1:] if not arg.startswith("-")] if not all( command in ("egg_info", "dist_info", "clean", "check") for command in commands diff --git a/sklearn/__init__.py b/sklearn/__init__.py index 8c674b3635181..069f3ad50b951 100644 --- a/sklearn/__init__.py +++ b/sklearn/__init__.py @@ -42,7 +42,7 @@ # Dev branch marker is: 'X.Y.dev' or 'X.Y.devN' where N is an integer. # 'X.Y.dev0' is the canonical version of 'X.Y.dev' # -__version__ = "1.4.1.post1" +__version__ = "1.4.2" # On OSX, we can get a runtime error due to multiple OpenMP libraries loaded diff --git a/sklearn/preprocessing/_label.py b/sklearn/preprocessing/_label.py index 41494f2649a01..bd009d52a6853 100644 --- a/sklearn/preprocessing/_label.py +++ b/sklearn/preprocessing/_label.py @@ -827,7 +827,7 @@ def fit_transform(self, y): class_mapping[:] = tmp self.classes_, inverse = np.unique(class_mapping, return_inverse=True) # ensure yt.indices keeps its current dtype - yt.indices = np.array(inverse[yt.indices], dtype=yt.indices.dtype, copy=False) + yt.indices = np.asarray(inverse[yt.indices], dtype=yt.indices.dtype) if not self.sparse_output: yt = yt.toarray() diff --git a/sklearn/preprocessing/tests/test_data.py b/sklearn/preprocessing/tests/test_data.py index 2896e729e970b..24d8ab2a36c3a 100644 --- a/sklearn/preprocessing/tests/test_data.py +++ b/sklearn/preprocessing/tests/test_data.py @@ -208,7 +208,13 @@ def test_standard_scaler_dtype(add_sample_weight, sparse_container): else: sample_weight = None with_mean = True - for dtype in [np.float16, np.float32, np.float64]: + if sparse_container is not None: + # scipy sparse containers do not support float16, see + # https://github.com/scipy/scipy/issues/7408 for more details. + supported_dtype = [np.float64, np.float32] + else: + supported_dtype = [np.float64, np.float32, np.float16] + for dtype in supported_dtype: X = rng.randn(n_samples, n_features).astype(dtype) if sparse_container is not None: X = sparse_container(X) diff --git a/sklearn/utils/fixes.py b/sklearn/utils/fixes.py index 2769e99b8619c..e97062390920d 100644 --- a/sklearn/utils/fixes.py +++ b/sklearn/utils/fixes.py @@ -256,14 +256,17 @@ def _sparse_nan_min_max(X, axis): from scipy.integrate import trapz as trapezoid # type: ignore # noqa -# TODO: Remove when Pandas > 2.2 is the minimum supported version +# TODO: Adapt when Pandas > 2.2 is the minimum supported version def pd_fillna(pd, frame): pd_version = parse_version(pd.__version__).base_version if parse_version(pd_version) < parse_version("2.2"): frame = frame.fillna(value=np.nan) else: + infer_objects_kwargs = ( + {} if parse_version(pd_version) >= parse_version("3") else {"copy": False} + ) with pd.option_context("future.no_silent_downcasting", True): - frame = frame.fillna(value=np.nan).infer_objects(copy=False) + frame = frame.fillna(value=np.nan).infer_objects(**infer_objects_kwargs) return frame diff --git a/sklearn/utils/tests/test_validation.py b/sklearn/utils/tests/test_validation.py index 292c2cbbde95d..0cd65685c0a85 100644 --- a/sklearn/utils/tests/test_validation.py +++ b/sklearn/utils/tests/test_validation.py @@ -1632,7 +1632,6 @@ def test_check_pandas_sparse_invalid(ntype1, ntype2): "ntype1, ntype2, expected_subtype", [ ("double", "longdouble", np.floating), - ("float16", "half", np.floating), ("single", "float32", np.floating), ("double", "float64", np.floating), ("int8", "byte", np.integer), From 8721245511de2f225ff5f9aa5f5fadce663cd4a3 Mon Sep 17 00:00:00 2001 From: jeremie du boisberranger Date: Tue, 9 Apr 2024 16:10:54 +0200 Subject: [PATCH 10/11] Release 1.4.2 [cd build] From 08c266da4f0c22b5dfa29c9d27510fc282590d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Est=C3=A8ve?= Date: Wed, 18 Dec 2024 17:31:33 +0100 Subject: [PATCH 11/11] MNT Fetch script from main branch in lint.yml (#30505) --- .github/workflows/lint.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 52ce1c4906765..84d7584041c70 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -31,6 +31,7 @@ jobs: - name: Install dependencies run: | + curl https://raw.githubusercontent.com/${{ github.repository }}/main/build_tools/shared.sh --retry 5 -o ./build_tools/shared.sh source build_tools/shared.sh # Include pytest compatibility with mypy pip install pytest ruff $(get_dep mypy min) $(get_dep black min) cython-lint