Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для загрузки полного примера кода. или для запуска этого примера в браузере через 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
формат: (5, 3)
height pet_cat pet_dog
f64 f64 f64
-0.215666 0.0 1.0
0.862662 1.0 0.0
1.401826 0.0 1.0
-0.754829 1.0 0.0
-1.293993 1.0 0.0


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()
plot release highlights 1 4 0

Улучшенные отображения оценщиков

Отображения оценщиков были улучшены: если мы посмотрим на forest, определённом выше:

forest
RandomForestClassifier(random_state=0)
В среде Jupyter, пожалуйста, перезапустите этот блок, чтобы отобразить HTML-представление, или доверьтесь блокноту.
На GitHub HTML-представление не может быть отображено, пожалуйста, попробуйте загрузить эту страницу с nbviewer.org.
RandomForestClassifier(random_state=0)


Вы можете получить доступ к документации оценщика, нажав на значок «?» в верхнем правом углу диаграммы.

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

from sklearn.base import clone

clone(forest)  # the clone is not fitted
RandomForestClassifier(random_state=0)
В среде Jupyter, пожалуйста, перезапустите этот блок, чтобы отобразить HTML-представление, или доверьтесь блокноту.
На GitHub HTML-представление не может быть отображено, пожалуйста, попробуйте загрузить эту страницу с nbviewer.org.
RandomForestClassifier(random_state=0)


Поддержка маршрутизации метаданных

Многие мета-оценщики и процедуры перекрестной проверки теперь поддерживают маршрутизацию метаданных, которая перечислена в руководстве пользователя. Например, вот как можно выполнить вложенную перекрестную проверку с весами выборки и 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 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_release_highlights_1_4_0.ipynb

Download Python source code: plot_release_highlights_1_4_0.py

Download zipped: plot_release_highlights_1_4_0.zip

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

Основные моменты выпуска scikit-learn 0.23

Основные моменты выпуска scikit-learn 1.2

Основные моменты выпуска scikit-learn 1.6

Основные моменты выпуска scikit-learn 0.24

© 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

Spec-Zone.ru

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