SVM для несбалансированных классов

Beginner

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

Введение

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

Советы по работе с ВМ

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

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

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

Импорт библиотек

Начнем с импорта необходимых библиотек для практического занятия: matplotlib.pyplot, svm, make_blobs и DecisionBoundaryDisplay.

import matplotlib.pyplot as plt
from sklearn import svm
from sklearn.datasets import make_blobs
from sklearn.inspection import DecisionBoundaryDisplay

Создание данных

Мы создадим два кластера случайных точек с использованием функции make_blobs. Создадим один кластер из 1000 точек и другой из 100 точек. Центры кластеров будут равны [0.0, 0.0] и [2.0, 2.0] соответственно. Параметр clusters_std контролирует стандартное отклонение кластеров.

n_samples_1 = 1000
n_samples_2 = 100
centers = [[0.0, 0.0], [2.0, 2.0]]
clusters_std = [1.5, 0.5]
X, y = make_blobs(
    n_samples=[n_samples_1, n_samples_2],
    centers=centers,
    cluster_std=clusters_std,
    random_state=0,
    shuffle=False,
)

Настройка модели

Мы настроим модель и получим разделяющую гиперплоскость с использованием функции SVC из библиотеки svm. Будем использовать линейный ядро и установить C равным 1.0.

clf = svm.SVC(kernel="linear", C=1.0)
clf.fit(X, y)

Настройка модели с взвешенными классами

Мы настроим модель и получим разделяющую гиперплоскость с использованием функции SVC из библиотеки svm. Будем использовать линейный ядро и установить class_weight равным {1: 10}. Это даст большее значение меньшему классу.

wclf = svm.SVC(kernel="linear", class_weight={1: 10})
wclf.fit(X, y)

Построение графика для выборки

Мы построим график для выборки с использованием функции scatter из matplotlib.pyplot.

plt.scatter(X[:, 0], X[:, 1], c=y, cmap=plt.cm.Paired, edgecolors="k")

Построение функций принятия решений для обоих классификаторов

Мы построим графики функций принятия решений для обоих классификаторов с использованием функции DecisionBoundaryDisplay из библиотеки sklearn.inspection. Мы установим plot_method равным "contour", colors равным "k" для простого SVM и "r" для взвешенного SVM, levels равным [0], alpha равным 0.5 и linestyles равным ["-"]. Также установим ax равным plt.gca().

ax = plt.gca()
disp = DecisionBoundaryDisplay.from_estimator(
    clf,
    X,
    plot_method="contour",
    colors="k",
    levels=[0],
    alpha=0.5,
    linestyles=["-"],
    ax=ax,
)

wdisp = DecisionBoundaryDisplay.from_estimator(
    wclf,
    X,
    plot_method="contour",
    colors="r",
    levels=[0],
    alpha=0.5,
    linestyles=["-"],
    ax=ax,
)

Добавление легенды

Мы добавим легенду к графику с использованием функции legend из matplotlib.pyplot. Мы установим метки соответственно как "не взвешенный" и "взвешенный".

plt.legend(
    [disp.surface_.collections[0], wdisp.surface_.collections[0]],
    ["non weighted", "weighted"],
    loc="upper right",
)

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

Наконец, мы покажем график с использованием функции show из matplotlib.pyplot.

plt.show()

Резюме

В этом практическом занятии мы узнали, как использовать методы опорных векторов (Support Vector Machines, SVM) для несбалансированных классов. Мы использовали функцию make_blobs для создания двух кластеров случайных точек и создали две модели SVM: одну с использованием простого SVM и другую с автоматической коррекцией для несбалансированных классов. Мы построили графики для выборки и функций принятия решений для обоих классификаторов и добавили легенду к графику.