SVM 을 이용한 아이리스 꽃 이진 분류

Beginner

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

소개

이 튜토리얼에서는 분류를 위해 서로 다른 SVM 커널을 사용하는 과정을 안내합니다. 우리는 꽃의 측정값이 포함된 아이리스 (Iris) 데이터셋을 사용할 것입니다. 이 데이터셋에는 세 가지 클래스가 있지만 이중 두 가지 클래스만을 사용하여 이진 분류를 수행할 것입니다.

VM 팁

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

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

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

데이터 로드

시작하기 전에 아이리스 (Iris) 데이터셋을 로드하고 시각화를 위해 처음 두 개의 특징만 선택합니다.

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

iris = datasets.load_iris()
X = iris.data
y = iris.target

X = X[y != 0, :2]
y = y[y != 0]

데이터 준비

다음으로, 훈련 및 테스트를 위한 데이터를 준비합니다. 데이터를 훈련용 90% 와 테스트용 10% 로 분할합니다.

n_sample = len(X)

np.random.seed(0)
order = np.random.permutation(n_sample)
X = X[order]
y = y[order].astype(float)

X_train = X[: int(0.9 * n_sample)]
y_train = y[: int(0.9 * n_sample)]
X_test = X[int(0.9 * n_sample) :]
y_test = y[int(0.9 * n_sample) :]

서로 다른 커널을 사용한 모델 학습

이제 선형, rbf, poly 세 가지 서로 다른 커널을 사용하여 SVM 모델을 학습시키겠습니다. 각 커널에 대해 훈련 데이터에 모델을 맞추고, 결정 경계를 플롯하고, 테스트 데이터의 정확도를 보여줍니다.

## 모델 학습
for kernel in ("linear", "rbf", "poly"):
    clf = svm.SVC(kernel=kernel, gamma=10)
    clf.fit(X_train, y_train)

    plt.figure()
    plt.clf()
    plt.scatter(
        X[:, 0], X[:, 1], c=y, zorder=10, cmap=plt.cm.Paired, edgecolor="k", s=20
    )

    ## 테스트 데이터를 원으로 표시
    plt.scatter(
        X_test[:, 0], X_test[:, 1], s=80, facecolors="none", zorder=10, edgecolor="k"
    )

    plt.axis("tight")
    x_min = X[:, 0].min()
    x_max = X[:, 0].max()
    y_min = X[:, 1].min()
    y_max = X[:, 1].max()

    XX, YY = np.mgrid[x_min:x_max:200j, y_min:y_max:200j]
    Z = clf.decision_function(np.c_[XX.ravel(), YY.ravel()])

    ## 결과를 색상 플롯으로 표시
    Z = Z.reshape(XX.shape)
    plt.pcolormesh(XX, YY, Z > 0, cmap=plt.cm.Paired)
    plt.contour(
        XX,
        YY,
        Z,
        colors=["k", "k", "k"],
        linestyles=["--", "-", "--"],
        levels=[-0.5, 0, 0.5],
    )

    plt.title(kernel)
    plt.show()

    print(f"Accuracy with {kernel} kernel: {clf.score(X_test, y_test)}")

결과 해석

선형 커널은 선형적인 결정 경계를 생성하는 반면, rbf 및 poly 커널은 더 복잡한 경계를 생성하는 것을 볼 수 있습니다. 테스트 데이터의 정확도는 rbf 커널이 가장 높고, 그 다음 poly 커널, 그리고 마지막으로 선형 커널 순입니다.

요약

이 튜토리얼에서는 분류를 위해 서로 다른 SVM 커널을 사용하는 방법을 배웠습니다. 세 가지 다른 커널로 SVM 모델을 학습시키고 각각의 결정 경계를 시각화했습니다. 또한 각 커널에 대한 테스트 데이터의 정확도를 계산했습니다. 결과적으로 rbf 커널이 아이리스 데이터셋에 대해 가장 좋은 결과를 보여주었습니다.