← Todos los proyectosAll projects
Scikit-learnMLPPCAt-SNEGridSearchCV

Clasificación de dígitos manuscritosHandwritten digit classification

Un proyecto de Machine Learning de principio a fin con 1.797 imágenes de dígitos escritos a mano: de los píxeles a vectores, reducción de dimensionalidad, redes neuronales (MLP) y un pipeline validado sin fuga de datos. An end-to-end Machine Learning project with 1,797 images of handwritten digits: from pixels to vectors, dimensionality reduction, neural networks (MLP) and a pipeline validated without data leakage.

DatosData: UCI · Optical Recognition of Handwritten Digits LicenciaLicense: CC BY 4.0 CódigoCode: digits_classification.py
PreguntaQuestion

¿Puede una red neuronal pequeña reconocer dígitos escritos a mano de forma fiable? ¿Y cuánto modelo hace falta de verdad? Can a small neural network reliably recognise handwritten digits? And how much model do you actually need?

01

Una imagen es un vector de 64 númerosAn image is a vector of 64 numbers

Cada dígito es una imagen de 8×8 píxeles con intensidades de 0 a 16. Para un modelo, eso es simplemente un punto en un espacio de 64 dimensiones. Dos imágenes parecidas son dos puntos cercanos, y sobre esa idea se construye todo lo demás. Each digit is an 8×8 image with intensities from 0 to 16. To a model, that's just a point in a 64-dimensional space. Two similar images are two nearby points, and everything else builds on that idea.

Un ejemplo de cada clase, tal como lo ve el modeloOne example of each class, as the model sees it

8×8 píxeles · 64 valores por imagen8×8 pixels · 64 values per image

02

PCA comprime, t-SNE separaPCA compresses, t-SNE separates

Con PCA, 40 componentes conservan el 95 % de la varianza (de 64 originales), pero en 2D solo se ve el 21,6 % y las clases se solapan. t-SNE, que conserva la vecindad local, separa los 10 dígitos en grupos casi limpios. PCA sirve para comprimir antes del modelo; t-SNE, para visualizar. With PCA, 40 components keep 95% of the variance (out of 64), but in 2D only 21.6% is visible and the classes overlap. t-SNE, which preserves local neighbourhoods, separates the 10 digits into almost clean clusters. PCA is for compressing before the model; t-SNE is for visualising.

1.000 dígitos proyectados en 2D1,000 digits projected to 2D

Cada punto es una imagen, coloreada por su dígito realEach dot is an image, coloured by its true digit

Varianza explicada acumulada (PCA)Cumulative explained variance (PCA)

La línea discontinua marca el 95 %Dashed line marks 95%

03

Más neuronas no es mejor modeloMore neurons isn't a better model

Probé seis arquitecturas de MLP. Una sola capa de 100 neuronas (7.510 parámetros) acierta el 98,0 %, prácticamente lo mismo que la red de 200-100-50 (38.660 parámetros, 98,1 %): una diferencia de una imagen sobre 540. Elegí la pequeña: entre dos modelos que rinden igual, el más simple. I tried six MLP architectures. A single 100-neuron layer (7,510 parameters) scores 98.0%, practically the same as the 200-100-50 network (38,660 parameters, 98.1%): a difference of one image out of 540. I chose the small one: between two models that perform the same, pick the simpler.

Accuracy en test frente a número de parámetrosTest accuracy vs number of parameters

Cada punto es una arquitectura de capas ocultasEach dot is a hidden-layer architecture

04

Un pipeline evaluado de forma limpiaA cleanly evaluated pipeline

Monté un pipeline StandardScaler → PCA → MLP y aparté el 30 % de test antes de la validación cruzada y del GridSearchCV (27 combinaciones de componentes, capas y regularización). Así, el test no influye en ninguna decisión y el resultado final es una estimación honesta. I built a StandardScaler → PCA → MLP pipeline and set aside 30% for testing before cross-validation and GridSearchCV (27 combinations of components, layers and regularisation). That way the test set influences no decision and the final result is an honest estimate.

05

Dónde se equivoca: el 8Where it fails: the 8

El MLP falla 11 de 540 imágenes. El 8 es el dígito más difícil (92,3 % de acierto), y 3 de sus 4 errores los confunde con un 1. Viendo las imágenes falladas, muchas son ambiguas incluso para una persona a 8×8 píxeles. The MLP misses 11 of 540 images. The 8 is the hardest digit (92.3% recall), and 3 of its 4 errors are confused with a 1. Looking at the misclassified images, many are ambiguous even for a person at 8×8 pixels.

Matriz de confusión (MLP de 100 neuronas)Confusion matrix (100-neuron MLP)

Filas: dígito real · columnas: predicho · fuera de la diagonal, los erroresRows: true digit · columns: predicted · off-diagonal cells are errors

Las 11 imágenes que fallaThe 11 images it gets wrong

Real → predichoTrue → predicted

06

Comparativa final: ganador sin ganador claroFinal comparison: no clear winner

La SVM con kernel RBF obtiene la mejor accuracy (98,3 %), seguida de la regresión logística (98,1 %) y el MLP (98,0 %). Pero entre el primero y el tercero hay solo 2 imágenes de diferencia sobre 540: con un único split, esas diferencias están dentro del ruido. Para decidir de verdad, compararía con validación cruzada repetida. The RBF-kernel SVM gets the best accuracy (98.3%), followed by logistic regression (98.1%) and the MLP (98.0%). But between first and third there are only 2 images of difference out of 540: with a single split, those differences are within the noise. To really decide, I'd compare with repeated cross-validation.

Accuracy en train y test por modeloTrain and test accuracy by model

El eje empieza en el 95 % para que se vean las diferencias, que son pequeñasThe axis starts at 95% to make the (small) differences visible

Limitaciones y siguientes pasosLimitations & next steps

  • Las imágenes son de 8×8 píxeles, mucho más sencillas que MNIST (28×28) o que fotos reales.The images are 8×8 pixels, much simpler than MNIST (28×28) or real photos.
  • Todo se compara con un único split train/test; las diferencias entre modelos son de pocas imágenes.Everything is compared on a single train/test split; differences between models are a handful of images.
  • Siguiente paso: una red convolucional (CNN), que aprovecha la estructura espacial de la imagen en lugar de tratarla como un vector plano.Next step: a convolutional network (CNN), which uses the image's spatial structure instead of treating it as a flat vector.
Siguiente proyectoNext project Costes de seguros médicos con PySparkMedical insurance costs with PySpark →