El MNIST (“Instituto Nacional de Estándares y Tecnología Modificado”) es el conjunto de datos “hola mundo” de facto de la visión por computadora. Desde su lanzamiento en 1999, este clásico conjunto de datos de imágenes escritas a mano ha servido como base para los algoritmos de regresion. A medida que surgen nuevas técnicas de aprendizaje automático, MNIST sigue siendo un recurso confiable tanto para investigadores como para estudiantes. En este trabajo, el objetivo es identificar correctamente los dígitos de un conjunto de datos de decenas de miles de imágenes manuscritas. Sirve para experimentar desde la regresión a las redes neuronales.
Paso 1: Analizar el conjunto de datos de entrenamiento.
Para este trabajo final, se utilizó el conjunto de datos de entrenamiento y prueba preprocesados facilitados por el Profesor Jose Sosa. El conjunto de datos de entrenamiento, cd_digits_train_02.csv tiene 42000 filas y 785 columnas. La primera columna, llamada label, es el dígito dibujado por el usuario. El resto de las columnas contienen los valores de píxel de la imagen asociada.
Cada columna de píxeles en el conjunto de entrenamiento tiene un nombre como pixelx, donde x es un número entero entre 0 y 783, inclusive. Para ubicar este píxel en la imagen, supongamos que hemos descompuesto x como x = i * 28 + j, donde i y j son números enteros entre 0 y 27, inclusive. Luego, pixelx se ubica en la fila iy en la columna j de una matriz de 28 x 28, (indexando por cero).
train <- read.csv ("cd_digits_train_02.csv")
Crearemos una matriz 28*28 con los valores correspondientes al color de cada pixel
matriz_pix = matrix(unlist(train[1,-1]), nrow=28, byrow=TRUE)
Ahora, graficamos la matriz en la posicion 1 con la funcion image, la cual es perfecta para graficar matrices de pixeles.
image(m, col=grey.colors(255))

Se puede evidenciar que las los digitos estan rotados a la izquierda, por lo tanto para una mejor visualizacion, nos daremos a la tarea de rotar las matrices generadas. Definimos una funcion rotate.
rotate <- function(x) t(apply(x, 2, rev))
Ahora, graficamos las 6 primeras imagenes, haciendo uso de la funcion rotate que acabamos de definir. La funcion lapply aplica el primer argumento a la variable x definida dentro de function.
invisible(lapply(1:6,
function(x) image(
rotate(matrix(unlist(train[x,-1]),nrow=28, byrow=TRUE)),
col=grey.colors(255),
xlab=train[x,1]
)
))






Paso 2: Entrenar el Modelo con Random Forest
He elegido RandomForest par entrenar mi modelo, principalmente por su facilidad y porque permite visualizar facilmente los limites de decision. El Random Forest, también conocidos en castellano como ‘“Bosques Aleatorios”’ es una combinación de árboles predictores tal que cada árbol depende de los valores de un vector aleatorio probado independientemente y con la misma distribución para cada uno de estos.
Lo primero es eliminar la observacion label del dataset, y hago un sub-conjunto de la data a entrenar con 10.000 observaciones.
labels <- train[,1]
features <- train[,-1]
set.seed(123)
numTrain <- 10000
rows <- sample(1:nrow(train), numTrain)
labels <- as.factor(labels[rows])
train<- train[rows,-1]
Ahora, solo queda cargar la data de prueba y pasarla al algoritmo RandomForest. He usado 100 arboles.
test <- read.csv("cd_digits_test_02.csv")
rf <- randomForest(train, labels, xtest=test, ntree=100)
Ahora, creamos un dataframe con las predicciones. Los numeros se encuentran en rf$test$predicted. Mostramos los primeros registros, para asegurarnos que son de la forma correcta.
predictions <- data.frame(PredNum=levels(labels)[rf$test$predicted])
head(predictions)
Finalmente, creamos la salida en formato csv, para su entrega.
write.csv(predictions, "18184121_salida.csv", row.names=F, quote=F)
Referencias
Para la realizacion de este trabajo, algunas lecturas resultaron de mucha ayuda, especialmente ciertos Kernels de la competencia de Kaggle relacionada. https://www.kaggle.com/c/digit-recognizer
Estudio de Bosque Aleatorio:
Reconocedor de dígitos - PCA y SVM:
- Avanza durante el preprocesamiento, incluida la reducción de dimensionalidad con PCA.
- Utiliza la visualización para introducir intuitivamente el problema y los conceptos de ML.
- Construye un modelo de clasificación SVM.
- https://www.kaggle.com/cnjn22/digit-recognizer/code
Construye tu propia red neuronal en R:
Clasificador de distancia mínima:
LS0tDQp0aXRsZTogIlRyYWJham8gRmluYWwgTUQiDQphdXRob3I6ICJMZW9uZWwgQXRlbmNpbyBTYWxhemFyIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOiBkZWZhdWx0DQogIHBkZl9kb2N1bWVudDogZGVmYXVsdA0KLS0tDQoNCkVsIE1OSVNUICgiSW5zdGl0dXRvIE5hY2lvbmFsIGRlIEVzdMOhbmRhcmVzIHkgVGVjbm9sb2fDrWEgTW9kaWZpY2FkbyIpIGVzIGVsIGNvbmp1bnRvIGRlIGRhdG9zICJob2xhIG11bmRvIiBkZSBmYWN0byBkZSBsYSB2aXNpw7NuIHBvciBjb21wdXRhZG9yYS4gRGVzZGUgc3UgbGFuemFtaWVudG8gZW4gMTk5OSwgZXN0ZSBjbMOhc2ljbyBjb25qdW50byBkZSBkYXRvcyBkZSBpbcOhZ2VuZXMgZXNjcml0YXMgYSBtYW5vIGhhIHNlcnZpZG8gY29tbyBiYXNlIHBhcmEgbG9zIGFsZ29yaXRtb3MgZGUgcmVncmVzaW9uLiBBIG1lZGlkYSBxdWUgc3VyZ2VuIG51ZXZhcyB0w6ljbmljYXMgZGUgYXByZW5kaXphamUgYXV0b23DoXRpY28sIE1OSVNUIHNpZ3VlIHNpZW5kbyB1biByZWN1cnNvIGNvbmZpYWJsZSB0YW50byBwYXJhIGludmVzdGlnYWRvcmVzIGNvbW8gcGFyYSBlc3R1ZGlhbnRlcy4NCkVuIGVzdGUgdHJhYmFqbywgZWwgb2JqZXRpdm8gZXMgaWRlbnRpZmljYXIgY29ycmVjdGFtZW50ZSBsb3MgZMOtZ2l0b3MgZGUgdW4gY29uanVudG8gZGUgZGF0b3MgZGUgZGVjZW5hcyBkZSBtaWxlcyBkZSBpbcOhZ2VuZXMgbWFudXNjcml0YXMuIFNpcnZlIHBhcmEgZXhwZXJpbWVudGFyIGRlc2RlIGxhIHJlZ3Jlc2nDs24gYSBsYXMgcmVkZXMgbmV1cm9uYWxlcy4gDQoNCiMgUGFzbyAxOiBBbmFsaXphciBlbCBjb25qdW50byBkZSBkYXRvcyBkZSBlbnRyZW5hbWllbnRvLg0KUGFyYSBlc3RlIHRyYWJham8gZmluYWwsIHNlIHV0aWxpesOzIGVsIGNvbmp1bnRvIGRlIGRhdG9zIGRlIGVudHJlbmFtaWVudG8geSBwcnVlYmEgcHJlcHJvY2VzYWRvcyBmYWNpbGl0YWRvcyBwb3IgZWwgUHJvZmVzb3IgSm9zZSBTb3NhLiBFbCBjb25qdW50byBkZSBkYXRvcyBkZSBlbnRyZW5hbWllbnRvLCBgY2RfZGlnaXRzX3RyYWluXzAyLmNzdmAgdGllbmUgNDIwMDAgZmlsYXMgeSA3ODUgY29sdW1uYXMuIExhIHByaW1lcmEgY29sdW1uYSwgbGxhbWFkYSBgbGFiZWxgLCBlcyBlbCBkw61naXRvIGRpYnVqYWRvIHBvciBlbCB1c3VhcmlvLiBFbCByZXN0byBkZSBsYXMgY29sdW1uYXMgY29udGllbmVuIGxvcyB2YWxvcmVzIGRlIHDDrXhlbCBkZSBsYSBpbWFnZW4gYXNvY2lhZGEuDQoNCkNhZGEgY29sdW1uYSBkZSBww614ZWxlcyBlbiBlbCBjb25qdW50byBkZSBlbnRyZW5hbWllbnRvIHRpZW5lIHVuIG5vbWJyZSBjb21vIGBwaXhlbHhgLCBkb25kZSBgeGAgZXMgdW4gbsO6bWVybyBlbnRlcm8gZW50cmUgMCB5IDc4MywgaW5jbHVzaXZlLiBQYXJhIHViaWNhciBlc3RlIHDDrXhlbCBlbiBsYSBpbWFnZW4sIHN1cG9uZ2Ftb3MgcXVlIGhlbW9zIGRlc2NvbXB1ZXN0byB4IGNvbW8gYHggPSBpICogMjggKyBqYCwgZG9uZGUgaSB5IGogc29uIG7Dum1lcm9zIGVudGVyb3MgZW50cmUgMCB5IDI3LCBpbmNsdXNpdmUuIEx1ZWdvLCBwaXhlbHggc2UgdWJpY2EgZW4gbGEgZmlsYSBpeSBlbiBsYSBjb2x1bW5hIGogZGUgdW5hIG1hdHJpeiBkZSAyOCB4IDI4LCAoaW5kZXhhbmRvIHBvciBjZXJvKS4NCmBgYHtyfQ0KdHJhaW4gPC0gcmVhZC5jc3YgKCJjZF9kaWdpdHNfdHJhaW5fMDIuY3N2IikNCmBgYA0KDQpDcmVhcmVtb3MgdW5hIG1hdHJpeiAyOCoyOCBjb24gbG9zIHZhbG9yZXMgY29ycmVzcG9uZGllbnRlcyBhbCBjb2xvciBkZSBjYWRhIHBpeGVsDQpgYGB7cn0NCm1hdHJpel9waXggPSBtYXRyaXgodW5saXN0KHRyYWluWzEsLTFdKSwgbnJvdz0yOCwgYnlyb3c9VFJVRSkNCmBgYA0KQWhvcmEsIGdyYWZpY2Ftb3MgbGEgbWF0cml6IGVuIGxhIHBvc2ljaW9uIDEgY29uIGxhIGZ1bmNpb24gYGltYWdlYCwgbGEgY3VhbCBlcyBwZXJmZWN0YSBwYXJhIGdyYWZpY2FyIG1hdHJpY2VzIGRlIHBpeGVsZXMuDQpgYGB7cn0NCmltYWdlKG1hdHJpel9waXgsIGNvbD1ncmV5LmNvbG9ycygyNTUpKQ0KYGBgDQpTZSBwdWVkZSBldmlkZW5jaWFyIHF1ZSBsYXMgbG9zIGRpZ2l0b3MgZXN0YW4gcm90YWRvcyBhIGxhIGl6cXVpZXJkYSwgcG9yIGxvIHRhbnRvIHBhcmEgdW5hIG1lam9yIHZpc3VhbGl6YWNpb24sIG5vcyBkYXJlbW9zIGEgbGEgdGFyZWEgZGUgcm90YXIgbGFzIG1hdHJpY2VzIGdlbmVyYWRhcy4gRGVmaW5pbW9zIHVuYSBmdW5jaW9uIGByb3RhdGVgLg0KYGBge3J9DQpyb3RhdGUgPC0gZnVuY3Rpb24oeCkgdChhcHBseSh4LCAyLCByZXYpKSANCmBgYA0KDQpBaG9yYSwgZ3JhZmljYW1vcyBsYXMgNiBwcmltZXJhcyBpbWFnZW5lcywgaGFjaWVuZG8gdXNvIGRlIGxhIGZ1bmNpb24gcm90YXRlIHF1ZSBhY2FiYW1vcyBkZSBkZWZpbmlyLiBMYSBmdW5jaW9uIGxhcHBseSBhcGxpY2EgZWwgcHJpbWVyIGFyZ3VtZW50byBhIGxhIHZhcmlhYmxlIGB4YCBkZWZpbmlkYSBkZW50cm8gZGUgYGZ1bmN0aW9uYC4NCmBgYHtyfQ0KaW52aXNpYmxlKGxhcHBseSgxOjYsIA0KICAgICAgIGZ1bmN0aW9uKHgpIGltYWdlKA0KICAgICAgICAgcm90YXRlKG1hdHJpeCh1bmxpc3QodHJhaW5beCwtMV0pLG5yb3c9MjgsIGJ5cm93PVRSVUUpKSwNCiAgICAgICAgIGNvbD1ncmV5LmNvbG9ycygyNTUpLA0KICAgICAgICAgeGxhYj10cmFpblt4LDFdDQogICAgICAgKQ0KKSkNCmBgYA0KIyBQYXNvIDI6IEVudHJlbmFyIGVsIE1vZGVsbyBjb24gUmFuZG9tIEZvcmVzdA0KSGUgZWxlZ2lkbyBSYW5kb21Gb3Jlc3QgcGFyIGVudHJlbmFyIG1pIG1vZGVsbywgcHJpbmNpcGFsbWVudGUgcG9yIHN1IGZhY2lsaWRhZCB5IHBvcnF1ZSBwZXJtaXRlIHZpc3VhbGl6YXIgZmFjaWxtZW50ZSBsb3MgbGltaXRlcyBkZSBkZWNpc2lvbi4gRWwgUmFuZG9tIEZvcmVzdCwgdGFtYmnDqW4gY29ub2NpZG9zIGVuIGNhc3RlbGxhbm8gY29tbyAnIkJvc3F1ZXMgQWxlYXRvcmlvcyInIGVzIHVuYSBjb21iaW5hY2nDs24gZGUgw6FyYm9sZXMgcHJlZGljdG9yZXMgdGFsIHF1ZSBjYWRhIMOhcmJvbCBkZXBlbmRlIGRlIGxvcyB2YWxvcmVzIGRlIHVuIHZlY3RvciBhbGVhdG9yaW8gcHJvYmFkbyBpbmRlcGVuZGllbnRlbWVudGUgeSBjb24gbGEgbWlzbWEgZGlzdHJpYnVjacOzbiBwYXJhIGNhZGEgdW5vIGRlIGVzdG9zLg0KDQpMbyBwcmltZXJvIGVzIGVsaW1pbmFyIGxhIG9ic2VydmFjaW9uIGBsYWJlbGAgZGVsIGRhdGFzZXQsIHkgaGFnbyB1biBzdWItY29uanVudG8gZGUgbGEgZGF0YSBhIGVudHJlbmFyIGNvbiBgMTAuMDAwYCBvYnNlcnZhY2lvbmVzLg0KYGBge3J9DQpsYWJlbHMgPC0gdHJhaW5bLDFdDQpmZWF0dXJlcyA8LSB0cmFpblssLTFdDQoNCnNldC5zZWVkKDEyMykNCg0KbnVtVHJhaW4gPC0gMTAwMDANCg0Kcm93cyA8LSBzYW1wbGUoMTpucm93KHRyYWluKSwgbnVtVHJhaW4pDQpsYWJlbHMgPC0gYXMuZmFjdG9yKGxhYmVsc1tyb3dzXSkNCnRyYWluPC0gdHJhaW5bcm93cywtMV0NCg0KYGBgDQpBaG9yYSwgc29sbyBxdWVkYSBjYXJnYXIgbGEgZGF0YSBkZSBwcnVlYmEgeSBwYXNhcmxhIGFsIGFsZ29yaXRtbyBSYW5kb21Gb3Jlc3QuIEhlIHVzYWRvIGAxMDBgIGFyYm9sZXMuDQpgYGB7cn0NCnRlc3QgPC0gcmVhZC5jc3YoImNkX2RpZ2l0c190ZXN0XzAyLmNzdiIpDQpyZiA8LSByYW5kb21Gb3Jlc3QodHJhaW4sIGxhYmVscywgeHRlc3Q9dGVzdCwgbnRyZWU9MTAwKQ0KYGBgDQpBaG9yYSwgY3JlYW1vcyB1biBkYXRhZnJhbWUgY29uIGxhcyBwcmVkaWNjaW9uZXMuIExvcyBudW1lcm9zIHNlIGVuY3VlbnRyYW4gZW4gYHJmJHRlc3QkcHJlZGljdGVkYC4gTW9zdHJhbW9zIGxvcyBwcmltZXJvcyByZWdpc3Ryb3MsIHBhcmEgYXNlZ3VyYXJub3MgcXVlIHNvbiBkZSBsYSBmb3JtYSBjb3JyZWN0YS4NCmBgYHtyfQ0KcHJlZGljdGlvbnMgPC0gZGF0YS5mcmFtZShQcmVkTnVtPWxldmVscyhsYWJlbHMpW3JmJHRlc3QkcHJlZGljdGVkXSkNCmhlYWQocHJlZGljdGlvbnMpDQpgYGANCkZpbmFsbWVudGUsIGNyZWFtb3MgbGEgc2FsaWRhIGVuIGZvcm1hdG8gY3N2LCBwYXJhIHN1IGVudHJlZ2EuDQpgYGB7cn0NCndyaXRlLmNzdihwcmVkaWN0aW9ucywgIjE4MTg0MTIxX3NhbGlkYS5jc3YiLCByb3cubmFtZXM9RiwgcXVvdGU9RikNCmBgYA0KDQojIFJlZmVyZW5jaWFzDQpQYXJhIGxhIHJlYWxpemFjaW9uIGRlIGVzdGUgdHJhYmFqbywgYWxndW5hcyBsZWN0dXJhcyByZXN1bHRhcm9uIGRlIG11Y2hhIGF5dWRhLCBlc3BlY2lhbG1lbnRlIGNpZXJ0b3MgS2VybmVscyBkZSBsYSBjb21wZXRlbmNpYSBkZSBLYWdnbGUgcmVsYWNpb25hZGEuIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vYy9kaWdpdC1yZWNvZ25pemVyDQoNCkVzdHVkaW8gZGUgQm9zcXVlIEFsZWF0b3JpbzoNCg0KKiBVbiBlamVtcGxvIG3DrW5pbW8gcXVlIGltcGxlbWVudGEgZWwgYWxnb3JpdG1vIGRlIGJvc3F1ZSBhbGVhdG9yaW8uDQoqIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vYmVuaGFtbmVyL3JhbmRvbS1mb3Jlc3QtYmVuY2htYXJrLTEvY29kZQ0KDQpSZWNvbm9jZWRvciBkZSBkw61naXRvcyAtIFBDQSB5IFNWTToNCg0KKiBBdmFuemEgZHVyYW50ZSBlbCBwcmVwcm9jZXNhbWllbnRvLCBpbmNsdWlkYSBsYSByZWR1Y2Npw7NuIGRlIGRpbWVuc2lvbmFsaWRhZCBjb24gUENBLg0KKiBVdGlsaXphIGxhIHZpc3VhbGl6YWNpw7NuIHBhcmEgaW50cm9kdWNpciBpbnR1aXRpdmFtZW50ZSBlbCBwcm9ibGVtYSB5IGxvcyBjb25jZXB0b3MgZGUgTUwuDQoqIENvbnN0cnV5ZSB1biBtb2RlbG8gZGUgY2xhc2lmaWNhY2nDs24gU1ZNLg0KKiBodHRwczovL3d3dy5rYWdnbGUuY29tL2Nuam4yMi9kaWdpdC1yZWNvZ25pemVyL2NvZGUNCiANCg0KQ29uc3RydXllIHR1IHByb3BpYSByZWQgbmV1cm9uYWwgZW4gUjoNCg0KKiBJbXBsZW1lbnRhIHVuYSByZWQgbmV1cm9uYWwgc2ltcGxlIGRlIDIgY2FwYXMgZGVzZGUgY2Vyby4NCiogQmFzYWRvIGVuIGVsIGN1cnNvIENTMjMxbiBvZnJlY2lkbyBwb3IgU3RhbmZvcmQuDQoqIGh0dHBzOi8vd3d3LmthZ2dsZS5jb20vcnVzc3dpbGwvZGlnaXQtcmVjb2duaXplci9idWlsZC15b3VyLW93bi1uZXVyYWwtbmV0d29yay1pbi1yDQoNCkNsYXNpZmljYWRvciBkZSBkaXN0YW5jaWEgbcOtbmltYToNCg0KKiBVdGlsaXphIGxhIGRpc3RhbmNpYSBtw61uaW1hIGNvbW8gdW4gZW5mb3F1ZSBzaW1wbGUgcGFyYSBsYSBjbGFzaWZpY2FjacOzbi4NCiogaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9vbGhhY2hlci9kaWdpdC1yZWNvZ25pemVyL21pbmltdW0tZGlzdGFuY2UtY2xhc3NpZmllcg0K