선형 SVM 매개변수 탐색

Beginner

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

소개

서포트 벡터 머신 (SVM) 은 분류 및 회귀 분석에 사용됩니다. SVM 은 데이터를 서로 다른 클래스로 분리하는 최상의 직선 또는 초평면을 찾습니다. 서로 다른 클래스의 두 가장 가까운 데이터 포인트 사이의 거리를 최대화하는 직선 또는 초평면을 마진이라고 합니다. 이 실습에서는 선형 SVM 에서 매개변수 C가 마진에 미치는 영향을 살펴볼 것입니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 Jupyter Notebook을 연습에 사용할 수 있습니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업의 유효성 검사를 자동화할 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

라이브러리 가져오기

필요한 라이브러리, numpy, matplotlib, scikit-learn 을 포함하여 가져옵니다.

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm

데이터 생성

NumPy 의 random.randn 함수를 사용하여 40 개의 분리 가능한 점을 생성합니다. 첫 20 개 점은 평균 [-2, -2]를 가지고, 다음 20 개 점은 평균 [2, 2]를 갖습니다. 그런 다음 첫 20 개 점에는 클래스 레이블 0 을, 다음 20 개 점에는 클래스 레이블 1 을 할당합니다.

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

모델 학습

Scikit-learn 의 SVC 클래스를 사용하여 SVM 모델을 학습합니다. 커널을 선형으로 설정하고, 정규화되지 않은 경우 페널티 매개변수 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

등고선 플롯

결정 함수의 등고선을 플롯합니다. 먼저 xxyy 배열을 사용하여 메쉬 그리드를 생성합니다. 그런 다음 메쉬 그리드를 2 차원 배열로 변환하고 SVC 클래스의 decision_function 메서드를 적용하여 예측 값을 얻습니다. 그런 다음 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()

요약

이 실험에서는 선형 SVM 에서 매개변수 C가 마진에 미치는 영향을 탐구했습니다. 데이터를 생성하고, 모델을 학습시키고, 마진을 계산하며, 결과를 플롯했습니다. 그런 다음 규제되지 않은 경우와 규제된 경우의 플롯을 표시했습니다.