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.