Reconocimiento de dígitos manuscritos

Machine LearningMachine LearningBeginner
Practicar Ahora

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

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Esta práctica demuestra cómo utilizar scikit-learn para reconocer imágenes de dígitos manuscritos del 0 al 9.

Consejos sobre la VM

Una vez finalizada la inicialización de la VM, haga clic en la esquina superior izquierda para cambiar a la pestaña Cuaderno y acceder a Jupyter Notebook para practicar.

A veces, es posible que tenga que esperar unos segundos a que Jupyter Notebook termine de cargarse. La validación de las operaciones no se puede automatizar debido a las limitaciones de Jupyter Notebook.

Si tiene problemas durante el aprendizaje, no dude en preguntar a Labby. Deje su retroalimentación después de la sesión y resolveremos rápidamente el problema para usted.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/metrics("Metrics") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/model_selection -.-> lab-49107{{"Reconocimiento de dígitos manuscritos"}} sklearn/metrics -.-> lab-49107{{"Reconocimiento de dígitos manuscritos"}} ml/sklearn -.-> lab-49107{{"Reconocimiento de dígitos manuscritos"}} end

Importar bibliotecas

En primer lugar, necesitamos importar las bibliotecas necesarias. Utilizaremos matplotlib para la visualización, datasets y metrics de sklearn para cargar y evaluar el conjunto de datos, y svm para entrenar la máquina de vectores de soporte.

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

Cargar y visualizar el conjunto de datos de dígitos

Cargaremos el conjunto de datos de dígitos que consta de imágenes de dígitos de 8x8 píxeles. Utilizaremos el método imshow() de matplotlib para visualizar las primeras 4 imágenes junto con sus correspondientes etiquetas.

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("Training: %i" % label)

Preparar el conjunto de datos

Necesitamos aplanar las imágenes para convertir cada matriz bidimensional de valores de escala de grises de forma (8, 8) en forma (64,). Esto nos dará un conjunto de datos de forma (n_muestras, n_características), donde n_muestras es el número de imágenes y n_características es el número total de píxeles en cada imagen.

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

Dividir el conjunto de datos

Dividiremos el conjunto de datos en subconjuntos de entrenamiento y prueba del 50% cada uno, utilizando el método train_test_split() de sklearn.model_selection.

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

Entrenar la máquina de vectores de soporte

Entrenaremos un clasificador de vectores de soporte en las muestras de entrenamiento utilizando el método svm.SVC() de sklearn.

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

Predecir y evaluar el modelo

Utilizaremos el modelo entrenado para predecir el valor de los dígitos para las muestras en el subconjunto de prueba. Luego, evaluaremos el modelo utilizando los métodos metrics.classification_report() y metrics.ConfusionMatrixDisplay.from_predictions() de sklearn.metrics.

predicted = clf.predict(X_test)

print(
    f"Classification report for classifier {clf}:\n"
    f"{metrics.classification_report(y_test, predicted)}\n"
)

disp = metrics.ConfusionMatrixDisplay.from_predictions(y_test, predicted)
disp.figure_.suptitle("Confusion Matrix")
print(f"Confusion matrix:\n{disp.confusion_matrix}")

Reconstruir el informe de clasificación a partir de la matriz de confusión

Si los resultados de la evaluación de un clasificador se almacenan en forma de una matriz de confusión y no en términos de y_true y y_pred, aún podemos construir un informe de clasificación utilizando el método metrics.classification_report() de la siguiente manera:

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(
    "Informe de clasificación reconstruido a partir de la matriz de confusión:\n"
    f"{metrics.classification_report(y_true, y_pred)}\n"
)

Resumen

En este laboratorio, aprendimos cómo utilizar scikit-learn para reconocer dígitos manuscritos del 0 al 9 utilizando una máquina de vectores de soporte. Cargamos y visualizamos el conjunto de datos de dígitos, preparamos y dividimos el conjunto de datos, entrenamos el modelo, hicimos predicciones y evaluamos el modelo utilizando un informe de clasificación y una matriz de confusión.