레이블 확산을 이용한 반지도 학습

Beginner

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

소개

이 실습에서는 레이블 확산 알고리즘을 사용하여 반지도 학습을 수행하는 방법을 보여줍니다. 손글씨 숫자 데이터셋의 일부를 사용하며, 이 중 40 개의 샘플만 레이블이 지정됩니다. 그런 다음 레이블 확산을 사용하여 나머지 300 개의 샘플을 예측합니다.

VM 팁

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

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

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

데이터 로드 및 셔플

먼저 숫자 데이터셋을 로드하고 데이터를 무작위로 섞습니다.

digits = datasets.load_digits()
rng = np.random.RandomState(2)
indices = np.arange(len(digits.data))
rng.shuffle(indices)

반지도 학습을 위한 데이터 준비

340 개의 샘플을 선택하고, 이 중 40 개의 샘플만 알려진 레이블을 갖습니다. 레이블을 알 수 없는 나머지 300 개 샘플의 인덱스를 저장합니다. 그런 다음 레이블을 섞어서 레이블이 없는 샘플은 -1 로 표시합니다.

X = digits.data[indices[:340]]
y = digits.target[indices[:340]]

n_total_samples = len(y)
n_labeled_points = 40

indices = np.arange(n_total_samples)

unlabeled_set = indices[n_labeled_points:]

y_train = np.copy(y)
y_train[unlabeled_set] = -1

레이블 확산 모델 학습

gamma=0.25 및 max_iter=20 으로 레이블 확산 모델을 학습합니다.

lp_model = LabelSpreading(gamma=0.25, max_iter=20)
lp_model.fit(X, y_train)

모델 성능 평가

모델의 성능을 평가하기 위해 분류 보고서와 혼동 행렬을 생성합니다.

predicted_labels = lp_model.transduction_[unlabeled_set]
true_labels = y[unlabeled_set]

print(
    "레이블 확산 모델: %d 레이블 지정된 점 & %d 레이블 미지정 점 (%d 총)"
    % (n_labeled_points, n_total_samples - n_labeled_points, n_total_samples)
)

print(classification_report(true_labels, predicted_labels))

ConfusionMatrixDisplay.from_predictions(
    true_labels, predicted_labels, labels=lp_model.classes_
)

가장 불확실한 예측 시각화

가장 불확실한 상위 10 개 예측을 선택하고 표시합니다.

pred_entropies = stats.distributions.entropy(lp_model.label_distributions_.T)

uncertainty_index = np.argsort(pred_entropies)[-10:]

f = plt.figure(figsize=(7, 5))
for index, image_index in enumerate(uncertainty_index):
    image = images[image_index]

    sub = f.add_subplot(2, 5, index + 1)
    sub.imshow(image, cmap=plt.cm.gray_r)
    plt.xticks([])
    plt.yticks([])
    sub.set_title(
        "예측: %i\n실제: %i" % (lp_model.transduction_[image_index], y[image_index])
    )

f.suptitle("소량의 레이블 데이터로 학습")
plt.show()

요약

이 실험에서는 레이블 확산 알고리즘을 사용하여 반지도 학습을 수행하는 방법을 보여주었습니다. 소량의 레이블 데이터로 모델을 학습시키고 나머지 샘플의 레이블을 예측하는 데 사용했습니다. 모델은 잘 작동하여 대부분의 샘플 레이블을 정확하게 예측했습니다.