Spec-Zone.ru › scikit-learn

Примечание

Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через JupyterLite или Binder.

Основные новшества scikit-learn 1.8

Мы рады объявить о выпуске scikit-learn 1.8! В эту версию вошло множество исправлений ошибок и улучшений, а также несколько важных новых возможностей. Ниже мы расскажем об основных новшествах этого выпуска. Полный список всех изменений см. в примечаниях к выпуску.

Чтобы установить последнюю версию с помощью pip:

pip install --upgrade scikit-learn

или с помощью conda:

conda install -c conda-forge scikit-learn

Поддержка Array API (позволяет выполнять вычисления на GPU)

Постепенное внедрение стандарта Python Array API в scikit-learn означает, что входные массивы PyTorch и CuPy используются напрямую. Это позволяет использовать в оценщиках и функциях scikit-learn устройства, отличные от CPU, например GPU, для выполнения вычислений. В результате повышается производительность и упрощается интеграция с этими библиотеками.

В scikit-learn 1.8 поддержка входных данных, совместимых с Array API, была добавлена в несколько оценщиков и функций, например в тензоры PyTorch и массивы CuPy.

Поддержка Array API добавлена в следующие оценщики: preprocessing.StandardScaler, preprocessing.PolynomialFeatures, linear_model.RidgeCV, linear_model.RidgeClassifierCV, mixture.GaussianMixture и calibration.CalibratedClassifierCV.

Поддержка Array API также добавлена в несколько метрик модуля sklearn.metrics. Подробнее см. в разделе Поддержка входных данных, совместимых с Array API.

Инструкции по использованию scikit-learn с библиотеками, совместимыми с Array API, например PyTorch или CuPy, приведены на странице поддержки Array API. Примечание: поддержка Array API является экспериментальной и должна быть явно включена как в SciPy, так и в scikit-learn.

Ниже приведён фрагмент кода, который сначала использует препроцессор для создания признаков на CPU, а затем calibration.CalibratedClassifierCV и linear_model.RidgeCV совместно на GPU с помощью PyTorch:

ridge_pipeline_gpu = make_pipeline(
    # Ensure that all features (including categorical features) are preprocessed
    # on the CPU and mapped to a numerical representation.
    feature_preprocessor,
    # Move the results to the GPU and perform computations there
    FunctionTransformer(
        lambda x: torch.tensor(x.to_numpy().astype(np.float32), device="cuda"))
    ,
    CalibratedClassifierCV(
        RidgeClassifierCV(alphas=alphas), method="temperature"
    ),
)
with sklearn.config_context(array_api_dispatch=True):
    cv_results = cross_validate(ridge_pipeline_gpu, features, target)

Подробнее см. в полном блокноте в Google Colab. В этом конкретном примере использование GPU в Colab вместо одного ядра CPU ускоряет выполнение в 10 раз — это довольно типично для таких задач.

Поддержка свободнопоточного CPython 3.14

scikit-learn поддерживает свободнопоточный CPython; в частности, для всех поддерживаемых платформ доступны свободнопоточные колёса для Python 3.14.

Мы будем очень признательны за отзывы пользователей. Вот несколько вещей, которые можно попробовать:

  • установите свободнопоточный CPython 3.14, запустите свой скрипт scikit-learn и проверьте, не возникли ли неожиданные ошибки. Обратите внимание: настоятельно рекомендуется использовать CPython 3.14, а не 3.13, поскольку после выхода CPython 3.13 было исправлено несколько ошибок свободнопоточного режима.
  • если вы используете некоторые оценщики с параметром n_jobs, попробуйте изменить backend по умолчанию на threading с помощью joblib.parallel_config, как показано во фрагменте ниже. Это может ускорить выполнение кода, поскольку backend joblib по умолчанию использует процессы и создаёт большую нагрузку, чем потоки.

    grid_search = GridSearchCV(clf, param_grid=param_grid, n_jobs=4)
    with joblib.parallel_config(backend="threading"):
        grid_search.fit(X, y)
    
  • не стесняйтесь сообщать о любых проблемах или неожиданном поведении производительности, создав обращение на GitHub!

Свободнопоточный CPython (также известный как nogil) — это версия CPython, призванная обеспечить эффективное использование нескольких потоков за счёт удаления глобальной блокировки интерпретатора (GIL).

Подробнее о свободнопоточном CPython см. в документации py-free-threading, в частности в разделах об установке свободнопоточного CPython и отслеживания совместимости экосистемы.

В scikit-learn одна из целей свободнопоточного Python — эффективнее задействовать многоядерные CPU, используя потоки вместо подпроцессов для параллельных вычислений при передаче n_jobs>1 в функции или оценщики. Ожидается повышение эффективности за счёт устранения необходимости в межпроцессном взаимодействии. Учтите, что переключение backend joblib по умолчанию и проверка корректной работы всего кода со свободнопоточным Python — это продолжающаяся долгосрочная работа.

Масштабирование температуры в CalibratedClassifierCV

Калибровка вероятностей классификаторов с помощью масштабирования температуры доступна в calibration.CalibratedClassifierCV, если задать method="temperature". Этот метод особенно хорошо подходит для задач многоклассовой классификации, поскольку позволяет получить (более) точные калиброванные вероятности всего с одним свободным параметром. Это отличается от всех остальных доступных методов калибровки, в которых используется схема «один против остальных» и добавляются дополнительные параметры для каждого класса.

from sklearn.calibration import CalibratedClassifierCV
from sklearn.datasets import make_classification
from sklearn.naive_bayes import GaussianNB

X, y = make_classification(n_classes=3, n_informative=8, random_state=42)
clf = GaussianNB().fit(X, y)
sig = CalibratedClassifierCV(clf, method="sigmoid", ensemble=False).fit(X, y)
ts = CalibratedClassifierCV(clf, method="temperature", ensemble=False).fit(X, y)

В следующем примере показано, что при многоклассовой классификации с тремя классами масштабирование температуры может обеспечить более точные калиброванные вероятности, чем калибровка сигмоидой.

import matplotlib.pyplot as plt

from sklearn.calibration import CalibrationDisplay

fig, axes = plt.subplots(
    figsize=(8, 4.5),
    ncols=3,
    sharey=True,
)
for i, c in enumerate(ts.classes_):
    CalibrationDisplay.from_predictions(
        y == c, clf.predict_proba(X)[:, i], name="Uncalibrated", ax=axes[i], marker="s"
    )
    CalibrationDisplay.from_predictions(
        y == c,
        ts.predict_proba(X)[:, i],
        name="Temperature scaling",
        ax=axes[i],
        marker="o",
    )
    CalibrationDisplay.from_predictions(
        y == c, sig.predict_proba(X)[:, i], name="Sigmoid", ax=axes[i], marker="v"
    )
    axes[i].set_title(f"Class {c}")
    axes[i].set_xlabel(None)
    axes[i].set_ylabel(None)
    axes[i].get_legend().remove()
fig.suptitle("Reliability Diagrams per Class")
fig.supxlabel("Mean Predicted Probability")
fig.supylabel("Fraction of Class")
fig.legend(*axes[0].get_legend_handles_labels(), loc=(0.72, 0.5))
plt.subplots_adjust(right=0.7)
_ = fig.show()
Reliability Diagrams per Class, Class 0, Class 1, Class 2

Повышение эффективности линейных моделей

Время обучения оценщиков с квадратичной функцией потерь и штрафом L1 значительно сокращено: ElasticNet, Lasso, MultiTaskElasticNet, MultiTaskLasso и их варианты с кросс-валидацией. Сокращение времени обучения в основном достигнуто благодаря правилам безопасного отсева по разрыву. Они позволяют решателю координатного спуска заранее обнулять коэффициенты признаков и больше к ним не возвращаться. Чем сильнее штраф L1, тем раньше признаки можно исключить из дальнейшего обновления.

from time import time

from sklearn.datasets import make_regression
from sklearn.linear_model import ElasticNetCV

X, y = make_regression(n_features=10_000, random_state=0)
model = ElasticNetCV()
tic = time()
model.fit(X, y)
toc = time()
print(f"Fitting ElasticNetCV took {toc - tic:.3} seconds.")
Fitting ElasticNetCV took 14.3 seconds.

HTML-представление оценщиков

Гиперпараметры в раскрывающейся таблице HTML-представления теперь содержат ссылки на онлайн-документацию. Описания из docstring также отображаются в виде всплывающих подсказок при наведении.

from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

clf = make_pipeline(StandardScaler(), LogisticRegression(random_state=0, C=10))

Разверните схему оценщика ниже, щёлкнув «LogisticRegression», а затем «Parameters».

clf
Pipeline(steps=[('standardscaler', StandardScaler()),
                ('logisticregression',
                 LogisticRegression(C=10, random_state=0))])
В среде Jupyter повторно выполните эту ячейку, чтобы показать HTML-представление, или доверьте работу блокноту.
На GitHub HTML-представление отобразить невозможно; попробуйте открыть эту страницу на nbviewer.org.
Параметры
steps steps: список кортежей

Список кортежей (имя шага, оценщик), которые последовательно объединяются в конвейер. Для совместимости с API scikit-learn все шаги должны определять `fit`. Все шаги, кроме последнего, также должны определять `transform`. Подробнее см. в разделе :ref:`Объединение оценщиков <combining_estimators>`.
[('standardscaler', ...), ('logisticregression', ...)]
transform_input transform_input: список строк, по умолчанию None

Имена параметров :term:`метаданных`, которые конвейер должен преобразовать перед передачей шагу, который их использует.

Это позволяет преобразовывать некоторые входные аргументы `fit` (помимо `X`) с помощью шагов конвейера вплоть до шага, которому они необходимы. Требования задаются с помощью :ref:`маршрутизации метаданных <metadata_routing>`.
Например, это можно использовать для передачи валидационного набора через конвейер.

Этот параметр можно задать, только если включена маршрутизация метаданных. Её можно включить с помощью ``sklearn.set_config(enable_metadata_routing=True)``.

.. versionadded:: 1.6
None
memory memory: строка или объект с интерфейсом joblib.Memory, по умолчанию None

Используется для кэширования обученных преобразователей конвейера. Последний шаг никогда не кэшируется, даже если это преобразователь. По умолчанию кэширование не выполняется. Если задана строка, она задаёт путь к каталогу кэша. При включении кэширования перед обучением создаются копии преобразователей. Поэтому проверить непосредственно экземпляр преобразователя, переданный конвейеру, невозможно. Используйте атрибут `named_steps` или `steps`, чтобы просмотреть оценщики в конвейере. Кэширование преобразователей полезно, если обучение занимает много времени. Пример включения кэширования см. в разделе :ref:`sphx_glr_auto_examples_neighbors_plot_caching_nearest_neighbors.py`.
None
verbose verbose: bool, по умолчанию False

Если значение True, по завершении каждого шага выводится время, затраченное на его обучение.
False
Параметры
copy copy: bool, по умолчанию True

Если значение False, выполняется попытка избежать копирования и масштабировать данные на месте.
Это не всегда возможно; например, если данные представлены не массивом NumPy или разреженной матрицей scipy.sparse CSR, всё равно может быть возвращена копия.
True
with_mean with_mean: bool, по умолчанию True

Если значение True, перед масштабированием данные центрируются.
Для разреженных матриц это не работает и приводит к исключению, поскольку центрирование требует создания плотной матрицы, которая в типичных случаях может оказаться слишком большой для размещения в памяти.
True
with_std with_std: bool, по умолчанию True

Если значение True, данные масштабируются до единичной дисперсии (или, что эквивалентно, единичного стандартного отклонения).
True
Параметры
C C: float, по умолчанию 1.0

Обратная сила регуляризации; должно быть положительным числом с плавающей точкой.
Как и в методе опорных векторов, меньшие значения задают более сильную регуляризацию. `C=np.inf` соответствует логистической регрессии без штрафа.
Наглядный пример влияния настройки параметра `C` при штрафе L1 см. в разделе
:ref:`sphx_glr_auto_examples_linear_model_plot_logistic_path.py`.
10
random_state random_state: int, экземпляр RandomState, по умолчанию None

Используется для перемешивания данных, если ``solver`` равен 'sag', 'saga' или 'liblinear'. Подробности см. в :term:`глоссарии <random_state>`.
0
penalty penalty: {'l1', 'l2', 'elasticnet', None}, по умолчанию 'l2'

Задаёт норму штрафа:

- `None`: штраф не добавляется;
- `'l2'`: добавляется штраф L2; это значение используется по умолчанию;
- `'l1'`: добавляется штраф L1;
- `'elasticnet'`: добавляются штрафы L1 и L2.

.. warning::
Некоторые штрафы несовместимы с некоторыми решателями. Сведения о совместимости штрафов и решателей см. в описании параметра
`solver` ниже.

.. versionadded:: 0.19
Штраф L1 с решателем SAGA (поддерживает 'multinomial' + L1)

.. deprecated:: 1.8
Параметр `penalty` объявлен устаревшим в версии 1.8 и будет удалён в версии 1.10.
Вместо него используйте `l1_ratio` и `C`: `l1_ratio=0` для `penalty='l2'`,
`l1_ratio=1` для `penalty='l1'`, любое значение `l1_ratio` от 0 до 1
для `penalty='elasticnet'` и `C=np.inf` для `penalty=None`.
'deprecated'
l1_ratio l1_ratio: float, по умолчанию 0.0

Параметр смешивания Elastic-Net, для которого выполняется `0 <= l1_ratio <= 1`. Значение
`l1_ratio=1` задаёт чистый штраф L1, а `l1_ratio=0` — чистый штраф L2.
Любое значение от 0 до 1 задаёт штраф Elastic-Net вида
`l1_ratio * L1 + (1 - l1_ratio) * L2`.

.. warning::
Некоторые значения `l1_ratio` (то есть некоторые штрафы) могут быть несовместимы с отдельными
решателями. Сведения о совместимости штрафов и решателей см. в описании параметра `solver` ниже.

.. versionchanged:: 1.8
Значение по умолчанию изменено с None на 0.0.

.. deprecated:: 1.8
Значение `None` объявлено устаревшим и будет удалено в версии 1.10. Для задания типа штрафа всегда используйте
`l1_ratio`.
0.0
dual dual: bool, по умолчанию False

Двойственная (с ограничениями) или прямая (регуляризованная, см. также
:ref:`это уравнение <regularized-logistic-loss>`) формулировка. Двойственная формулировка
реализована только для штрафа L2 с решателем liblinear. При n_samples > n_features предпочтительно задавать `dual=False`.
False
tol tol: float, по умолчанию 1e-4

Допуск для критерия остановки.
0.0001
fit_intercept fit_intercept: bool, по умолчанию True

Указывает, следует ли добавлять в функцию принятия решения константу (смещение или свободный член).
True
intercept_scaling intercept_scaling: float, по умолчанию 1

Используется только при решателе `liblinear`
и значении `True` параметра `self.fit_intercept`. В этом случае `x` становится
`[x, self.intercept_scaling]`,
то есть к вектору экземпляра добавляется «синтетический» признак с постоянным значением
`intercept_scaling`.
Свободный член становится равен
``intercept_scaling * synthetic_feature_weight``.

.. note::
Вес синтетического признака подвергается штрафу L1 или L2, как и все остальные признаки.
Чтобы уменьшить влияние регуляризации на вес синтетического признака
(и, следовательно, на свободный член), необходимо увеличить `intercept_scaling`.
1
class_weight class_weight: словарь или 'balanced', по умолчанию None

Веса классов в формате ``{class_label: weight}``.
Если параметр не задан, предполагается, что вес всех классов равен единице.

Режим "balanced" использует значения y для автоматической настройки весов, обратно пропорциональных частоте классов во входных данных,
по формуле ``n_samples / (n_classes * np.bincount(y))``.

Если задан sample_weight, эти веса будут перемножены с ним (переданным методу fit).

.. versionadded:: 0.17
*class_weight='balanced'*
None
solver solver: {'lbfgs', 'liblinear', 'newton-cg', 'newton-cholesky', 'sag', 'saga'}, по умолчанию 'lbfgs'

Алгоритм для задачи оптимизации. По умолчанию используется 'lbfgs'.
При выборе решателя следует учитывать следующие аспекты:

- 'lbfgs' — хороший решатель по умолчанию, поскольку он достаточно хорошо работает для широкого
круга задач.
- Для задач :term:`многоклассовой классификации` (`n_classes >= 3`) все решатели, кроме
'liblinear', минимизируют полную мультиномиальную функцию потерь; 'liblinear' выдаст
ошибку.
- 'newton-cholesky' хорошо подходит, если
`n_samples` >> `n_features * n_classes`, особенно для категориальных признаков с редкими категориями, закодированных методом one-hot.
Учтите, что использование памяти этим решателем квадратично зависит от `n_features * n_classes`,
поскольку он явно вычисляет полную матрицу Гессе.
- Для небольших наборов данных хорошо подходит 'liblinear', тогда как 'sag'
и 'saga' работают быстрее на больших наборах;
- 'liblinear' по умолчанию поддерживает только бинарную классификацию. Чтобы применить схему
«один против остальных» для многоклассовой задачи, его можно обернуть в
:class:`~sklearn.multiclass.OneVsRestClassifier`.

.. warning::
Выбор алгоритма зависит от выбранного штрафа (`l1_ratio=0`
для штрафа L2, `l1_ratio=1` для штрафа L1 и `0 < l1_ratio < 1` для
Elastic-Net), а также от поддержки многоклассовой (мультиномиальной) классификации:

================= ======================== ======================
solver l1_ratio мультиномиальная многоклассовая
================= ======================== ======================
'lbfgs' l1_ratio=0 да
'liblinear' l1_ratio=1 или l1_ratio=0 нет
'newton-cg' l1_ratio=0 да
'newton-cholesky' l1_ratio=0 да
'sag' l1_ratio=0 да
'saga' 0<=l1_ratio<=1 да
================= ======================== ======================

.. note::
Быстрая сходимость 'sag' и 'saga' гарантируется только для признаков
с приблизительно одинаковым масштабом. Данные можно предварительно обработать
с помощью масштабировщика из :mod:`sklearn.preprocessing`.

.. seealso::
Дополнительные сведения о :class:`LogisticRegression` см. в :ref:`Руководстве пользователя <Logistic_regression>`,
а сводную таблицу поддержки решателей и штрафов — в разделе
:ref:`Таблица <logistic_regression_solvers>`.

.. versionadded:: 0.17
Решатель стохастического градиента со средним (SAG). Поддержка мультиномиального режима добавлена в
версии 0.18.
.. versionadded:: 0.19
Решатель SAGA.
.. versionchanged:: 0.22
В версии 0.22 решатель по умолчанию изменён с 'liblinear' на 'lbfgs'.
.. versionadded:: 1.2
Решатель newton-cholesky. Поддержка мультиномиального режима добавлена в версии 1.6.
'lbfgs'
max_iter max_iter: int, по умолчанию 100

Максимальное число итераций, выполняемых решателями до сходимости.
100
verbose verbose: int, по умолчанию 0

Для решателей liblinear и lbfgs задайте любое положительное значение verbose, чтобы включить подробный вывод.
0
warm_start warm_start: bool, по умолчанию False

Если задано значение True, результат предыдущего вызова fit используется в качестве начального приближения; в противном случае предыдущий результат удаляется.
Для решателя liblinear параметр не используется. См. :term:`глоссарий <warm_start>`.

.. versionadded:: 0.17
*warm_start* для поддержки решателей *lbfgs*, *newton-cg*, *sag*, *saga*.
False
n_jobs n_jobs: int, по умолчанию None

Не оказывает никакого влияния.

.. deprecated:: 1.8
Параметр `n_jobs` объявлен устаревшим в версии 1.8 и будет удалён в версии 1.10.
None


DecisionTreeRegressor с criterion="absolute_error"

tree.DecisionTreeRegressor с criterion="absolute_error" теперь работает значительно быстрее. Теперь его сложность составляет O(n * log(n)) вместо O(n**2), как было раньше, что позволяет масштабировать его до миллионов точек данных.

Например, на наборе данных из 100_000 образцов с одним признаком выполнение одного разбиения занимает около 100 мс, тогда как раньше на это требовалось около 20 секунд.

import time

from sklearn.datasets import make_regression
from sklearn.tree import DecisionTreeRegressor

X, y = make_regression(n_samples=100_000, n_features=1)
tree = DecisionTreeRegressor(criterion="absolute_error", max_depth=1)

tic = time.time()
tree.fit(X, y)
elapsed = time.time() - tic
print(f"Fit took {elapsed:.2f} seconds")
Fit took 0.14 seconds

Классический MDS

Классический MDS, также известный как «анализ главных координат» (PCoA) или «шкалирование Торгерсона», теперь доступен в модуле sklearn.manifold. Классический MDS близок к PCA и вместо аппроксимации расстояний аппроксимирует попарные скалярные произведения, для которых существует точное аналитическое решение на основе разложения на собственные значения.

Рассмотрим это новое дополнение на примере набора данных в форме S-кривой, чтобы получить низкоразмерное представление данных.

import matplotlib.pyplot as plt
from matplotlib import ticker

from sklearn import datasets, manifold

n_samples = 1500
S_points, S_color = datasets.make_s_curve(n_samples, random_state=0)
md_classical = manifold.ClassicalMDS(n_components=2)
S_scaling = md_classical.fit_transform(S_points)

fig = plt.figure(figsize=(8, 4))
ax1 = fig.add_subplot(1, 2, 1, projection="3d")
x, y, z = S_points.T
ax1.scatter(x, y, z, c=S_color, s=50, alpha=0.8)
ax1.set_title("Original S-curve samples", size=16)
ax1.view_init(azim=-60, elev=9)
for axis in (ax1.xaxis, ax1.yaxis, ax1.zaxis):
    axis.set_major_locator(ticker.MultipleLocator(1))

ax2 = fig.add_subplot(1, 2, 2)
x2, y2 = S_scaling.T
ax2.scatter(x2, y2, c=S_color, s=50, alpha=0.8)
ax2.set_title("Classical MDS", size=16)
for axis in (ax2.xaxis, ax2.yaxis):
    axis.set_major_formatter(ticker.NullFormatter())

plt.show()
Original S-curve samples, Classical MDS

Общее время выполнения скрипта: (0 минут 15.144 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_release_highlights_1_8_0.ipynb

Download Python source code: plot_release_highlights_1_8_0.py

Download zipped: plot_release_highlights_1_8_0.zip

Связанные примеры

Основные нововведения scikit-learn 1.6

Основные нововведения scikit-learn 1.7

Основные нововведения scikit-learn 1.0

Основные нововведения scikit-learn 1.2

© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/release_highlights/plot_release_highlights_1_8_0.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API