아이리스 데이터셋의 반지도 분류기

Beginner

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

소개

이 실습에서는 아이리스 데이터셋에 대한 반지도 분류기를 탐색합니다. 레이블 확산, 자기 학습, 그리고 서포트 벡터 머신 (SVM) 이 생성하는 결정 경계를 아이리스 데이터셋에서 비교해 봅니다. 파이썬 머신러닝 라이브러리인 scikit-learn 을 사용하여 분류기를 구현하고 결정 경계를 시각화합니다.

VM 팁

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

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

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

아이리스 데이터셋 로드 및 분할

머신러닝 분류 작업에서 널리 사용되는 아이리스 데이터셋을 로드합니다. 이 데이터셋은 각각 꽃받침 길이, 꽃받침 너비, 꽃잎 길이, 꽃잎 너비의 네 가지 특징을 가진 150 개의 아이리스 꽃 샘플을 포함합니다. 데이터셋을 입력 특징과 목표 레이블로 분할합니다.

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

## 아이리스 데이터셋 로드
iris = datasets.load_iris()

## 데이터셋을 입력 특징과 목표 레이블로 분할
X = iris.data[:, :2] ## 시각화를 위해 처음 두 특징만 사용합니다
y = iris.target

레이블 확산 분류기 설정

다양한 레이블 데이터 비율 (30%, 50%, 100%) 을 가진 세 개의 레이블 확산 분류기를 설정합니다. 레이블 확산은 레이블이 지정된 데이터 포인트에서 레이블이 지정되지 않은 데이터 포인트로 유사성을 기반으로 레이블을 전파하는 반지도 학습 알고리즘입니다.

from sklearn.semi_supervised import LabelSpreading

## 레이블 확산 분류기 설정
rng = np.random.RandomState(0)
y_rand = rng.rand(y.shape[0])
y_30 = np.copy(y)
y_30[y_rand < 0.3] = -1  ## 임의의 샘플을 레이블이 없는 것으로 설정
y_50 = np.copy(y)
y_50[y_rand < 0.5] = -1
ls30 = (LabelSpreading().fit(X, y_30), y_30, "레이블 확산 30% 데이터")
ls50 = (LabelSpreading().fit(X, y_50), y_50, "레이블 확산 50% 데이터")
ls100 = (LabelSpreading().fit(X, y), y, "레이블 확산 100% 데이터")

자기지도 분류기 설정

레이블 데이터의 비율이 다른 두 개의 자기지도 분류기를 설정합니다: 30% 와 50%. 자기지도는 레이블이 지정된 데이터로 분류기를 학습시킨 다음, 이를 사용하여 레이블이 지정되지 않은 데이터의 레이블을 예측하는 반지도 학습 알고리즘입니다. 가장 확신 있는 예측 결과는 레이블이 지정된 데이터에 추가되고, 수렴될 때까지 이 과정이 반복됩니다.

from sklearn.semi_supervised import SelfTrainingClassifier
from sklearn.svm import SVC

## 자기지도 분류기 설정
base_classifier = SVC(kernel="rbf", gamma=0.5, probability=True)
st30 = (
    SelfTrainingClassifier(base_classifier).fit(X, y_30),
    y_30,
    "자기지도 30% 데이터",
)
st50 = (
    SelfTrainingClassifier(base_classifier).fit(X, y_50),
    y_50,
    "자기지도 50% 데이터",
)

SVM 분류기 설정

RBF(Radial Basis Function) 커널을 사용한 SVM 분류기를 설정합니다. SVM 은 지도 학습 알고리즘으로 데이터를 서로 다른 클래스로 분리하는 최적의 초평면을 찾습니다.

from sklearn.svm import SVC

## SVM 분류기 설정
rbf_svc = (SVC(kernel="rbf", gamma=0.5).fit(X, y), y, "RBF 커널을 사용한 SVC")

결정 경계 시각화

입력 특징 공간을 커버하는 메쉬 그리드를 생성하고 각 분류기를 사용하여 메쉬 그리드의 점에 대한 레이블을 예측합니다. 그런 다음 결정 경계와 레이블이 지정된 데이터 점을 플롯합니다.

## 플롯을 위한 메쉬 그리드 생성
h = 0.02
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

## 레이블에 대한 색상 맵 정의
color_map = {-1: (1, 1, 1), 0: (0, 0, 0.9), 1: (1, 0, 0), 2: (0.8, 0.6, 0)}

## 분류기 설정
classifiers = (ls30, st30, ls50, st50, ls100, rbf_svc)

## 각 분류기의 결정 경계와 레이블이 지정된 데이터 점 플롯
for i, (clf, y_train, title) in enumerate(classifiers):
    ## 결정 경계 플롯
    plt.subplot(3, 2, i + 1)
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

    ## 결과를 색상 플롯에 넣기
    Z = Z.reshape(xx.shape)
    plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
    plt.axis("off")

    ## 레이블이 지정된 데이터 점 플롯
    colors = [color_map[y] for y in y_train]
    plt.scatter(X[:, 0], X[:, 1], c=colors, edgecolors="black")

    plt.title(title)

plt.suptitle("레이블이 지정되지 않은 점은 흰색으로 표시됨", y=0.1)
plt.show()

요약

이 실험에서는 아이리스 데이터셋에서 반지도 분류기를 탐색했습니다. 레이블 확산, 자기 학습 및 SVM 이 아이리스 데이터셋에서 생성하는 결정 경계를 비교했습니다. Scikit-learn 을 사용하여 분류기를 구현하고 결정 경계를 시각화했습니다. 레이블 확산과 자기 학습은 소량의 레이블이 지정된 데이터가 있더라도 좋은 결정 경계를 학습할 수 있음을 발견했습니다.