Cargamos un archivo .csv con informacion sobre una camera en particular. El archivo contiene los valores de cross correlation para la camara evaluada (tested) junto a los resultados de otras camaras (others). Se crea un data.frame con 3 variables. El valor de threshold, la clase (tested,others) y un id
camera=read_delim("~/Dropbox/ongoing-work/git-repos/rp2017/data/camera/Canon_Ixus70_0.cvs",delim='\t')
Parsed with column specification:
cols(
`Misma ` = col_double(),
` Otra` = col_double(),
` Prom A` = col_double(),
` Prom B` = col_double(),
` stdDev A` = col_double(),
` stdDev B` = col_double(),
` A/B ` = col_double()
)
names(camera)<-c("tested","others")
camera<-as.data.frame(rbind(cbind(na.omit(camera$tested),rep(names(camera)[1])),cbind(na.omit(camera$others),rep(names(camera)[2]))))
names(camera)<-c("threshold","class")
camera$threshold<-as.numeric(as.character(camera$threshold))
camera$class<-as.character(camera$class)
camera$id<-1:nrow(camera)
camera
Un grafico (scatter plot) nos permite ver la distribucion de cada uno de los valores de Cross Correlation para el conjunto de datos seleccionado. En el eje Y tenemos el valor de Cross Correlation y en el eje X tenemos el identificador de la foto. Es decir cada punto en X es una foto distinta. En rojo, se marcan las fotos que pertenecen a otras camaras (others), mientras que en azul a la camera evaluada (tested)

Utilizando un grafico de cajas, podemos observar la distribucion de cada clase (tested,others) respecto sus valores de thresholds. Este grafico nos permite visualmente definir un crierio para definir el valor del threshold.

Definimos un valor umbral, en este caso 0.01. A partid de ese valor todos los casos que superen dicho valor seran considerandos que pertenecen a la clase tested. Seleccionamos solamente la variable class y la recientemente creada variable predicted
camera_predictions<-camera %>% mutate(predicted=ifelse(threshold>0.01,"tested","others")) %>% select(class,predicted)
camera_predictions
Se puede entonces crear una matriz de confusion. En donde tendremos cuatro posibles casos:
True Postives = aquellas fotos que pertenecen a la clase ‘tested’ que fueron correctamente predecidas como ‘tested’
True Negatives = aquellas fotos que pertenecen a la clase ‘others’ que fueron correctamente predecidas como ‘others’
False Postives = aquellas fotos que pertenecen a la clase ‘others’ que fueron correctamente predecidas como ‘tested’
False Negatives = aquellas fotos que pertenecen a la clase ‘tested’ que fueron correctamente predecidas como ‘others’
table(confusion_matrix)
confusion_matrix
FN FP TN TP
4 3 87 12
A partir de la confusion matrix podemos calcular varias metricas. Por ejemplo el recall El recall nos dice que porcentaje de aquellas fotograficas reconocidas por el algoritmo como que pertenecen a la clase tested, son de hecho de la clase tested. Para esto se aplica la siguiente formula. TP/(TP+FN). Es decir los True Postive sobre el total del fotos reconocidas como testes(i.e. el True postive + False negative) Mas info en (https://en.wikipedia.org/wiki/Confusion_matrix)
Por otor lado Si utilizamos la funcion confusionMatrix() nos ahorramos mucho trabajo y tenemos todas las metricas
confusionMatrix(camera_predictions$class, camera_predictions$predicted,positive = 'tested')
Confusion Matrix and Statistics
Reference
Prediction others tested
others 87 3
tested 4 12
Accuracy : 0.934
95% CI : (0.8687, 0.973)
No Information Rate : 0.8585
P-Value [Acc > NIR] : 0.01247
Kappa : 0.7356
Mcnemar's Test P-Value : 1.00000
Sensitivity : 0.8000
Specificity : 0.9560
Pos Pred Value : 0.7500
Neg Pred Value : 0.9667
Prevalence : 0.1415
Detection Rate : 0.1132
Detection Prevalence : 0.1509
Balanced Accuracy : 0.8780
'Positive' Class : tested
LS0tCnRpdGxlOiAiQ2FtZXJhIElkZW50aWZpY2F0aW9uIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpDYXJnYW1vcyB1biBhcmNoaXZvICouY3N2KiBjb24gaW5mb3JtYWNpb24gc29icmUgdW5hIGNhbWVyYSBlbiBwYXJ0aWN1bGFyLiBFbCBhcmNoaXZvIGNvbnRpZW5lIGxvcyB2YWxvcmVzIGRlIGNyb3NzIGNvcnJlbGF0aW9uIHBhcmEgbGEgY2FtYXJhIGV2YWx1YWRhICh0ZXN0ZWQpIGp1bnRvIGEgbG9zIHJlc3VsdGFkb3MgZGUgb3RyYXMgY2FtYXJhcyAob3RoZXJzKS4gU2UgY3JlYSB1biBkYXRhLmZyYW1lIGNvbiAzIHZhcmlhYmxlcy4gRWwgdmFsb3IgZGUgKnRocmVzaG9sZCosIGxhICpjbGFzZSogKHRlc3RlZCxvdGhlcnMpIHkgdW4gKmlkKgoKYGBge3J9CmNhbWVyYT1yZWFkX2RlbGltKCJ+L0Ryb3Bib3gvb25nb2luZy13b3JrL2dpdC1yZXBvcy9ycDIwMTcvZGF0YS9jYW1lcmEvQ2Fub25fSXh1czcwXzAuY3ZzIixkZWxpbT0nXHQnKQpuYW1lcyhjYW1lcmEpPC1jKCJ0ZXN0ZWQiLCJvdGhlcnMiKQoKCmNhbWVyYTwtYXMuZGF0YS5mcmFtZShyYmluZChjYmluZChuYS5vbWl0KGNhbWVyYSR0ZXN0ZWQpLHJlcChuYW1lcyhjYW1lcmEpWzFdKSksY2JpbmQobmEub21pdChjYW1lcmEkb3RoZXJzKSxyZXAobmFtZXMoY2FtZXJhKVsyXSkpKSkKbmFtZXMoY2FtZXJhKTwtYygidGhyZXNob2xkIiwiY2xhc3MiKQpjYW1lcmEkdGhyZXNob2xkPC1hcy5udW1lcmljKGFzLmNoYXJhY3RlcihjYW1lcmEkdGhyZXNob2xkKSkKY2FtZXJhJGNsYXNzPC1hcy5jaGFyYWN0ZXIoY2FtZXJhJGNsYXNzKQpjYW1lcmEkaWQ8LTE6bnJvdyhjYW1lcmEpCmNhbWVyYQpgYGAKClVuIGdyYWZpY28gKHNjYXR0ZXIgcGxvdCkgIG5vcyBwZXJtaXRlIHZlciBsYSBkaXN0cmlidWNpb24gZGUgY2FkYSB1bm8gZGUgbG9zIHZhbG9yZXMgZGUgQ3Jvc3MgQ29ycmVsYXRpb24gcGFyYSBlbCBjb25qdW50byBkZSBkYXRvcyBzZWxlY2Npb25hZG8uIEVuIGVsIGVqZSBZIHRlbmVtb3MgZWwgdmFsb3IgZGUgQ3Jvc3MgQ29ycmVsYXRpb24geSBlbiBlbCBlamUgWCB0ZW5lbW9zIGVsIGlkZW50aWZpY2Fkb3IgZGUgbGEgZm90by4gRXMgZGVjaXIgY2FkYSBwdW50byBlbiBYIGVzIHVuYSBmb3RvIGRpc3RpbnRhLiBFbiByb2pvLCBzZSBtYXJjYW4gbGFzIGZvdG9zIHF1ZSBwZXJ0ZW5lY2VuIGEgb3RyYXMgY2FtYXJhcyAob3RoZXJzKSwgbWllbnRyYXMgcXVlIGVuIGF6dWwgYSBsYSBjYW1lcmEgZXZhbHVhZGEgKHRlc3RlZCkKCmBgYHtyfQpnZ3Bsb3QoY2FtZXJhKSArCiAgZ2VvbV9wb2ludChhZXMoeD1pZCx5PXRocmVzaG9sZCxjb2xvcj1jbGFzcykpKwogIHlsYWIoImNyb3NzY29yX3ZhbHVlIikrCiAgdGhlbWVfYncoKQpgYGAKCgoKVXRpbGl6YW5kbyB1biBncmFmaWNvIGRlIGNhamFzLCBwb2RlbW9zIG9ic2VydmFyIGxhIGRpc3RyaWJ1Y2lvbiBkZSBjYWRhIGNsYXNlICh0ZXN0ZWQsb3RoZXJzKSByZXNwZWN0byBzdXMgdmFsb3JlcyBkZSB0aHJlc2hvbGRzLiBFc3RlIGdyYWZpY28gbm9zIHBlcm1pdGUgdmlzdWFsbWVudGUgZGVmaW5pciB1biBjcmllcmlvIHBhcmEgZGVmaW5pciBlbCB2YWxvciBkZWwgdGhyZXNob2xkLgoKYGBge3J9CmdncGxvdChjYW1lcmEpICsKICBnZW9tX2JveHBsb3QoYWVzKHg9Y2xhc3MseT10aHJlc2hvbGQsY29sb3I9Y2xhc3MpKSsKICB5bGFiKCJjcm9zc2Nvcl92YWx1ZSIpKwogIHRoZW1lX2J3KCkKYGBgCgoKRGVmaW5pbW9zIHVuIHZhbG9yIHVtYnJhbCwgZW4gZXN0ZSBjYXNvICoqMC4wMSoqLiBBIHBhcnRpZCBkZSBlc2UgdmFsb3IgdG9kb3MgbG9zIGNhc29zIHF1ZSAgc3VwZXJlbiBkaWNobyB2YWxvciBzZXJhbiBjb25zaWRlcmFuZG9zIHF1ZSBwZXJ0ZW5lY2VuIGEgbGEgY2xhc2UgKnRlc3RlZCouIFNlbGVjY2lvbmFtb3Mgc29sYW1lbnRlIGxhIHZhcmlhYmxlICoqY2xhc3MqKiB5IGxhIHJlY2llbnRlbWVudGUgY3JlYWRhIHZhcmlhYmxlICoqcHJlZGljdGVkKioKYGBge3J9CmNhbWVyYV9wcmVkaWN0aW9uczwtY2FtZXJhICU+JSBtdXRhdGUocHJlZGljdGVkPWlmZWxzZSh0aHJlc2hvbGQ+MC4wMSwidGVzdGVkIiwib3RoZXJzIikpICU+JSBzZWxlY3QoY2xhc3MscHJlZGljdGVkKSAKY2FtZXJhX3ByZWRpY3Rpb25zCmBgYAoKClNlIHB1ZWRlIGVudG9uY2VzIGNyZWFyIHVuYSBtYXRyaXogZGUgY29uZnVzaW9uLiBFbiBkb25kZSB0ZW5kcmVtb3MgY3VhdHJvIHBvc2libGVzIGNhc29zOgoKMS4gVHJ1ZSBQb3N0aXZlcyA9IGFxdWVsbGFzIGZvdG9zIHF1ZSBwZXJ0ZW5lY2VuIGEgbGEgY2xhc2UgJ3Rlc3RlZCcgcXVlIGZ1ZXJvbiBjb3JyZWN0YW1lbnRlIHByZWRlY2lkYXMgY29tbyAndGVzdGVkJwoKMi4gVHJ1ZSBOZWdhdGl2ZXMgPSBhcXVlbGxhcyBmb3RvcyBxdWUgcGVydGVuZWNlbiBhIGxhIGNsYXNlICdvdGhlcnMnIHF1ZSBmdWVyb24gY29ycmVjdGFtZW50ZSBwcmVkZWNpZGFzIGNvbW8gJ290aGVycycKCjMuIEZhbHNlIFBvc3RpdmVzID0gYXF1ZWxsYXMgZm90b3MgcXVlIHBlcnRlbmVjZW4gYSBsYSBjbGFzZSAnb3RoZXJzJyBxdWUgZnVlcm9uIGNvcnJlY3RhbWVudGUgcHJlZGVjaWRhcyBjb21vICd0ZXN0ZWQnCgo0LiBGYWxzZSBOZWdhdGl2ZXMgPSBhcXVlbGxhcyBmb3RvcyBxdWUgcGVydGVuZWNlbiBhIGxhIGNsYXNlICd0ZXN0ZWQnIHF1ZSBmdWVyb24gY29ycmVjdGFtZW50ZSBwcmVkZWNpZGFzIGNvbW8gJ290aGVycycKCmBgYHtyfQojIGNhbGN1bGFtb3MgbGEgbWF0cml6IGRlIGNvbmZ1c2lvbgpjb25mdXNpb25fbWF0cml4PC1jYW1lcmFfcHJlZGljdGlvbnMgJT4lIG11dGF0ZShjbT1pZmVsc2UocHJlZGljdGVkID09J3Rlc3RlZCcgJiBjbGFzcz09ICd0ZXN0ZWQnLCdUUCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwcmVkaWN0ZWQ9PSd0ZXN0ZWQnICYgY2xhc3M9PSdvdGhlcnMnLCdGUCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwcmVkaWN0ZWQ9PSdvdGhlcnMnICYgY2xhc3M9PSd0ZXN0ZWQnLCdGTicsJ1ROJykgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSklPiUgc2VsZWN0KGNtKQoKCnRhYmxlKGNvbmZ1c2lvbl9tYXRyaXgpCmBgYAoKQSBwYXJ0aXIgZGUgbGEgY29uZnVzaW9uIG1hdHJpeCBwb2RlbW9zIGNhbGN1bGFyIHZhcmlhcyBtZXRyaWNhcy4gUG9yIGVqZW1wbG8gZWwgKnJlY2FsbCogIEVsIHJlY2FsbCBub3MgZGljZSBxdWUgcG9yY2VudGFqZSBkZSBhcXVlbGxhcyBmb3RvZ3JhZmljYXMgcmVjb25vY2lkYXMgcG9yIGVsIGFsZ29yaXRtbyBjb21vIHF1ZSBwZXJ0ZW5lY2VuIGEgbGEgY2xhc2UgdGVzdGVkLCBzb24gZGUgaGVjaG8gZGUgbGEgY2xhc2UgdGVzdGVkLiBQYXJhIGVzdG8gc2UgYXBsaWNhIGxhIHNpZ3VpZW50ZSBmb3JtdWxhLiBUUC8oVFArRk4pLiBFcyBkZWNpciBsb3MgVHJ1ZSBQb3N0aXZlIHNvYnJlIGVsIHRvdGFsIGRlbCBmb3RvcyByZWNvbm9jaWRhcyBjb21vIHRlc3RlcyhpLmUuIGVsIFRydWUgcG9zdGl2ZSArIEZhbHNlIG5lZ2F0aXZlKSBNYXMgaW5mbyBlbiAoaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29uZnVzaW9uX21hdHJpeCkKCmBgYHtyLCBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQp0PC0odCh0YWJsZShjb25mdXNpb25fbWF0cml4KSkpCmRhdGEuZnJhbWUodCkKCnQodGFibGUoY29uZnVzaW9uX21hdHJpeCkpCnJlc2hhcGUyOjptZWx0KHQpCnJlY2FsbD10WzRdLyh0WzJdK3RbNF0pCnJlY2FsbApgYGAKCgoKUG9yIG90b3IgbGFkbyBTaSB1dGlsaXphbW9zIGxhIGZ1bmNpb24gKmNvbmZ1c2lvbk1hdHJpeCgpKiBub3MgYWhvcnJhbW9zIG11Y2hvIHRyYWJham8geSB0ZW5lbW9zIHRvZGFzIGxhcyBtZXRyaWNhcwpgYGB7cn0KbGlicmFyeShjYXJldCkKY29uZnVzaW9uTWF0cml4KGNhbWVyYV9wcmVkaWN0aW9ucyRjbGFzcywgY2FtZXJhX3ByZWRpY3Rpb25zJHByZWRpY3RlZCxwb3NpdGl2ZSA9ICd0ZXN0ZWQnKQoKYGBgCgo=