Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере через 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()

Классификатор и регрессор со стекингом
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()

Встроенная поддержка пропущенных значений в градиентном бустинге
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)
Заполнение пропусков методом KNN
Теперь поддерживается заполнение пропущенных значений с помощью метода 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.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score X, y = make_classification(n_classes=4, n_informative=16) clf = LogisticRegression().fit(X, y) print(roc_auc_score(y, clf.predict_proba(X), multi_class="ovr"))
0.9397333333333333
Общее время выполнения скрипта: (0 минут 2.532 секунды)
Связанные примеры
© 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_0_22_0.html