Análise de algoritmos de aprendizado supervisionado em um problema de classificação de raças de cães e gatos
Neste projeto apresentamos foi realizada uma solução de aprendizado de máquina envolvendo um problema de classificação. Em nosso caso, o problema envolve a predição de duas raças de gatos e três de cachorros a partir de imagens.
A base de dados utilizada neste trabalho foi a The Oxford-IIIT Pet, que contém fotografias de cães e gatos distribuídos em 37 categorias com aproximadamente 200 imagens cada. No nosso caso utilizamos apenas 5 destas categorias, 2 para os felinos e 3 para cachorros, a saber: Siamês e Maine Coon de gatos; Saint Bernard, Newfoundland e German Shorthaired de cães. O dataset contendo todas as raças pode ser encontrado no site do grupo de pesquisa em computação visual da Universidade de Oxford1.
Após a seleção manual das
Antes da aplicação do HOG, também realizamos a redefinição dos tamanhos das imagens, de modo a criarmos duas versões diferentes das imagens referentes a cada grupo. O tamanho das imagens redimensionadas foi de 128x128 pixels. Na aplicação do HOG para gerar a primeira base de dados, foi utilizado 16x16 pixels por célula. Na segunda base, por sua vez, o tamanho de uma célula foi de 20x20 pixels. Esse redimensionamento das imagens serviu para que os valores extraídos dos diferentes tamanhos fossem distintos, gerando assim maior variabilidade para testes futuros.
Logo em seguida, aplicamos o HOG a estas duas bases distintas, gerando, com isso, dois datasets: o primeiro com
Dando continuidade ao pipeline de desenvolvimento, com o dataset de
No primeiro método de redução de dimensionalidade, a seleção de atributos é feita através de uma medida de similaridade e/ou correlação para detectar atributos redundantes chamada de correlação de Pearson. Nesse caso, a medida indica o grau de associação linear entre duas variáveis quantitativas. Este índice apresenta valores entre
Como produto dessa aplicação obtivemos um número reduzido de atributos, mais precisamente
Já a segunda técnica utilizada para redução de dimensionalidade foi o PCA. Esta forma de extração de características é um método multivariado muito difundido para redução de dados. O PCA é capaz de sintetizar as informações em um novo conjunto de atributos menor do que o original, porém sem grandes perdas de informações. Costumeiramente, as variáveis numa base de dados são correlacionadas e possuem redundância. De forma simplificada a avaliação de redundância entre dimensões é feita pela análise da matriz de covariância dos dados, elencando de forma decrescente os chamados componentes principais.
A partir da aplicação do PCA foi gerado uma base com
Ao final, contamos com
A implementação realizada para a construção dos datasets pode ser encontrado neste repositório4.
Foram testados 4 algoritmos de classificação, a saber:
- Vizinhos mais próximos (KNN)
- Árvore de decisão (DT)
- Naive bayes gaussiano (GNB)
- Rede neural (MLP)
Além disso, testaram-se diferentes técnicas de comitês de classificação:
- Bagging
- AdaBoost
- Random forest
- Stacking
Uma etapa de grande importância durante a execução do trabalho foi a parte de seleção de amostras para treinamento e testes dos modelos avaliados. Essa fase nos permitiu avaliar se os algoritmos selecionados tinham uma boa capacidade de generalização diante dos dados aos quais foram submetidos. Para isso aplicamos dois métodos de validação cruzada onde os dados são divididos em subconjuntos mutuamente exclusivos chamados de treinamento e teste.
O primeiro método utilizado foi o chamado holdout. Como dito anteriormente, ele consiste na divisão dos dados em dois grupos mutuamente exclusivos, onde uma parte serve para o treinamento e outra para o teste. As proporções utilizadas nessa etapa foram
A segunda técnica de validação que aplicamos foi o
Assim, uma amostra é gerada pelos valores de acurácia de uma dada configuração de um classificador, levando em conta
As implementações dos códigos para a realização dos procedimentos deste trabalho se encontram neste repositório5.
Nesta seção realiza-se uma análise de desempenho dos estimadores treinados. Para isso, foi realizada a análise de alguns parâmetros dos estimadores estudados, para identificar o ajuste de cada algoritmo.
Portanto, a análise de uma classificador é realizada em dois níveis. Primeiramente, é feita uma anáĺise gráfica das médias obtidas em cada amostra com a variação dos parâmetros. Posteriormente, é realizado testes estatísticos para decidir sobre a melhor configuração daquele classificador.
Para definir a melhor configuração de um algoritmo pode-se comparar os valores médio de acurácia de amostras geradas por diferentes parâmetros de um mesmo algoritmo, ou ainda pode-se comparar as acurácias médias obtidas por diferentes algoritmos. Entretanto, o que garante que as melhorias de acurácia promovidas por uma determinada configuração são, de fato, relevantes? Além disso, ainda que um determinado algoritmo tenha uma melhor acurácia média do que outro, o que garante que essa melhoria é de fato significativa a ponto de se optar por um em detrimento de outro? Para tomada de decisões nesse sentido, é importante a realização dos testes estatísticos. Vale salientar que foi adotado neste trabalho um nível de significância de
Nesse sentido, dois tipos de testes foram realizados neste trabalho. O primeiro é o teste estatístico de Friedman, que analisa um conjunto de pelo menos três amostras dependentes, partindo da hipótese nula de que o conjunto de amostras testado provêm de uma mesma população. Assim, para um determinado conjunto de amostras, caso o resultado do
Caso a hipótese alternativa seja aceita no teste de Friedman, é necessário realizar ainda um teste estatístico par-a-par entre as amostras do conjunto. Isso é feito através do teste de Nemenyi, que também assume a hipótese nula de que dado par de amostras analisadas provêm da mesma população. Através desse teste obtém-se um
Em nosso trabalho variamos o número de vizinhos entre 1 e 5 com o intuito de averiguar qual número ideal para a solução do problema.
Em nossos testes avaliamos o algoritmo de árvores entre 3 e 7 camadas de profundidade para observar qual dessas melhor se adequa ao problema.
Neste algoritmo foi adotados apenas os parâmetros default.
Os parâmetros que buscou-se avaliar no trabalho são: função de ativação, número de neurônios na camada escondida, número máximo de iterações e a taxa de aprendizado inicial.
Foram testados bagging com 10 e 20 estimadores base do tipo: Vizinhos mais próximos, Árvore de decisão, Naive Bayes e Rede Neural. Assim, gerando 8 combinações de configurações possíveis. Os resultados destas combinações podem ser encontrados na próxima seção deste texto.
Foram testados boosting com 10 e 20 estimadores base do tipo: Árvore de decisão e Naive Bayes. Assim, gerando 4 combinações de configurações possíveis. Os resultados destas combinações podem ser encontrados na próxima seção deste texto.
Foram testados Random Forests com 10 e 100 estimadores base e dois critérios de seleção de atributos: gini e entropy. Assim, gerando 4 combinações de configurações possíveis. Os resultados destas combinações podem ser encontrados na próxima seção deste texto.
Foram estudados três configurações distintas para o stacking com
A segunda configuração contava com
Nome | Função de ativação | Número de neurônios |
---|---|---|
MLP1 | `logistica' | 100 |
MLP2 | `tanh' | 100 |
MLP3 | `relu' | 100 |
MLP4 | `relu' | 200 |
MLP5 | `relu' | 300 |
A teceira configuração do stacking contava com 9 estimadores base do tipo MLP cujas configurações usadas são exibidas na tabela abaixo,
Nome | Função de ativação | Número de neurônios |
---|---|---|
MLP1 | `logistica' | 100 |
MLP2 | `tanh' | 100 |
MLP3 | `relu' | 100 |
MLP4 | `logistica' | 200 |
MLP5 | `tanh' | 200 |
MLP6 | `relu' | 200 |
MLP7 | `logistica' | 300 |
MLP8 | `tanh' | 300 |
MLP9 | `relu' | 300 |
Os resultados das análises de desempenho (gráficos de acurácia e testes estatísticos) podem ser encontrados neste repositório6.
Este trabalho propôs-se a resolver um problema de classificação, em que o objetivo era prever cinco classes distintas, em que três delas eram raças de cachorro e duas delas raças de gato. Um total de oito algoritmos distintos de aprendizado de máquina foram testados. Quatros deles foram algoritmos simples, isto é, sem uso de comitês, a saber: vizinhos mais próximos (KNN), árvore de decisão (DT), Naive Bayes (NB) e rede neural (MLP). Além disso, foram considerados quatro comitês de classificação: bagging, boosting, random forest e stacking. Para avaliar e comparar os estimadores citados foi usada a métrica de acurácia.
Primeiramente, foram avaliados diferentes configurações para cada algoritmo simples. O objetivo era encontrar parâmetros que otimizassem a acurácia dos mesmos. Para o KNN, o melhor número de vizinhos encontrado foi de 3. Para o DT, a máxima profundidade igual a 4 foi aquela que resultou em melhor desempenho. O Naive Bayes foi mantido com seus valores padrões. Por último, a configuração ótima para o MLP foi aquela que usou a função de ativação `relu', o número de neurônios do tipo "OA", o número máximo de iterações igual a 1000 e a taxa de aprendizagem inicial de 0.001.
Posteriormente, foi avaliado os melhores algoritmos entre as configurações ótimas de cada um deles, citadas anteriormente. Dessa análise, concluiu-se através de testes estatísticos que tanto o NB quanto o MLP tiveram desempenhos semelhantes, embora este último tenha apresentado valor médio de acurácia um pouco maior que o primeiro, ainda que não estatisticamente diferente.
Com relação aos comitês foram avaliados três algoritmos distintos: bagging, boosting, random forest e stacking. O melhor desempenho observado entre os comitês foi para o stacking com
Finalmente, realizou-se uma análise comparativa entre o melhor comitê e o melhor classificador simples, onde notou-se que, de fato, a utilização dos comitês resultou em melhoria na acurácia da predição. Em contrapartida, destaca-se o uso de comitês aumenta a complexidade do problema e também o custo computacional envolvido no treinamento do algoritmo.
Com relação a análise comparativa entre as acurácia relativas a cada base de dados, percebeu-se que, de forma geral, a base de dados com
Footnotes
-
Link para o repositório: https://www.robots.ox.ac.uk/~vgg/data/pets/. ↩
-
Dalal, N. and Triggs, B. (2005). Histograms of oriented gradients for human detection. IEEE. ↩
-
Facelli, K., Lorena, A. C., Gama, J., and Carvalho, A. C. P. L. F. (2011). Inteligência artificial: uma abordagem de aprendizado de máquina. LTC. ↩
-
Notebooks com implementação para a construção dos datasets: https://github.com/BrunoRammon/gato-cachorro_classificacao_de_racas/blob/main/building_processed_datasets.ipynb ↩
-
Notebook com implementações realizadas: https://github.com/BrunoRammon/gato-cachorro_classificacao_de_racas/blob/main/train_validate_models.ipynb ↩
-
Notebook com análises de desempenho: https://github.com/BrunoRammon/gato-cachorro_classificacao_de_racas/blob/main/models_performance_analysis.ipynb ↩