Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу для скачивания полного примера кода. Или запустите этот пример в браузере с помощью JupyterLite или Binder

Основные изменения в scikit-learn 0.22

Мы рады объявить о выпуске scikit-learn 0.22, который содержит множество исправлений ошибок и новых функций! Ниже мы подробно описываем некоторые из основных функций этого выпуска. Для исчерпывающего списка всех изменений, пожалуйста, обратитесь к примечаниям к выпуску.

Для установки последней версии (с помощью pip):

pip install --upgrade scikit-learn

или с помощью conda:

conda install -c conda-forge scikit-learn
# Authors: The scikit-learn developers
# SPDX-License-Identifier: BSD-3-Clause

Новая API для построения графиков

Доступна новая API для построения визуализаций. Эта новая API позволяет быстро изменять вид графика без перерасчета. Также возможно добавить различные графики на одну и ту же фигуру. Следующий пример демонстрирует plot_roc_curve, но поддерживаются и другие утилиты построения графиков, такие как plot_partial_dependence, plot_precision_recall_curve, и plot_confusion_matrix. Подробнее об этой новой API вы можете узнать в Руководстве пользователя.

import matplotlib
import matplotlib.pyplot as plt

from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier

# from sklearn.metrics import plot_roc_curve
from sklearn.metrics import RocCurveDisplay
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.utils.fixes import parse_version

X, y = make_classification(random_state=0)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

svc = SVC(random_state=42)
svc.fit(X_train, y_train)
rfc = RandomForestClassifier(random_state=42)
rfc.fit(X_train, y_train)

# plot_roc_curve has been removed in version 1.2. From 1.2, use RocCurveDisplay instead.
# svc_disp = plot_roc_curve(svc, X_test, y_test)
# rfc_disp = plot_roc_curve(rfc, X_test, y_test, ax=svc_disp.ax_)
svc_disp = RocCurveDisplay.from_estimator(svc, X_test, y_test)
rfc_disp = RocCurveDisplay.from_estimator(rfc, X_test, y_test, ax=svc_disp.ax_)
rfc_disp.figure_.suptitle("ROC curve comparison")

plt.show()
ROC curve comparison

Классификатор и регрессор стекинг

StackingClassifier и StackingRegressor позволяют вам создать стек оценщиков с конечным классификатором или регрессором. Стекинг обобщения заключается в стекировании вывода отдельных оценщиков и использовании классификатора для вычисления окончательного прогноза. Стекинг позволяет использовать преимущества каждого отдельного оценщика, используя их вывод в качестве входных данных для конечного оценщика. Базовые оценщики обучаются на полном X, в то время как конечный оценщик обучается с использованием кросс-валидированных прогнозов базовых оценщиков с помощью cross_val_predict.

Подробнее в Руководстве пользователя.

from sklearn.datasets import load_iris
from sklearn.ensemble import StackingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC

X, y = load_iris(return_X_y=True)
estimators = [
    ("rf", RandomForestClassifier(n_estimators=10, random_state=42)),
    ("svr", make_pipeline(StandardScaler(), LinearSVC(dual="auto", random_state=42))),
]
clf = StackingClassifier(estimators=estimators, final_estimator=LogisticRegression())
X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state=42)
clf.fit(X_train, y_train).score(X_test, y_test)
0.9473684210526315

Важность признаков, основанная на перестановках

Метод inspection.permutation_importance может быть использован для оценки важности каждого признака для любого обученного оценщика:

import matplotlib.pyplot as plt
import numpy as np

from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.inspection import permutation_importance

X, y = make_classification(random_state=0, n_features=5, n_informative=3)
feature_names = np.array([f"x_{i}" for i in range(X.shape[1])])

rf = RandomForestClassifier(random_state=0).fit(X, y)
result = permutation_importance(rf, X, y, n_repeats=10, random_state=0, n_jobs=2)

fig, ax = plt.subplots()
sorted_idx = result.importances_mean.argsort()

# `labels` argument in boxplot is deprecated in matplotlib 3.9 and has been
# renamed to `tick_labels`. The following code handles this, but as a
# scikit-learn user you probably can write simpler code by using `labels=...`
# (matplotlib < 3.9) or `tick_labels=...` (matplotlib >= 3.9).
tick_labels_parameter_name = (
    "tick_labels"
    if parse_version(matplotlib.__version__) >= parse_version("3.9")
    else "labels"
)
tick_labels_dict = {tick_labels_parameter_name: feature_names[sorted_idx]}
ax.boxplot(result.importances[sorted_idx].T, vert=False, **tick_labels_dict)
ax.set_title("Permutation Importance of each feature")
ax.set_ylabel("Features")
fig.tight_layout()
plt.show()
Permutation Importance of each feature

Встроенная поддержка пропущенных значений для градиентного бустинга

Теперь методы ensemble.HistGradientBoostingClassifier и ensemble.HistGradientBoostingRegressor имеют встроенную поддержку пропущенных значений (NaN). Это означает, что нет необходимости в импутации данных при обучении или прогнозировании.

from sklearn.ensemble import HistGradientBoostingClassifier

X = np.array([0, 1, 2, np.nan]).reshape(-1, 1)
y = [0, 0, 1, 1]

gbdt = HistGradientBoostingClassifier(min_samples_leaf=1).fit(X, y)
print(gbdt.predict(X))
[0 0 1 1]

Предвычисленный разреженный граф ближайших соседей

Большинство оценщиков, основанных на графах ближайших соседей, теперь принимают предвычисленные разреженные графы в качестве входных данных, чтобы повторно использовать тот же граф для нескольких обучений оценщиков. Для использования этой функции в конвейере можно использовать параметр memory, вместе с одним из двух новых преобразователей, neighbors.KNeighborsTransformer и neighbors.RadiusNeighborsTransformer. Предвычисление также может выполняться пользовательскими оценщиками для использования альтернативных реализаций, таких как методы приближенного поиска ближайших соседей. Более подробную информацию см. в Руководстве пользователя.

from tempfile import TemporaryDirectory

from sklearn.manifold import Isomap
from sklearn.neighbors import KNeighborsTransformer
from sklearn.pipeline import make_pipeline

X, y = make_classification(random_state=0)

with TemporaryDirectory(prefix="sklearn_cache_") as tmpdir:
    estimator = make_pipeline(
        KNeighborsTransformer(n_neighbors=10, mode="distance"),
        Isomap(n_neighbors=10, metric="precomputed"),
        memory=tmpdir,
    )
    estimator.fit(X)

    # We can decrease the number of neighbors and the graph will not be
    # recomputed.
    estimator.set_params(isomap__n_neighbors=5)
    estimator.fit(X)

Импутация на основе k ближайших соседей

Теперь мы поддерживаем импутацию для заполнения пропущенных значений с помощью k ближайших соседей.

Пропущенные значения каждого образца импутируются с помощью среднего значения от n_neighbors ближайших соседей, найденных в обучающей выборке. Два образца близки, если те признаки, которые ни у одного из них не пропущены, близки. По умолчанию используется метрика евклидового расстояния, поддерживающая пропущенные значения, nan_euclidean_distances, для поиска ближайших соседей.

Подробнее в Руководстве пользователя.

from sklearn.impute import KNNImputer

X = [[1, 2, np.nan], [3, 4, 3], [np.nan, 6, 5], [8, 8, 7]]
imputer = KNNImputer(n_neighbors=2)
print(imputer.fit_transform(X))
[[1.  2.  4. ]
 [3.  4.  3. ]
 [5.5 6.  5. ]
 [8.  8.  7. ]]

Обрезка деревьев

Теперь можно обрезать большинство оценщиков на основе деревьев после построения деревьев. Обрезка основана на минимальной сложности затрат. Подробнее об этом см. в Руководстве пользователя.

X, y = make_classification(random_state=0)

rf = RandomForestClassifier(random_state=0, ccp_alpha=0).fit(X, y)
print(
    "Average number of nodes without pruning {:.1f}".format(
        np.mean([e.tree_.node_count for e in rf.estimators_])
    )
)

rf = RandomForestClassifier(random_state=0, ccp_alpha=0.05).fit(X, y)
print(
    "Average number of nodes with pruning {:.1f}".format(
        np.mean([e.tree_.node_count for e in rf.estimators_])
    )
)
Average number of nodes without pruning 22.3
Average number of nodes with pruning 6.4

Получение фреймов данных из OpenML

datasets.fetch_openml теперь может возвращать фреймы данных pandas и, таким образом, правильно обрабатывать наборы данных с разнородными данными:

from sklearn.datasets import fetch_openml

titanic = fetch_openml("titanic", version=1, as_frame=True, parser="pandas")
print(titanic.data.head()[["pclass", "embarked"]])
   pclass embarked
0       1        S
1       1        S
2       1        S
3       1        S
4       1        S

Проверка совместимости оценщика с scikit-learn

Разработчики могут проверить совместимость своих совместимых с scikit-learn оценщиков, используя check_estimator. Например, check_estimator(LinearSVC()) проходит.

Теперь мы предоставляем специальный декоратор pytest, который позволяет pytest запускать все проверки независимо и сообщать о проверках, которые завершаются ошибкой.

..note::

Данный пункт был немного обновлён в версии 0.24, где больше не поддерживается передача классов: передавайте экземпляры вместо этого.

from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeRegressor
from sklearn.utils.estimator_checks import parametrize_with_checks


@parametrize_with_checks([LogisticRegression(), DecisionTreeRegressor()])
def test_sklearn_compatible_estimator(estimator, check):
    check(estimator)

ROC AUC теперь поддерживает многоклассовую классификацию

Функцию roc_auc_score также можно использовать в многоклассовой классификации. В настоящее время поддерживаются две стратегии усреднения: алгоритм один-против-всех вычисляет среднее значение парных значений ROC AUC, а алгоритм один-против-остальных вычисляет среднее значение значений ROC AUC для каждого класса по отношению ко всем другим классам. В обоих случаях значения многоклассовой ROC AUC вычисляются на основе оценок вероятности, что образец принадлежит к определенному классу в соответствии с моделью. Алгоритмы OvO и OvR поддерживают равномерное взвешивание (average='macro') и взвешивание по распространенности (average='weighted').

Дополнительную информацию см. в Руководстве пользователя.

from sklearn.datasets import make_classification
from sklearn.metrics import roc_auc_score
from sklearn.svm import SVC

X, y = make_classification(n_classes=4, n_informative=16)
clf = SVC(decision_function_shape="ovo", probability=True).fit(X, y)
print(roc_auc_score(y, clf.predict_proba(X), multi_class="ovo"))
0.9930666666666667

Общее время выполнения сценария: (0 минут 1,337 секунды)

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_release_highlights_0_22_0.ipynb

Download Python source code: plot_release_highlights_0_22_0.py

Download zipped: plot_release_highlights_0_22_0.zip

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

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

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

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

ROC-кривая с API визуализации

© 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_0_22_0.html

Spec-Zone.ru

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