Примечание
Перейти в конец, чтобы скачать полный код примера или запустить этот пример в браузере с помощью JupyterLite или Binder.
Границы решений мультиномиальной логистической регрессии и логистической регрессии «один против остальных»
В этом примере сравниваются границы решений мультиномиальной логистической регрессии и логистической регрессии «один против остальных» на двумерном наборе данных с тремя классами.
Мы сравниваем границы решений обоих методов, что эквивалентно вызову метода predict. Кроме того, мы строим гиперплоскости, соответствующие линии, на которой оценка вероятности для класса равна 0.5.
# Authors: The scikit-learn developers # SPDX-License-Identifier: BSD-3-Clause
Генерация набора данных
Мы создаём синтетический набор данных с помощью функции make_blobs. Набор данных состоит из 1 000 образцов трёх разных классов с центрами в точках [-5, 0], [0, 1.5] и [5, -1]. После генерации мы применяем линейное преобразование, чтобы добавить корреляцию между признаками и усложнить задачу. В результате получается двумерный набор данных с тремя перекрывающимися классами, подходящий для демонстрации различий между мультиномиальной логистической регрессией и логистической регрессией «один против остальных».
import matplotlib.pyplot as plt import numpy as np from sklearn.datasets import make_blobs cmap = "coolwarm" 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, cmap=cmap, 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,
multiclass_colors=cmap,
)
scatter = ax.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap, 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, colors):
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, color in zip(range(coef.shape[0]), colors):
w = coef[i]
a = -w[0] / w[1]
xx = np.linspace(xmin, xmax)
yy = a * xx - (intercept[i]) / w[1]
ax.plot(xx, yy, "--", color=color, linewidth=4, 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, colors=["blue", "dimgray", "red"]
)
scatter = ax.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap, 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.
- Такой бинарный подход может приводить к более простым границам решений, но не всегда позволяет учитывать сложные взаимосвязи между всеми классами одновременно.
- Условные вероятности классов не поддаются интерпретации.
В мультиномиальной логистической регрессии:
- Все гиперплоскости определяются одновременно с учётом взаимосвязей между всеми классами.
- Минимизируемая моделью функция потерь является корректной scoring rule, то есть модель оптимизируется для оценки условных вероятностей классов, которые поэтому имеют смысл.
- Каждая гиперплоскость представляет собой границу решений, на которой вероятность одного класса становится выше вероятностей остальных, исходя из общего распределения вероятностей.
- Такой подход позволяет учитывать более тонкие взаимосвязи между классами и потенциально обеспечивает более точную классификацию в многоклассовых задачах.
Различия между гиперплоскостями, особенно для класса 1, показывают, что эти методы могут задавать разные границы решений, несмотря на схожую общую точность.
На практике рекомендуется использовать мультиномиальную логистическую регрессию, поскольку она минимизирует корректно сформулированную функцию потерь, что приводит к более точным вероятностным оценкам классов и, следовательно, к более интерпретируемым результатам. При построении границ решений следует задавать функцию полезности, преобразующую вероятности классов в величину, значимую для конкретной задачи. Подход «один против остальных» позволяет задавать разные границы решений, но не обеспечивает такого же тонкого контроля над компромиссом между классами, как функция полезности.
Общее время выполнения скрипта: (0 минут 0.545 секунды)
Похожие примеры
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/auto_examples/linear_model/plot_logistic_multinomial.html