Примечание
Перейти к концу для загрузки полного примера кода. или для запуска этого примера в браузере через 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 теперь напрямую поддерживают DataFrame с категориальными признаками. Здесь у нас есть набор данных с комбинацией категориальных и числовых признаков:
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.model_selection import train_test_split
from sklearn.metrics import roc_auc_score
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.9282207572920261
Вывод Polars в set_output
Трансформеры scikit-learn теперь поддерживают вывод Polars с помощью API set_output.
import polars as pl
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
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'>
Поддержка пропущенных значений для случайного леса
Классы 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, теперь эта функция поддерживается для всех других древесно-подобных моделей, таких как деревья, случайные леса, деревья экстремальных случайных лесов и точного градиентного бустинга. Здесь мы демонстрируем эту функцию для случайного леса в задаче регрессии.
import matplotlib.pyplot as plt
from sklearn.inspection import PartialDependenceDisplay
from sklearn.ensemble import RandomForestRegressor
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.metrics import get_scorer
from sklearn.datasets import make_regression
from sklearn.linear_model import Lasso
from sklearn.model_selection import GridSearchCV, cross_validate, GroupKFold
# 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.39360224 -0.46402556 -0.23957125 -0.44216253 -0.28929562]
Улучшенная эффективность памяти и времени выполнения PCA для разреженных данных
PCA теперь может обрабатывать разреженные матрицы напрямую для arpack решателя, используя scipy.sparse.linalg.LinearOperator для избежания материализации больших разреженных матриц при выполнении разложения собственных значений ковариационной матрицы набора данных.
from sklearn.decomposition import PCA
import scipy.sparse as sp
from time import time
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.8x
Общее время выполнения скрипта: (0 минут 2,132 секунды)
Связанные примеры
© 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_4_0.html