Примечание
Перейти к концу, чтобы загрузить весь пример кода. или запустить этот пример в браузере через JupyterLite или Binder
Границы принятия решений для многоклассовой и логистической регрессии один-против-всех
В этом примере сравниваются границы принятия решений для многоклассовой и логистической регрессии один-против-всех на наборе данных 2D с тремя классами.
Мы сравниваем границы принятия решений обоих методов, что эквивалентно вызову метода predict. Кроме того, мы строим гиперплоскости, соответствующие прямой, когда оценка вероятности для класса равна 0,5.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Генерация набора данных
Мы генерируем синтетический набор данных, используя функцию make_blobs. Набор данных состоит из 1000 выборок из трех разных классов, центрированных около [-5, 0], [0, 1,5] и [5, -1]. После генерации мы применяем линейное преобразование, чтобы ввести некоторую корреляцию между признаками и сделать задачу более сложной. В результате получается набор данных 2D с тремя перекрывающимися классами, подходящий для демонстрации различий между многоклассовой и логистической регрессией один-против-всех.
import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import make_blobs centers = [[-5, 0], [0, 1.5], [5, -1]] X, y = make_blobs(n_samples=1_000, centers=centers, random_state=40) transformation = [[0.4, 0.2], [-0.4, 1.2]] X = np.dot(X, transformation) fig, ax = plt.subplots(figsize=(6, 4)) scatter = ax.scatter(X[:, 0], X[:, 1], c=y, edgecolor="black") ax.set(title="Synthetic Dataset", xlabel="Feature 1", ylabel="Feature 2") _ = ax.legend(*scatter.legend_elements(), title="Classes")

Обучение классификатора
Мы обучаем два разных классификатора логистической регрессии: многоклассовый и один-против-всех. Многоклассовый классификатор обрабатывает все классы одновременно, в то время как подход один-против-всех обучается бинарному классификатору для каждого класса против всех остальных.
from sklearn.linear_model import LogisticRegression from sklearn.multiclass import OneVsRestClassifier logistic_regression_multinomial = LogisticRegression().fit(X, y) logistic_regression_ovr = OneVsRestClassifier(LogisticRegression()).fit(X, y) accuracy_multinomial = logistic_regression_multinomial.score(X, y) accuracy_ovr = logistic_regression_ovr.score(X, y)
Визуализация границ принятия решений
Давайте визуализируем границы принятия решений обеих моделей, которые предоставляются методом predict классификаторов.
from sklearn.inspection import DecisionBoundaryDisplay
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5), sharex=True, sharey=True)
for model, title, ax in [
(
logistic_regression_multinomial,
f"Multinomial Logistic Regression\n(Accuracy: {accuracy_multinomial:.3f})",
ax1,
),
(
logistic_regression_ovr,
f"One-vs-Rest Logistic Regression\n(Accuracy: {accuracy_ovr:.3f})",
ax2,
),
]:
DecisionBoundaryDisplay.from_estimator(
model,
X,
ax=ax,
response_method="predict",
alpha=0.8,
)
scatter = ax.scatter(X[:, 0], X[:, 1], c=y, edgecolor="k")
legend = ax.legend(*scatter.legend_elements(), title="Classes")
ax.add_artist(legend)
ax.set_title(title)

Мы видим, что границы принятия решений отличаются. Это различие обусловлено их подходами:
- Многоклассовая логистическая регрессия рассматривает все классы одновременно во время оптимизации.
- Логистическая регрессия один-против-всех подгоняет каждый класс независимо к остальным.
Эти разные стратегии могут привести к различным границам принятия решений, особенно в сложных многоклассовых задачах.
Визуализация гиперплоскостей
Мы также визуализируем гиперплоскости, которые соответствуют прямой, когда оценка вероятности для класса равна 0,5.
def plot_hyperplanes(classifier, X, ax):
xmin, xmax = X[:, 0].min(), X[:, 0].max()
ymin, ymax = X[:, 1].min(), X[:, 1].max()
ax.set(xlim=(xmin, xmax), ylim=(ymin, ymax))
if isinstance(classifier, OneVsRestClassifier):
coef = np.concatenate([est.coef_ for est in classifier.estimators_])
intercept = np.concatenate([est.intercept_ for est in classifier.estimators_])
else:
coef = classifier.coef_
intercept = classifier.intercept_
for i in range(coef.shape[0]):
w = coef[i]
a = -w[0] / w[1]
xx = np.linspace(xmin, xmax)
yy = a * xx - (intercept[i]) / w[1]
ax.plot(xx, yy, "--", linewidth=3, label=f"Class {i}")
return ax.get_legend_handles_labels()
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5), sharex=True, sharey=True)
for model, title, ax in [
(
logistic_regression_multinomial,
"Multinomial Logistic Regression Hyperplanes",
ax1,
),
(logistic_regression_ovr, "One-vs-Rest Logistic Regression Hyperplanes", ax2),
]:
hyperplane_handles, hyperplane_labels = plot_hyperplanes(model, X, ax)
scatter = ax.scatter(X[:, 0], X[:, 1], c=y, edgecolor="k")
scatter_handles, scatter_labels = scatter.legend_elements()
all_handles = hyperplane_handles + scatter_handles
all_labels = hyperplane_labels + scatter_labels
ax.legend(all_handles, all_labels, title="Classes")
ax.set_title(title)
plt.show()

Хотя гиперплоскости для классов 0 и 2 довольно похожи между двумя методами, мы наблюдаем, что гиперплоскость для класса 1 существенно отличается. Это различие обусловлено фундаментальными подходами логистической регрессии один-против-всех и многоклассовой логистической регрессии:
Для логистической регрессии один-против-всех:
- Каждая гиперплоскость определяется независимо, рассматривая один класс против всех остальных.
- Для класса 1 гиперплоскость представляет собой границу принятия решений, которая наилучшим образом разделяет класс 1 от объединенных классов 0 и 2.
- Этот бинарный подход может привести к более простым границам принятия решений, но может не захватить сложные отношения между всеми классами одновременно.
- Нет возможности интерпретации условных вероятностей класса.
Для многоклассовой логистической регрессии:
- Все гиперплоскости определяются одновременно, учитывая отношения между всеми классами сразу.
- Функция потерь, минимизируемая моделью, является правилом оценки, а это значит, что модель оптимизирована для оценки условных вероятностей класса, которые, следовательно, имеют смысл.
- Каждая гиперплоскость представляет собой границу принятия решений, где вероятность одного класса становится выше, чем вероятность остальных, на основе общего распределения вероятностей.
- Этот подход может захватить более тонкие отношения между классами, что может привести к более точной классификации в многоклассовых задачах.
Различие в гиперплоскостях, особенно для класса 1, подчеркивает, как эти методы могут создавать разные границы принятия решений, несмотря на сходную общую точность.
На практике рекомендуется использовать многоклассовую логистическую регрессию, поскольку она минимизирует хорошо сформулированную функцию потерь, что приводит к лучшему балансированию вероятностей класса и, следовательно, более интерпретируемым результатам. Что касается границ принятия решений, следует сформулировать функцию полезности для преобразования вероятностей класса в осмысленную величину для рассматриваемой проблемы. Подход один-против-всех позволяет иметь разные границы принятия решений, но не позволяет тонко контролировать баланс между классами, как это делает функция полезности.
Общее время выполнения скрипта: (0 минут 0,645 секунд)
Связанные примеры
© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/auto_examples/linear_model/plot_logistic_multinomial.html