SVM 타이 브레이킹

Beginner

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

소개

이 실습에서는 SVM 결정 경계에 미치는 SVM 타이 브레이킹 (tie-breaking) 의 효과를 소개합니다. SVM 에서 타이 브레이킹은 두 개 이상의 클래스의 거리가 같을 때 발생하는 충돌을 해결하는 메커니즘입니다. decision_function_shape='ovr'일 때 기본적으로 활성화되어 있지 않으며, 비용이 많이 들기 때문입니다. 따라서 이 실습에서는 다중 클래스 분류 문제에 대한 break_ties 매개변수의 효과와 decision_function_shape='ovr'를 보여줍니다.

VM 팁

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

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

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

필요한 라이브러리 가져오기

이 단계에서는 SVM 과 시각화를 위해 필요한 라이브러리를 가져옵니다.

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

샘플 데이터 생성

이 단계에서는 scikit-learn 의 make_blobs 함수를 사용하여 샘플 데이터셋을 생성합니다. 이 데이터셋은 3 개의 클래스와 2 개의 특징을 포함합니다.

X, y = make_blobs(random_state=27)

타이 브레이킹 유무에 따른 SVM 모델 생성

이 단계에서는 타이 브레이킹을 비활성화한 SVM 모델과 활성화한 SVM 모델을 각각 생성합니다. scikit-learn 의 SVC 클래스를 사용하여 이러한 모델을 생성합니다. 두 모델에 대해 break_ties 매개변수는 각각 FalseTrue로 설정됩니다.

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]),
    )

결정 경계 시각화

이 단계에서는 이전 단계에서 생성된 결정 경계를 시각화합니다. SVM 모델의 coef_intercept_ 속성을 사용하여 결정 경계를 플롯합니다.

    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()

요약

이 실습에서는 SVM 결정 경계에 대한 타이 브레이킹의 효과를 보여주었습니다. 타이 브레이킹이 비활성화된 SVM 모델과 활성화된 SVM 모델을 각각 생성했습니다. 그리고 두 모델의 결정 경계를 플롯했습니다. 타이 브레이킹이 활성화된 모델의 결정 경계는 클래스가 동일한 영역에서 비볼록 (non-convex) 했습니다.