Примечание
Перейти к концу для загрузки полного примера кода. или для запуска этого примера в вашем браузере через 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.
from sklearn.ensemble import HistGradientBoostingRegressor
import numpy as np
import matplotlib.pyplot as plt
# 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 теперь доступно во всех преобразователях. Это позволяет Pipeline строить имена выходных признаков для более сложных конвейеров:
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.impute import SimpleImputer
from sklearn.feature_selection import SelectKBest
from sklearn.datasets import fetch_openml
from sklearn.linear_model import LogisticRegression
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. Подробности см. в Руководстве пользователя.
from sklearn.preprocessing import OneHotEncoder
import numpy as np
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)]
Поскольку «собака» и «змея» являются редкими категориями, они объединяются при преобразовании:
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(
f"relative reconstruction error: ",
f"{np.sum((X - X_reconstructed) ** 2) / np.sum(X**2):.5f}",
)
relative reconstruction error: 0.00364
BisectingKMeans: деление и кластеризация
Новый класс BisectingKMeans является вариантом KMeans, использующим делящий иерархический кластеринг. Вместо создания всех центроидов сразу, центроиды выбираются поэтапно на основе предыдущей кластеризации: кластер делится на два новых кластера многократно до тех пор, пока не будет достигнуто целевое количество кластеров, что придаёт кластеризации иерархическую структуру.
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans, BisectingKMeans
import matplotlib.pyplot as plt
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,913 секунды)
Связанные примеры
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/release_highlights/plot_release_highlights_1_1_0.html