Reconhecimento de Dígitos Manuscritos

Beginner

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

Introdução

Este laboratório demonstra como usar o scikit-learn para reconhecer imagens de dígitos manuscritos de 0 a 9.

Dicas da Máquina Virtual

Após o arranque da máquina virtual, clique no canto superior esquerdo para mudar para a aba Notebook para aceder ao Jupyter Notebook para praticar.

Por vezes, pode ser necessário esperar alguns segundos para o Jupyter Notebook terminar o carregamento. A validação das operações não pode ser automatizada devido a limitações no Jupyter Notebook.

Se tiver problemas durante a aprendizagem, não hesite em contactar o Labby. Forneça feedback após a sessão e resolveremos prontamente o problema para si.

Importar Bibliotecas

Primeiro, precisamos importar as bibliotecas necessárias. Usaremos matplotlib para visualização, datasets e metrics do sklearn para carregar e avaliar o conjunto de dados, e svm para treinar a máquina de vetores de suporte.

import matplotlib.pyplot as plt
from sklearn import datasets, svm, metrics
from sklearn.model_selection import train_test_split

Carregar e Visualizar o Conjunto de Dados de Dígitos

Vamos carregar o conjunto de dados de dígitos, que consiste em imagens de dígitos de 8x8 pixels. Usaremos o método imshow() do matplotlib para visualizar as primeiras 4 imagens juntamente com as suas etiquetas correspondentes.

digits = datasets.load_digits()

_, axes = plt.subplots(nrows=1, ncols=4, figsize=(10, 3))
for ax, image, label in zip(axes, digits.images, digits.target):
    ax.set_axis_off()
    ax.imshow(image, cmap=plt.cm.gray_r, interpolation="nearest")
    ax.set_title("Treino: %i" % label)

Preparar o Conjunto de Dados

Precisamos achatá-las imagens para transformar cada matriz bidimensional de valores em escala de cinza da forma (8, 8) em forma (64,). Isto fornecerá um conjunto de dados com a forma (n_amostras, n_características), onde n_amostras é o número de imagens e n_características é o número total de pixels em cada imagem.

n_samples = len(digits.images)
data = digits.images.reshape((n_samples, -1))

Dividir o Conjunto de Dados

Vamos dividir o conjunto de dados em subconjuntos de treino e teste de 50% cada, utilizando o método train_test_split() da biblioteca sklearn.model_selection.

X_train, X_test, y_train, y_test = train_test_split(
    data, digits.target, test_size=0.5, shuffle=False
)

Treinar a Máquina de Vetores de Suporte

Vamos treinar um classificador de vetores de suporte nos exemplos de treino utilizando o método svm.SVC() da biblioteca sklearn.

clf = svm.SVC(gamma=0.001)
clf.fit(X_train, y_train)

Prever e Avaliar o Modelo

Usaremos o modelo treinado para prever o valor dos dígitos para as amostras no subconjunto de teste. Em seguida, avaliaremos o modelo usando os métodos metrics.classification_report() e metrics.ConfusionMatrixDisplay.from_predictions() da biblioteca sklearn.metrics.

predicted = clf.predict(X_test)

print(
    f"Relatório de classificação para o classificador {clf}:\n"
    f"{metrics.classification_report(y_test, predicted)}\n"
)

disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted)
disp.figure_.suptitle("Matriz de Confusão")
print(f"Matriz de confusão:\n{disp.confusion_matrix}")

Reconstruir o Relatório de Classificação a Partir da Matriz de Confusão

Se os resultados da avaliação de um classificador forem armazenados na forma de uma matriz de confusão, e não em termos de y_true e y_pred, ainda podemos construir um relatório de classificação usando o método metrics.classification_report() da seguinte forma:

y_true = []
y_pred = []
cm = disp.confusion_matrix

for gt in range(len(cm)):
    for pred in range(len(cm)):
        y_true += [gt] * cm[gt][pred]
        y_pred += [pred] * cm[gt][pred]

print(
    "Relatório de classificação reconstruído a partir da matriz de confusão:\n"
    f"{metrics.classification_report(y_true, y_pred)}\n"
)

Resumo

Neste laboratório, aprendemos a utilizar o scikit-learn para reconhecer dígitos manuscritos de 0 a 9 utilizando máquinas de vetores de suporte. Carregámos e visualizámos o conjunto de dados de dígitos, preparámos e dividimos o conjunto de dados, treinámos o modelo, previmos e avaliámos o modelo utilizando o relatório de classificação e a matriz de confusão.