소개
이 실습에서는 아이리스 데이터셋에 대한 반지도 분류기를 탐색합니다. 레이블 확산, 자기 학습, 그리고 서포트 벡터 머신 (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 을 사용하여 분류기를 구현하고 결정 경계를 시각화했습니다. 레이블 확산과 자기 학습은 소량의 레이블이 지정된 데이터가 있더라도 좋은 결정 경계를 학습할 수 있음을 발견했습니다.