Введение
Методы опорных векторов (SVM) используются для классификации и регрессионного анализа. Методы SVM находят наилучшую возможную прямую или гиперплоскость, которая разделяет данные на разные классы. Прямая или гиперплоскость, которая максимизирует расстояние между двумя ближайшими точками данных из разных классов, называется отступом. В этом практическом занятии мы исследуем, как параметр C влияет на отступ в линейном методе SVM.
Советы по работе с ВМ
После запуска ВМ кликните в левом верхнем углу, чтобы переключиться на вкладку Ноутбук и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook полностью загрузится. Проверка операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Импортируем библиотеки
Начнем с импорта необходимых библиотек, включая numpy, matplotlib и scikit-learn.
import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
Генерируем данные
Мы генерируем 40 разделимых точек с использованием функции random.randn из библиотеки numpy. Первые 20 точек имеют среднее значение [-2, -2], а следующие 20 точек имеют среднее значение [2, 2]. Затем мы присваиваем метку класса 0 первым 20 точкам и метку класса 1 следующим 20 точкам.
np.random.seed(0)
X = np.r_[np.random.randn(20, 2) - [2, 2], np.random.randn(20, 2) + [2, 2]]
Y = [0] * 20 + [1] * 20
Настраиваем модель
Мы настраиваем модель SVM с использованием класса SVC из библиотеки scikit-learn. Мы задаем ядро линейным и параметр штрафа C равным 1 для случая без регуляризации и 0,05 для случая с регуляризацией. Затем мы вычисляем разделяющую гиперплоскость с использованием коэффициентов и интерсепта модели.
for name, penalty in (("unreg", 1), ("reg", 0.05)):
clf = svm.SVC(kernel="linear", C=penalty)
clf.fit(X, Y)
w = clf.coef_[0]
a = -w[0] / w[1]
xx = np.linspace(-5, 5)
yy = a * xx - (clf.intercept_[0]) / w[1]
Вычисляем отступы
Мы вычисляем отступы для разделяющей гиперплоскости. Сначала мы вычисляем расстояние отступа с использованием коэффициентов модели. Затем мы вычисляем вертикальное расстояние от опорных векторов до гиперплоскости с использованием наклона гиперплоскости. Наконец, мы строим линию, точки и ближайшие векторы к плоскости.
margin = 1 / np.sqrt(np.sum(clf.coef_**2))
yy_down = yy - np.sqrt(1 + a**2) * margin
yy_up = yy + np.sqrt(1 + a**2) * margin
plt.plot(xx, yy, "k-")
plt.plot(xx, yy_down, "k--")
plt.plot(xx, yy_up, "k--")
plt.scatter(
clf.support_vectors_[:, 0],
clf.support_vectors_[:, 1],
s=80,
facecolors="none",
zorder=10,
edgecolors="k",
cmap=plt.get_cmap("RdBu"),
)
plt.scatter(
X[:, 0], X[:, 1], c=Y, zorder=10, cmap=plt.get_cmap("RdBu"), edgecolors="k"
)
plt.axis("tight")
x_min = -4.8
x_max = 4.2
y_min = -6
y_max = 6
Строим контур
Мы строим контур функции принятия решений. Сначала мы создаем сетку точек с использованием массивов xx и yy. Затем мы преобразуем сетку точек в двумерный массив и применяем метод decision_function класса SVC, чтобы получить предсказанные значения. Затем мы строим контур с использованием метода contourf.
YY, XX = np.meshgrid(yy, xx)
xy = np.vstack([XX.ravel(), YY.ravel()]).T
Z = clf.decision_function(xy).reshape(XX.shape)
plt.contourf(XX, YY, Z, cmap=plt.get_cmap("RdBu"), alpha=0.5, linestyles=["-"])
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
Отображаем графики
Мы отображаем графики для случаев без регуляризации и с регуляризацией.
plt.show()
Резюме
В этом практическом занятии мы изучили, как параметр C влияет на отступ в линейной SVM. Мы сгенерировали данные, настроили модель, вычислили отступы и построили результаты. Затем мы отобразили графики для случаев без регуляризации и с регуляризацией.