Spec-Zone.ru › scikit-learn

Примечание

Перейти к концу, чтобы загрузить весь пример кода. или запустить этот пример в браузере через 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")
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,
    )
    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)
Multinomial Logistic Regression (Accuracy: 0.995), One-vs-Rest Logistic Regression (Accuracy: 0.976)

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

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

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

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

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

Хотя гиперплоскости для классов 0 и 2 довольно похожи между двумя методами, мы наблюдаем, что гиперплоскость для класса 1 существенно отличается. Это различие обусловлено фундаментальными подходами логистической регрессии один-против-всех и многоклассовой логистической регрессии:

Для логистической регрессии один-против-всех:

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

Для многоклассовой логистической регрессии:

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

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

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

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

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

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

Многоклассовая разреженная логистическая регрессия на 20newsgroups

Построение вероятности классификации

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

Логистическая функция

© 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

Spec-Zone.ru

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