En el presente artículo haremos un ejercicio de reconocimiento facial con regresión logística. Vamos a seguir trabajando con el algoritmo con el que ya hemos trabajado en el blog, según el cual se debe encontrar, entre un número de imágenes dadas, las que tengan rostros similares o iguales al de George Bush.
Reconocimiento facial con regresión logística
Podemos mejorar el algoritmo, en lugar de usar un KNN (k-nearest neighbor o algoritmo de vecinos más cercanos) podemos usar una regresión logística sobre los componentes principales más importantes.
Para este caso nos quedamos con 150 componentes principales y vamos a coger la matriz de train, que vamos a pasar a un algoritmo de regresión logística.
Lo que haremos es quedarnos con los 150 primeros componentes principales de la matriz rotada, la que tenía 947 columnas, o sea todas las fotos transformadas. Estos son los datos que usaremos para hacer la predicción.
También creamos otra nueva columna llamada name, que es el nombre que se saca de la fila y que va a ser Bush u otro (“bush”, “other”).
#Reconocimiento facial con regresión logística number_of_pca_components <- 150 df train <- data.frame (pr_pics$x[ , 1 : number_of_pca_components]) df_train$name <- as.factor (rownames (pr_pics$x)) head (df_train)
Con esto hacemos un modelo de regresión binomial con los 150 componentes.
#Reconocimiento facial con regresión logística model <-glm (df_train, formula = "name~.", family = binomial) summary (model)
Los fitted values son los valores que nos está dando entre 0 y 1. En este caso, los espectros para esos valores son bastante anchos y, por eso, sale la advertencia que dice: “Warning message:
‘glm.fit: fitted probabilities numerically 0 or 1 ocurred’ “
summary (model$fitted.values)
Min: 0.000000
1st Qu: 0.005392
Median: 0.950338
Mean: 0.608236
3rd Qu: 0.999986
Max: 1.000000
Por lo contrario, en la matriz de confusión nos encontramos con buenos valores. Un accuracy de 0.96 (96%) es bastante bueno; no obstante, estos datos son de training, así que no te emociones mucho.
#Reconocimiento facial con regresión logística confusionMatrix (data = as.factor (ifelse (model$fitted.values < 00.5, 'bush', 'other')), reference = df_train$name)
Veamos, por tanto, la predicción. ¿Qué tenemos que hacer para calcular la predicción? Primero mostraremos la matriz de fotos original:
#Reconocimiento facial con regresión logística dim (test_matrix)
406 . 62500
La matriz original tiene 406 fotos y cada una de esas fotos tiene 62500 píxeles.
Esta información la pasamos al dominio PCA:
#Reconocimiento facial con regresión logística test_pics_pca <- predict (pr_pics, test_matrix) dim (test_pics_pca)
406 . 947
Una vez que estemos en este dominio PCA, donde tenemos 947 columnas, nos quedamos únicamente con las primeras 150 columnas.
#Reconocimiento facial con regresión logística df_test <- data.frame (test_pics_pca [ , 1 : number_of_pca_components]) dim (df_test)
406 . 150
Se queda con las primeras 150 columnas y hacemos lo mismo, añadimos una columna que se llame name y que corresponda a la columna de la matriz original:
df_test$name <- as.factor (rownames (test_pics_pca)) head (df_test)
Con el predict tenemos un valor que es el logaritmo de la razón de momios.
pred_test_glm <- predict (model, df_test) head (pred_test_glm)
bush: -10.6243029407688
bush.1: 2.14515000051053
bush.2: -6.73672564547873
bush.3: -15.7724125754304
bush.4: -9.30471693387415
bush.5: 1.6677216738126
#Reconocimiento facial con regresión logística df_result <- data.frame (real = df_test$name, pred = pred_test_glm, row.names = NULL)
summary (df_result)
Tenemos el summary result con el valor real y el valor predicho de esta nueva columna.
Aquí con un factor estamos diciendo que, si es un valor negativo, es Bush; por otro lado, si es un valor positivo, no es Bush, es decir, es cualquier otro.
Pintamos la matriz de confusión:
#Reconocimiento facial con regresión logística df_result$pred_name <- as.factor (ifelse (df_result$pred < 0, 'bush", "other')) confusionMatrix (data = df_result$pred_name, reference = df_result$real)
La matriz de confusión es bastante buena, ya que tiene un accuracy de 0.8547 (85%).
#Reconocimiento facial con regresión logística library (ROCR) #Con type="response" utilizamos la salida de la link function, #pasa por la función sigmoidal (inversa de logit) y devuelve un valor en el rango [0,1] df result$p <- predict (model, df_test, type = "response") pr <- prediction (df_resultsp, df_testsname) prf <- performance (pr, measure = "tpr", x.measure = "fpr") plot (prf)
La curva de ROC también sale muy bien, nada raro.
prf <- performance (pr, measure = "prec", x.measure = "rec") plot (prf)
performance (pr, measure = "auc") @y.values
1.0915845491813716
sucede con el auc lo mismo que con la curva de ROC, todo está bastante bien.
¿Quieres seguir aprendiendo sobre lo visto hoy?
Recuerda que si quieres seguir aprendiendo sobre esta temática, puedes seguir nuestro Big Data, Inteligencia Artificial & Machine Learning Full Stack Bootcamp, una formación intensiva de 8 meses en la que adquirirás todas las herramientas y conocimientos necesarios para incursionar en un mercado laboral lleno de oportunidades. ¡Anímate a impulsar tu vida y tu carrera y pide información!