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:

  1. True Postives = aquellas fotos que pertenecen a la clase ‘tested’ que fueron correctamente predecidas como ‘tested’

  2. True Negatives = aquellas fotos que pertenecen a la clase ‘others’ que fueron correctamente predecidas como ‘others’

  3. False Postives = aquellas fotos que pertenecen a la clase ‘others’ que fueron correctamente predecidas como ‘tested’

  4. 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=