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.