Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.
Основные нововведения в scikit-learn 1.1
Мы рады объявить о выпуске scikit-learn 1.1! Помимо множества исправлений ошибок и улучшений, добавлены и новые ключевые возможности. Ниже мы расскажем о некоторых основных нововведениях этого выпуска. Полный список всех изменений см. в примечаниях к выпуску.
Чтобы установить последнюю версию с помощью pip:
pip install --upgrade scikit-learn
или с помощью conda:
conda install -c conda-forge scikit-learn
Квантильная функция потерь в HistGradientBoostingRegressor
HistGradientBoostingRegressor может моделировать квантили с помощью loss="quantile" и нового параметра quantile.
import matplotlib.pyplot as plt
import numpy as np
from sklearn.ensemble import HistGradientBoostingRegressor
# Simple regression function for X * cos(X)
rng = np.random.RandomState(42)
X_1d = np.linspace(0, 10, num=2000)
X = X_1d.reshape(-1, 1)
y = X_1d * np.cos(X_1d) + rng.normal(scale=X_1d / 3)
quantiles = [0.95, 0.5, 0.05]
parameters = dict(loss="quantile", max_bins=32, max_iter=50)
hist_quantiles = {
f"quantile={quantile:.2f}": HistGradientBoostingRegressor(
**parameters, quantile=quantile
).fit(X, y)
for quantile in quantiles
}
fig, ax = plt.subplots()
ax.plot(X_1d, y, "o", alpha=0.5, markersize=1)
for quantile, hist in hist_quantiles.items():
ax.plot(X_1d, hist.predict(X), label=quantile)
_ = ax.legend(loc="lower left")

Пример использования см. в разделе Возможности деревьев с гистограммным градиентным бустингом
get_feature_names_out доступен во всех преобразователях
get_feature_names_out теперь доступен во всех преобразователях, что завершает реализацию SLEP007. Благодаря этому Pipeline может создавать имена выходных признаков для более сложных конвейеров:
from sklearn.compose import ColumnTransformer
from sklearn.datasets import fetch_openml
from sklearn.feature_selection import SelectKBest
from sklearn.impute import SimpleImputer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
X, y = fetch_openml(
"titanic", version=1, as_frame=True, return_X_y=True, parser="pandas"
)
numeric_features = ["age", "fare"]
numeric_transformer = make_pipeline(SimpleImputer(strategy="median"), StandardScaler())
categorical_features = ["embarked", "pclass"]
preprocessor = ColumnTransformer(
[
("num", numeric_transformer, numeric_features),
(
"cat",
OneHotEncoder(handle_unknown="ignore", sparse_output=False),
categorical_features,
),
],
verbose_feature_names_out=False,
)
log_reg = make_pipeline(preprocessor, SelectKBest(k=7), LogisticRegression())
log_reg.fit(X, y)
Здесь мы выделяем из конвейера все шаги, кроме последнего. Имена выходных признаков этой части конвейера — это признаки, передаваемые в логистическую регрессию. Эти имена напрямую соответствуют коэффициентам логистической регрессии:
import pandas as pd log_reg_input_features = log_reg[:-1].get_feature_names_out() pd.Series(log_reg[-1].coef_.ravel(), index=log_reg_input_features).plot.bar() plt.tight_layout()

Группировка редко встречающихся категорий в OneHotEncoder
OneHotEncoder поддерживает объединение редко встречающихся категорий в один выход для каждого признака. Параметры, включающие объединение редко встречающихся категорий, — это min_frequency и max_categories. Подробнее см. в руководстве пользователя.
import numpy as np
from sklearn.preprocessing import OneHotEncoder
X = np.array(
[["dog"] * 5 + ["cat"] * 20 + ["rabbit"] * 10 + ["snake"] * 3], dtype=object
).T
enc = OneHotEncoder(min_frequency=6, sparse_output=False).fit(X)
enc.infrequent_categories_
[array(['dog', 'snake'], dtype=object)]
Поскольку dog и snake — редко встречающиеся категории, при преобразовании они объединяются:
encoded = enc.transform(np.array([["dog"], ["snake"], ["cat"], ["rabbit"]])) pd.DataFrame(encoded, columns=enc.get_feature_names_out())
Повышение производительности
Вычисление попарных расстояний для плотных наборов данных float64 было переработано, чтобы эффективнее использовать неблокирующий параллелизм потоков. Например, neighbors.NearestNeighbors.kneighbors и neighbors.NearestNeighbors.radius_neighbors теперь работают соответственно до ×20 и ×5 быстрее, чем раньше. Ниже перечислены функции и оценщики, производительность которых улучшена:
metrics.pairwise_distances_argminmetrics.pairwise_distances_argmin_mincluster.AffinityPropagationcluster.Birchcluster.MeanShiftcluster.OPTICScluster.SpectralClusteringfeature_selection.mutual_info_regressionneighbors.KNeighborsClassifierneighbors.KNeighborsRegressorneighbors.RadiusNeighborsClassifierneighbors.RadiusNeighborsRegressorneighbors.LocalOutlierFactorneighbors.NearestNeighborsmanifold.Isomapmanifold.LocallyLinearEmbeddingmanifold.TSNEmanifold.trustworthinesssemi_supervised.LabelPropagationsemi_supervised.LabelSpreading
Подробнее о технических деталях этой работы можно узнать из серии публикаций в блоге.
Кроме того, вычисление функций потерь было переработано с использованием Cython, что повысило производительность следующих оценщиков:
MiniBatchNMF: онлайн-версия NMF
Новый класс MiniBatchNMF реализует более быструю, но менее точную версию неотрицательной матричной факторизации (NMF). MiniBatchNMF разбивает данные на мини-пакеты и оптимизирует модель NMF в онлайн-режиме, последовательно проходя по мини-пакетам, что делает её более подходящей для больших наборов данных. В частности, класс реализует partial_fit, который можно использовать для онлайн-обучения, когда данные изначально доступны не полностью или не помещаются в память.
import numpy as np
from sklearn.decomposition import MiniBatchNMF
rng = np.random.RandomState(0)
n_samples, n_features, n_components = 10, 10, 5
true_W = rng.uniform(size=(n_samples, n_components))
true_H = rng.uniform(size=(n_components, n_features))
X = true_W @ true_H
nmf = MiniBatchNMF(n_components=n_components, random_state=0)
for _ in range(10):
nmf.partial_fit(X)
W = nmf.transform(X)
H = nmf.components_
X_reconstructed = W @ H
print(
"relative reconstruction error: ",
f"{np.sum((X - X_reconstructed) ** 2) / np.sum(X**2):.5f}",
)
relative reconstruction error: 0.00364
BisectingKMeans: деление и кластеризация
Новый класс BisectingKMeans представляет собой вариант KMeans, использующий иерархическую кластеризацию методом разделения. Вместо создания всех центроидов сразу, центроиды последовательно выбираются на основе предыдущей кластеризации: кластер многократно разделяется на два новых кластера, пока не будет достигнуто целевое число кластеров, что придаёт кластеризации иерархическую структуру.
import matplotlib.pyplot as plt
from sklearn.cluster import BisectingKMeans, KMeans
from sklearn.datasets import make_blobs
X, _ = make_blobs(n_samples=1000, centers=2, random_state=0)
km = KMeans(n_clusters=5, random_state=0, n_init="auto").fit(X)
bisect_km = BisectingKMeans(n_clusters=5, random_state=0).fit(X)
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].scatter(X[:, 0], X[:, 1], s=10, c=km.labels_)
ax[0].scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1], s=20, c="r")
ax[0].set_title("KMeans")
ax[1].scatter(X[:, 0], X[:, 1], s=10, c=bisect_km.labels_)
ax[1].scatter(
bisect_km.cluster_centers_[:, 0], bisect_km.cluster_centers_[:, 1], s=20, c="r"
)
_ = ax[1].set_title("BisectingKMeans")

Общее время выполнения скрипта: (0 минут 0.890 секунды)
Похожие примеры
© 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_1_0.html