Разрешение конфликтов в SVM

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии рассматривается механизм разрешения конфликтов (tie-breaking) в SVM и его влияние на границу решения. В SVM tie-breaking - это механизм, используемый для разрешения конфликтов между двумя или более классами, когда расстояния до них равны. По умолчанию этот механизм отключен, когда decision_function_shape='ovr', так как он требует дополнительных вычислительных ресурсов. Поэтому в этом практическом занятии показано влияние параметра break_ties на задачу многоклассовой классификации с decision_function_shape='ovr'.

Советы по использованию ВМ

После запуска виртуальной машины кликните в левом верхнем углу, чтобы переключиться на вкладку Notebook и приступить к практике в Jupyter Notebook.

Иногда может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/svm("Support Vector Machines") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/svm -.-> lab-49312{{"Разрешение конфликтов в SVM"}} sklearn/datasets -.-> lab-49312{{"Разрешение конфликтов в SVM"}} ml/sklearn -.-> lab-49312{{"Разрешение конфликтов в SVM"}} end

Импортируем необходимые библиотеки

В этом шаге мы импортируем необходимые библиотеки для SVM и визуализации.

import numpy as np
import matplotlib.pyplot as plt
from sklearn.svm import SVC
from sklearn.datasets import make_blobs

Создаем примерные данные

В этом шаге мы создадим выборочный датасет с использованием функции make_blobs из scikit - learn. Этот датасет содержит 3 класса и 2 признака.

X, y = make_blobs(random_state=27)

Создаем модель SVM с и без разрешения конфликтов (tie-breaking)

В этом шаге мы создадим две модели SVM - одну с отключенным разрешением конфликтов и другую с включенным разрешением конфликтов. Для создания этих моделей мы будем использовать класс SVC из scikit - learn. Параметр break_ties для двух моделей будет установлен соответственно в False и True.

for break_ties, title, ax in zip((False, True), titles, sub.flatten()):
    svm = SVC(
        kernel="linear", C=1, break_ties=break_ties, decision_function_shape="ovr"
    ).fit(X, y)

Создаем границу решения

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

    xs = np.linspace(xlim[0], xlim[1], 1000)
    ys = np.linspace(ylim[0], ylim[1], 1000)
    xx, yy = np.meshgrid(xs, ys)

    pred = svm.predict(np.c_[xx.ravel(), yy.ravel()])

    colors = [plt.cm.Accent(i) for i in [0, 4, 7]]

    points = ax.scatter(X[:, 0], X[:, 1], c=y, cmap="Accent")
    classes = [(0, 1), (0, 2), (1, 2)]
    line = np.linspace(X[:, 1].min() - 5, X[:, 1].max() + 5)
    ax.imshow(
        -pred.reshape(xx.shape),
        cmap="Accent",
        alpha=0.2,
        extent=(xlim[0], xlim[1], ylim[1], ylim[0]),
    )

Построение границы решения

В этом шаге мы построим границу решения, созданную на предыдущем шаге. Мы будем использовать атрибуты coef_ и intercept_ модели SVM для построения границы решения.

    for coef, intercept, col in zip(svm.coef_, svm.intercept_, classes):
        line2 = -(line * coef[1] + intercept) / coef[0]
        ax.plot(line2, line, "-", c=colors[col[0]])
        ax.plot(line2, line, "--", c=colors[col[1]])
    ax.set_xlim(xlim)
    ax.set_ylim(ylim)
    ax.set_title(title)
    ax.set_aspect("equal")

Показать график

В этом шаге мы покажем график, содержащий границу решения для обеих моделей.

plt.show()

Резюме

В этом лабаратории было показано влияние разрешения конфликтов (tie-breaking) в SVM на границу решения. Мы создали две модели SVM - одну с отключенным разрешением конфликтов и другую с включенным разрешением конфликтов. Затем мы построили границу решения для обеих моделей. Граница решения для модели с включенным разрешением конфликтов была невыпуклой в области, где классы были в равной ситуации.