Redução de Dimensionalidade, um exemplo com XGBoost e PCA

A importância da redução de dimensionalidade em conjuntos com muitos atributos

João Guilherme Araujo
Porto
5 min readMar 2, 2021

--

Neste texto, vamos dar continuidade ao tema da Maldição da Dimensionalidade. O caso prático será de classificação de imagens do COCO Dataset. Selecionamos as imagens com os códigos de uma publicação anterior.

O objetivo é dar uma demonstração prática do impacto da redução de dimensionalidade. Nosso conjunto de dados tem 1.267 observações (imagens) e 1.536 atributos (transfer learning).

Caso tenha interesse só nos resultados, pule para a Parte II.

Sumário

Parte I: Definição do conjunto de dados e atributos

  • Seleção das imagens do COCO Dataset
  • Extração de atributos (Transfer Learning)

Parte II: Resultados do caso prático

  • Redução de dimensionalidade com o PCA
  • Impactos na classificação utilizando o XGBoost
  • Conclusão

Parte I: Definição do conjunto de dados e atributos

Seleção das imagens do COCO Dataset

Vamos selecionar imagens de seis categorias de objetos do COCO Dataset do conjunto de validação de 2014:

  • 2 categorias de veículos: carro e bicicleta;
  • 2 categorias de animais: cachorro e gato;
  • 2 categorias de comidas: bolo e pizza.

Além das categorias, filtramos:

  • imagens com apenas um objeto anotado;
  • imagens onde o objeto tem uma caixa delimitadora (em inglês, bounding box) que ocupa mais que 40% da imagem.

Após a seleção, o conjunto de dados ficou com 1.267 imagens e 6 categorias.

Exemplo das imagens selecionadas e suas caixas delimitadoras. Imagem criada pelo autor.

Para ter detalhes de como selecionar imagens específicas do COCO acesse nosso artigo sobre o pycocotools (clique aqui). Nesse artigo ensinamos como transformar a anotação em um pandas.DataFrame.

Após selecionar as imagens e transformar as informações obtidas em um pandas.DataFrame,df_imgs, obtivemos a seguinte saída:

Amostra de uma imagem de cada categoria. As colunas obj_count e obj_cover indicam, respectivamente, a quantidade de objetos anotados e o percentual de preenchimento da caixa delimitadora do objeto na imagem.

A primeira coluna tem os nomes dos arquivos das imagens selecionadas. Essa estrutura é perfeita para a extração de atributos utilizando o flow_from_dataframe do Keras.

Extração de atributos (Transfer Learning)

A extração de atributos é uma técnica que foi apresentada no artigo Diagnósticos médicos auxiliados por Deep Learning.

Para a extrair os atributos das imagens selecionadas utilizamos a InceptionResNetV2 do Keras Applications, um conjunto de redes neurais pré-treinadas para classificação do conjunto ImageNet.

Nós excluímos a camada de saída (probabilidade de cada um dos 1.000 objetos da ImageNet) e ficamos somente com a saída da última camada oculta, que tem 1.536 neurônios, ou seja, atributos.

Parte II: Resultados do caso prático

Para demonstrar os efeitos da redução de dimensionalidade na qualidade do modelo final vamos utilizar o clássico algoritmo de Análise de Componentes Principais (em inglês, PCA) para reduzir 1.536 dimensões em apenas 15.

Redução de dimensionalidade com o PCA

O PCA é um dos algoritmos mais conhecidos de redução de dimensionalidade e é fácil de encontrar diversos artigos explicando seu funcionamento.

O principal ponto positivo do PCA é a remoção de atributos correlacionados e, conforme apresentamos no artigo sobre a Maldição da Dimensionalidade, isso melhora a qualidade do modelo.

Fonte da imagem: publicação no Medium por Darshan Murthy.

Um ponto negativo sobre o PCA é sua estrutura linear. Sabemos que os dados da vida real nem sempre são lineares ou têm correlações lineares. Contudo, isso não impede que o PCA seja utilizado na prática.

Impactos na classificação utilizando o XGBoost

Depois de padronizar os 1.536 atributos obtidos da InceptionResNetV2, treinamos o XGBoost com e sem redução de dimensionalidade. Os hiperparâmetros foram mantidos com seus valores padrões (default).

O XGBoost, assim como todo GBM é propenso a superajustes (overfitting) nos dados de treino. Isso fica evidente quando aplicamos o XGBoost em dados com muitos atributos.

O XGBoost, assim como todo GBM, é propenso a superajuste. Imagem criada pelo autor.

Na tabela 1 é possível ver o comportamento do XGBoost sem redução de dimensionalidade. Claramente houve overfitting nos dados de treino, pois temos 100% de acurácia. Isso impacta na qualidade do modelo nos dados de teste, onde a acurácia cai para 92% (-8 p.p.).

TABELA 1: XGBoost aplicado sem redução de dimensionalidade.

Na tabela 2, mesmo aplicando o PCA e reduzindo o número de atributos de 1.536 para 15 (~10% do total), ainda observamos o comportamento de overfitting do XGBoost no treino (100% de acurácia). Contudo, com a redução de dimensionalidade, temos um modelo mais robusto atingindo 95% de acurácia nos dados de teste (-5 p.p.).

TABELA 2: XGBoost aplicado com redução de dimensionalidade.

Conclusão

No exemplo apresentado, temos um conjunto de imagens pequeno relativo ao número de atributos, onde justamente a Maldição da Dimensionalidade é mais forte e ao aplicarmos um simples PCA observamos uma melhora expressiva na qualidade do modelo.

Portanto, se você quiser ter o melhor algoritmo possível, não deixe de testar uma redução de dimensionalidade caso você se depare com um conjunto de dados com muitos atributos.

Agora, imagina se tivéssemos usado um algoritmo não-linear de redução de dimensionalidade? Aguarde os próximos capítulos…

Agradecimentos

Adriano Moala (Revisão)
Comunicação Institucional Porto Seguro (Revisão)

--

--

João Guilherme Araujo
Porto

Araujo here! I am a math/computer/statistics lover and I'm always looking for theory applications. In the free time, eventually, I'll put some stuff here.