Spec-Zone.ru › scikit-learn

Примечание

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

Обучение классификаторов

Мы обучаем два разных классификатора логистической регрессии: мультиномиальный и «один против остальных». Мультиномиальный классификатор обрабатывает все классы одновременно, тогда как в подходе «один против остальных» для каждого класса обучается бинарный классификатор, отделяющий его от всех остальных.

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)
Multinomial Logistic Regression (Accuracy: 0.995), One-vs-Rest Logistic Regression (Accuracy: 0.976)

Видно, что границы решений различаются. Это различие обусловлено используемыми подходами:

  • Мультиномиальная логистическая регрессия учитывает все классы одновременно в ходе оптимизации.
  • Логистическая регрессия «один против остальных» независимо подбирает модель для каждого класса относительно всех остальных.

Эти различные стратегии могут приводить к разным границам решений, особенно в сложных задачах многоклассовой классификации.

Визуализация гиперплоскостей

Мы также визуализируем гиперплоскости, соответствующие линии, на которой оценка вероятности для класса равна 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()
Multinomial Logistic Regression Hyperplanes, One-vs-Rest Logistic Regression Hyperplanes

Гиперплоскости для классов 0 и 2 в обоих методах довольно похожи, однако гиперплоскость для класса 1 заметно отличается. Это различие обусловлено принципиальными особенностями логистической регрессии «один против остальных» и мультиномиальной логистической регрессии:

В логистической регрессии «один против остальных»:

  • Каждая гиперплоскость определяется независимо, при этом один класс рассматривается относительно всех остальных.
  • Для класса 1 гиперплоскость представляет собой границу решений, которая лучше всего отделяет класс 1 от объединённых классов 0 и 2.
  • Такой бинарный подход может приводить к более простым границам решений, но не всегда позволяет учитывать сложные взаимосвязи между всеми классами одновременно.
  • Условные вероятности классов не поддаются интерпретации.

В мультиномиальной логистической регрессии:

  • Все гиперплоскости определяются одновременно с учётом взаимосвязей между всеми классами.
  • Минимизируемая моделью функция потерь является корректной scoring rule, то есть модель оптимизируется для оценки условных вероятностей классов, которые поэтому имеют смысл.
  • Каждая гиперплоскость представляет собой границу решений, на которой вероятность одного класса становится выше вероятностей остальных, исходя из общего распределения вероятностей.
  • Такой подход позволяет учитывать более тонкие взаимосвязи между классами и потенциально обеспечивает более точную классификацию в многоклассовых задачах.

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

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

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

Launch binder
Launch JupyterLite

Download Jupyter notebook: plot_logistic_multinomial.ipynb

Download Python source code: plot_logistic_multinomial.py

Download zipped: plot_logistic_multinomial.zip

Похожие примеры

Разреженная многоклассовая логистическая регрессия на наборе данных 20newgroups

Визуализация вероятностей классификации

Признаки ограниченной машины Больцмана для классификации цифр

Визуализация многоклассового SGD на наборе данных iris

© 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

Spec-Zone.ru

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