Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через JupyterLite или Binder.
Основные нововведения в scikit-learn 1.4
Мы рады объявить о выпуске scikit-learn 1.4! В эту версию вошло множество исправлений ошибок и улучшений, а также несколько новых важных функций. Ниже мы подробно расскажем о некоторых основных нововведениях этого выпуска. Полный список всех изменений см. в примечаниях к выпуску.
Чтобы установить последнюю версию с помощью pip:
pip install --upgrade scikit-learn
или с помощью conda:
conda install -c conda-forge scikit-learn
HistGradientBoosting поддерживает категориальные типы данных в DataFrame
ensemble.HistGradientBoostingClassifier и ensemble.HistGradientBoostingRegressor теперь напрямую поддерживают датафреймы с категориальными признаками. Здесь у нас набор данных, содержащий как категориальные, так и числовые признаки:
from sklearn.datasets import fetch_openml
X_adult, y_adult = fetch_openml("adult", version=2, return_X_y=True)
# Remove redundant and non-feature columns
X_adult = X_adult.drop(["education-num", "fnlwgt"], axis="columns")
X_adult.dtypes
age int64 workclass category education category marital-status category occupation category relationship category race category sex category capital-gain int64 capital-loss int64 hours-per-week int64 native-country category dtype: object
При установке categorical_features="from_dtype" классификатор градиентного бустинга обрабатывает столбцы с категориальными типами данных как категориальные признаки алгоритма:
from sklearn.ensemble import HistGradientBoostingClassifier
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X_adult, y_adult, random_state=0)
hist = HistGradientBoostingClassifier(categorical_features="from_dtype")
hist.fit(X_train, y_train)
y_decision = hist.decision_function(X_test)
print(f"ROC AUC score is {roc_auc_score(y_test, y_decision)}")
ROC AUC score is 0.9282576093428612
Вывод Polars в set_output
Трансформеры scikit-learn теперь поддерживают вывод в формате Polars с помощью API set_output.
import polars as pl
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder, StandardScaler
df = pl.DataFrame(
{"height": [120, 140, 150, 110, 100], "pet": ["dog", "cat", "dog", "cat", "cat"]}
)
preprocessor = ColumnTransformer(
[
("numerical", StandardScaler(), ["height"]),
("categorical", OneHotEncoder(sparse_output=False), ["pet"]),
],
verbose_feature_names_out=False,
)
preprocessor.set_output(transform="polars")
df_out = preprocessor.fit_transform(df)
df_out
print(f"Output type: {type(df_out)}")
Output type: <class 'polars.dataframe.frame.DataFrame'>
Поддержка пропущенных значений в Random Forest
Классы ensemble.RandomForestClassifier и ensemble.RandomForestRegressor теперь поддерживают пропущенные значения. При обучении каждого отдельного дерева разделитель оценивает каждый возможный порог, направляя пропущенные значения в левый и правый узлы. Подробнее см. в руководстве пользователя.
import numpy as np from sklearn.ensemble import RandomForestClassifier X = np.array([0, 1, 6, np.nan]).reshape(-1, 1) y = [0, 0, 1, 1] forest = RandomForestClassifier(random_state=0).fit(X, y) forest.predict(X)
array([0, 0, 1, 1])
Добавлена поддержка монотонных ограничений в моделях на основе деревьев
В scikit-learn 0.23 мы добавили поддержку монотонных ограничений для градиентного бустинга на основе гистограмм, а теперь эта функция поддерживается и во всех остальных моделях на основе деревьев: деревьях, случайных лесах, Extra Trees и точном градиентном бустинге. Здесь мы демонстрируем эту функцию на примере случайного леса для задачи регрессии.
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestRegressor
from sklearn.inspection import PartialDependenceDisplay
n_samples = 500
rng = np.random.RandomState(0)
X = rng.randn(n_samples, 2)
noise = rng.normal(loc=0.0, scale=0.01, size=n_samples)
y = 5 * X[:, 0] + np.sin(10 * np.pi * X[:, 0]) - noise
rf_no_cst = RandomForestRegressor().fit(X, y)
rf_cst = RandomForestRegressor(monotonic_cst=[1, 0]).fit(X, y)
disp = PartialDependenceDisplay.from_estimator(
rf_no_cst,
X,
features=[0],
feature_names=["feature 0"],
line_kw={"linewidth": 4, "label": "unconstrained", "color": "tab:blue"},
)
PartialDependenceDisplay.from_estimator(
rf_cst,
X,
features=[0],
line_kw={"linewidth": 4, "label": "constrained", "color": "tab:orange"},
ax=disp.axes_,
)
disp.axes_[0, 0].plot(
X[:, 0], y, "o", alpha=0.5, zorder=-1, label="samples", color="tab:green"
)
disp.axes_[0, 0].set_ylim(-3, 3)
disp.axes_[0, 0].set_xlim(-1, 1)
disp.axes_[0, 0].legend()
plt.show()

Расширенное отображение оценивателей
Отображение оценивателей стало информативнее. Рассмотрим forest, определённый выше:
forest
Документацию оценивателя можно открыть, нажав на значок «?» в правом верхнем углу схемы.
Кроме того, после обучения оценивателя цвет его отображения меняется с оранжевого на синий. Эту информацию также можно получить, наведя указатель на значок «i».
from sklearn.base import clone clone(forest) # the clone is not fitted
Поддержка маршрутизации метаданных
Многие метаоценщики и процедуры кросс-валидации теперь поддерживают маршрутизацию метаданных; их список приведен в руководстве пользователя. Например, вот как можно выполнить вложенную кросс-валидацию с весами образцов и GroupKFold:
import sklearn
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso
from sklearn.metrics import get_scorer
from sklearn.model_selection import GridSearchCV, GroupKFold, cross_validate
# For now by default metadata routing is disabled, and need to be explicitly
# enabled.
sklearn.set_config(enable_metadata_routing=True)
n_samples = 100
X, y = make_regression(n_samples=n_samples, n_features=5, noise=0.5)
rng = np.random.RandomState(7)
groups = rng.randint(0, 10, size=n_samples)
sample_weights = rng.rand(n_samples)
estimator = Lasso().set_fit_request(sample_weight=True)
hyperparameter_grid = {"alpha": [0.1, 0.5, 1.0, 2.0]}
scoring_inner_cv = get_scorer("neg_mean_squared_error").set_score_request(
sample_weight=True
)
inner_cv = GroupKFold(n_splits=5)
grid_search = GridSearchCV(
estimator=estimator,
param_grid=hyperparameter_grid,
cv=inner_cv,
scoring=scoring_inner_cv,
)
outer_cv = GroupKFold(n_splits=5)
scorers = {
"mse": get_scorer("neg_mean_squared_error").set_score_request(sample_weight=True)
}
results = cross_validate(
grid_search,
X,
y,
cv=outer_cv,
scoring=scorers,
return_estimator=True,
params={"sample_weight": sample_weights, "groups": groups},
)
print("cv error on test sets:", results["test_mse"])
# Setting the flag to the default `False` to avoid interference with other
# scripts.
sklearn.set_config(enable_metadata_routing=False)
cv error on test sets: [-0.30765609 -0.19866463 -0.60041733 -0.16796125 -0.27765513]
Повышение эффективности использования памяти и времени выполнения PCA на разреженных данных
Теперь PCA может напрямую обрабатывать разреженные матрицы с помощью солвера arpack, используя scipy.sparse.linalg.LinearOperator, чтобы избежать материализации больших разреженных матриц при разложении на собственные значения ковариационной матрицы набора данных.
from time import time
import scipy.sparse as sp
from sklearn.decomposition import PCA
X_sparse = sp.random(m=1000, n=1000, random_state=0)
X_dense = X_sparse.toarray()
t0 = time()
PCA(n_components=10, svd_solver="arpack").fit(X_sparse)
time_sparse = time() - t0
t0 = time()
PCA(n_components=10, svd_solver="arpack").fit(X_dense)
time_dense = time() - t0
print(f"Speedup: {time_dense / time_sparse:.1f}x")
Speedup: 3.9x
Общее время выполнения скрипта: (0 минут 2.061 секунды)
Связанные примеры
© 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_4_0.html