레이블 전파를 이용한 능동 학습

Beginner

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

소개

이 실험실은 레이블 전파를 사용하여 필기 숫자를 학습하는 능동 학습 기법을 보여줍니다. 레이블 전파는 그래프 기반 접근 방식을 사용하여 데이터 포인트 간에 레이블을 전파하는 반지도 학습 방법입니다. 능동 학습은 레이블을 지정할 데이터 포인트를 반복적으로 선택하고 이러한 레이블이 지정된 포인트를 사용하여 모델을 재훈련하는 프로세스입니다.

VM 팁

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

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

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

숫자 데이터셋 로드

scikit-learn 라이브러리에서 숫자 데이터셋을 로드하여 시작하겠습니다.

from sklearn import datasets

digits = datasets.load_digits()

데이터 섞기 및 분할

다음으로, 데이터셋을 레이블이 지정된 부분과 레이블이 지정되지 않은 부분으로 섞어 분할합니다. 먼저 레이블이 지정된 데이터 포인트는 10 개로 시작합니다.

import numpy as np

rng = np.random.RandomState(0)
indices = np.arange(len(digits.data))
rng.shuffle(indices)

X = digits.data[indices[:330]]
y = digits.target[indices[:330]]
images = digits.images[indices[:330]]

n_total_samples = len(y)
n_labeled_points = 10
unlabeled_indices = np.arange(n_total_samples)[n_labeled_points:]

레이블 전파 모델 학습

이제 레이블이 지정된 데이터 포인트로 레이블 전파 모델을 학습하고, 나머지 레이블이 지정되지 않은 데이터 포인트의 레이블을 예측하는 데 사용합니다.

from sklearn.semi_supervised import LabelSpreading

lp_model = LabelSpreading(gamma=0.25, max_iter=20)
lp_model.fit(X, y_train)
predicted_labels = lp_model.transduction_[unlabeled_indices]

가장 불확실한 포인트 선택

예측된 레이블 분포를 기반으로 가장 불확실한 상위 5 개 포인트를 선택하고, 사용자에게 이에 대한 레이블을 요청합니다.

from scipy import stats

pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)
uncertainty_index = np.argsort(pred_entropies)[::-1]
uncertainty_index = uncertainty_index[np.in1d(uncertainty_index, unlabeled_indices)][:5]

가장 불확실한 포인트에 레이블 추가

사용자로부터 레이블을 받아 레이블이 지정된 데이터 포인트에 추가하고, 이를 사용하여 모델을 다시 학습합니다.

y_train[uncertainty_index] = y[uncertainty_index]
lp_model.fit(X, y_train)

반복

가장 불확실한 상위 5 개 포인트를 선택하고, 이들의 레이블을 레이블된 데이터 포인트에 추가한 후 모델을 학습하는 과정을 레이블된 데이터 포인트가 30 개가 될 때까지 반복합니다.

max_iterations = 3

for i in range(max_iterations):
    if len(unlabeled_indices) == 0:
        print("레이블되지 않은 항목이 더 이상 없습니다.")
        break

    ## 상위 5 개의 불확실한 포인트 선택
    pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)
    uncertainty_index = np.argsort(pred_entropies)[::-1]
    uncertainty_index = uncertainty_index[np.in1d(uncertainty_index, unlabeled_indices)][:5]

    ## 레이블을 레이블된 데이터 포인트에 추가
    y_train[uncertainty_index] = y[uncertainty_index]

    ## 모델 학습
    lp_model.fit(X, y_train)

    ## 레이블된 데이터 포인트를 레이블되지 않은 집합에서 제거
    delete_indices = np.array([], dtype=int)
    for index, image_index in enumerate(uncertainty_index):
        (delete_index,) = np.where(unlabeled_indices == image_index)
        delete_indices = np.concatenate((delete_indices, delete_index))
    unlabeled_indices = np.delete(unlabeled_indices, delete_indices)
    n_labeled_points += len(uncertainty_index)

요약

이 실험에서는 레이블 전파 (Label Propagation) 기법을 활용하여 손글씨 숫자를 학습하는 능동 학습 기법을 보여주었습니다. 처음에는 10 개의 레이블된 데이터 포인트만으로 레이블 전파 모델을 학습시킨 후, 반복적으로 가장 불확실성이 높은 상위 5 개의 데이터 포인트를 선택하여 레이블을 추가했습니다. 이 과정을 통해 총 30 개의 레이블된 데이터 포인트를 확보했습니다. 이러한 능동 학습 기법은 모델의 성능을 극대화하면서 필요한 레이블된 데이터 포인트의 수를 최소화하는 데 유용할 수 있습니다.