Aprendizado Semi-Supervisionado com Propagação de Rótulos

Beginner

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

Introdução

Este laboratório demonstra como realizar aprendizado semi-supervisionado utilizando o algoritmo de Label Spreading. Usaremos um subconjunto do conjunto de dados de dígitos manuscritos, e apenas 40 dessas amostras serão rotuladas. Em seguida, usaremos o Label Spreading para prever as 300 amostras restantes.

Dicas da Máquina Virtual

Após o término da inicialização da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para acessar o Jupyter Notebook para praticar.

Às vezes, pode ser necessário aguardar alguns segundos para que o Jupyter Notebook termine de carregar. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se você enfrentar problemas durante o aprendizado, sinta-se à vontade para perguntar ao Labby. Forneça feedback após a sessão, e resolveremos o problema para você prontamente.

Carregar e Embaralha Dados

Primeiro, carregamos o conjunto de dados de dígitos e embaralhamos aleatoriamente os dados.

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

Preparar Dados para Aprendizado Semi-Supervisionado

Selecionamos 340 amostras, e apenas 40 dessas amostras estão associadas a um rótulo conhecido. Armazenamos os índices das outras 300 amostras para as quais não deveríamos conhecer seus rótulos. Em seguida, embaralhamos os rótulos para que as amostras não rotuladas sejam marcadas com -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

Treinar o Modelo de Propagação de Rótulos

Treinamos o modelo de Propagação de Rótulos com gamma=0.25 e max_iter=20.

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

Avaliar o Desempenho do Modelo

Avaliamos o desempenho do modelo gerando um relatório de classificação e uma matriz de confusão.

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

print(
    "Modelo de Propagação de Rótulos: %d pontos rotulados & %d pontos não rotulados (%d total)"
    % (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_
)

Plotar as Predições Mais Incertas

Selecionamos e mostramos as 10 predições mais incertas.

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(
        "predizer: %i\nverdadeiro: %i" % (lp_model.transduction_[image_index], y[image_index])
    )

f.suptitle("Aprendizagem com pequena quantidade de dados rotulados")
plt.show()

Resumo

Neste laboratório, demonstramos como realizar aprendizado semi-supervisionado utilizando o algoritmo de Propagação de Rótulos. Treinamos o modelo com uma pequena quantidade de dados rotulados e o utilizamos para prever os rótulos das amostras restantes. O modelo apresentou bom desempenho e previu corretamente os rótulos da maioria das amostras.