{"metadata":{"language_info":{"name":"R","codemirror_mode":"r","pygments_lexer":"r","mimetype":"text/x-r-source","file_extension":".r","version":"3.6.3"},"kernelspec":{"name":"ir","display_name":"R","language":"R"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Plant Pathology 2021 - Estatística Descritiva","metadata":{}},{"cell_type":"markdown","source":"### Carregamento de pacotes e dados","metadata":{}},{"cell_type":"code","source":"library(tidyverse)\nlibrary(keras)\n\n#list.files(path = \"../input\")\n\nbase <- read_csv(\"../input/plant-pathology-2021-fgvc8/train.csv\")\n\n#install.packages(\"tensorflow\")\n#library(tensorflow)\n\n#install.packages(\"magick\")\n#library(magick)\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Estatística descritiva","metadata":{}},{"cell_type":"markdown","source":"A base de dados de treino é composta por um total de 18.632 imagens de plantas e classes que descrevem se elas são saudáveis ou se há a presença de doenças. ","metadata":{}},{"cell_type":"code","source":"dim(base)\nhead(base)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Contando a frequência que os labels aparecem percebemos que algumas imagens estão associadas à mais de uma classe. Vale notar que caso a planta seja classificada como saudável (healthy) não faz sentido ter alguma outra classificação, visto que as outras classes se referem a doenças. Plantas com muitas doenças para classificar se encaixam na classe complex.","metadata":{}},{"cell_type":"code","source":"base %>% count(labels) %>% arrange(desc(n))\n\nbase %>% group_by(labels) %>% summarise(count = n()) %>% \nggplot(aes(x = reorder(labels,count), y = count)) + geom_bar(stat=\"identity\") + xlab(\"Labels\") + ylab(\"Frequência\") + coord_flip() ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":" Portanto temos 6 classes: healthy, scab, frog_eye_leaf_spot, rust, complex e powdery_mildew. Criamos a variável nlabel que indica quantas classes cada imagem possui.","metadata":{}},{"cell_type":"code","source":"base <- base %>% mutate(nlabel = str_count(labels, \" \")+1)\n\nbase %>% count(labels, nlabel) %>% arrange(desc(n))\n\nbase %>% group_by(nlabel) %>% summarise(count = n()) %>% \nggplot(aes(x = reorder(nlabel,-count), y = count)) + geom_bar(stat=\"identity\") + xlab(\"Quantidade de classes\") + ylab(\"Frequência\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"A maioria das imagens tem apenas uma classe. De qualquer forma podemos criar variáveis binárias para indicar presença de cada classe, já que temos casos de classes múltiplas.","metadata":{}},{"cell_type":"code","source":"base <- base %>% mutate(complex = ifelse(str_detect(labels, \"complex\"), 1, 0),\n                        healthy = ifelse(str_detect(labels, \"healthy\"), 1, 0),\n                        rust = ifelse(str_detect(labels, \"rust\"), 1, 0),\n                        scab = ifelse(str_detect(labels, \"scab\"), 1, 0),\n                        frog_eye_leaf_spot = ifelse(str_detect(labels, \"frog_eye_leaf_spot\"), 1, 0),\n                        powdery_mildew = ifelse(str_detect(labels, \"powdery_mildew\"), 1, 0))\n\nhead(base)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Métrica","metadata":{}},{"cell_type":"markdown","source":"A métrica utilizada será o F1-score médio. O F1-score é definido como a média harmônica das métricas precisão e recall\n\n$$F_{1}=\\frac{2}{\\frac{1}{\\text { recall }} \\times \\frac{1}{\\text { precisao }}}$$\n\n$$F_{1}=2 \\times \\frac{\\text { precisao } \\times \\text { recall }}{\\text { precisao }+\\text { recall }}$$\n\nA precisão indica a frequência de predições corretas positivas, é uma boa métrica quando falsos negativos devem ser evitados. Definimos a precisão como\n\n$$\\text{Precisao} =\\frac{VP}{VP+FP}$$\n\nJá o recall é uma métrica importante quando o custo de falsos positivos é alto, definimos como\n\n$$\\text{Recall} =\\frac{VP}{VP+FN}$$\n\nonde VP são os verdadeiros positivos, FP são os falsos positivos e FN são os falsos negativos em relação a predição feita.\n\nA métrica F1-score varia entre 0 e 1, uma medida próxima de 1 indica que o modelo está fazendo poucas predições de falso positivo e falso negativo, portanto, quanto mais próximo de 1 melhor o modelo.","metadata":{}},{"cell_type":"markdown","source":"### Carregando imagens","metadata":{}},{"cell_type":"code","source":"if (!require(\"pacman\")) install.packages(\"pacman\") \npacman::p_load(tidyverse)\nlibrary(EBImage)\nlibrary(readr)\n\ntrainpics = list.files(\"../input/plant-pathology-2021-fgvc8/train_images\", \n                       full.names = TRUE) \n\nbase <- base %>% mutate(imgpath = paste(\"../input/plant-pathology-2021-fgvc8/train_images\", image, sep = \"/\" ))\n\ntrainpics <- base %>% pull(imgpath)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Exemplo de imagens da classe complex:","metadata":{}},{"cell_type":"code","source":"c1img <- list()\nc1 <- base %>% filter(complex == 1) %>% pull(imgpath) %>% sample(3)\nfor(i in 1:3){\n    c1img[[i]] <- readImage(c1[i])\n    #c1img[[i]] <- resize(c1img[[i]], 512, 256 )\n    display(c1img[[i]])\n}\n","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Exemplo de imagens da classe healthy:","metadata":{}},{"cell_type":"code","source":"c2img <- list()\nc2 <- base %>% filter(healthy == 1) %>% pull(imgpath) %>% sample(3)\nfor(i in 1:3){\n    c2img[[i]] <- readImage(c2[i])\n    #c2img[[i]] <- resize(c2img[[i]], 512, 256 )\n    display(c2img[[i]])\n}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Exemplo de imagens da classe rust:","metadata":{}},{"cell_type":"code","source":"c3img <- list()\nc3 <- base %>% filter(rust == 1) %>% pull(imgpath) %>% sample(3)\nfor(i in 1:3){\n    c3img[[i]] <- readImage(c3[i])\n    display(c3img[[i]])\n}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Exemplo de imagens da classe scab:","metadata":{}},{"cell_type":"code","source":"c4img <- list()\nc4 <- base %>% filter(scab == 1) %>% pull(imgpath) %>% sample(3)\nfor(i in 1:3){\n    c4img[[i]] <- readImage(c4[i])\n    display(c4img[[i]])\n}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Exemplos da classe frog_eye_leaf_spot:","metadata":{}},{"cell_type":"code","source":"c5img <- list()\nc5 <- base %>% filter(frog_eye_leaf_spot == 1) %>% pull(imgpath) %>% sample(3)\nfor(i in 1:3){\n    c5img[[i]] <- readImage(c5[i])\n    display(c5img[[i]])\n}","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Exemplos da classe powdery_mildew:","metadata":{}},{"cell_type":"code","source":"c6img <- list()\nc6 <- base %>% filter(powdery_mildew == 1) %>% pull(imgpath) %>% sample(3)\nfor(i in 1:3){\n    c6img[[i]] <- readImage(c6[i])\n    display(c6img[[i]])\n}","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}