Engenharia de Atributos

Ricardo Araujo
8 min readOct 28, 2020

--

Modelos preditivos atuam identificando padrões em exemplos a partir de atributos disponíveis. Cada exemplo é composto de um ou mais atributos que, sozinhos ou em conjuntos, são preditivos para o atributo-alvo (rótulo) desejado. Em dados tabulares, atributos são tipicamente colunas na tabela, mas em outros domínios podem assumir outros formatos (como matrizes para imagens). A expressividade do modelo dita a complexidade dos padrões que podem ser extraídos, mas conjuntamente os atributos disponíveis podem habilitar ou facilitar a identificação dos padrões.

A engenharia de atributos é um processo de transformação de dados brutos em atributos úteis para o processo de aprendizado de máquina. Tipicamente é um processo amplamente manual que se beneficia de conhecimento do domínio do problema. Pode ser visto como envolvendo pelo menos quatro abordagens: criar atributos, expandir atributos, transformar atributos e selecionar atributos.

Criação de atributos

Na criação de atributos, define-se atributos a partir dos dados brutos. Por exemplo, considere a tarefa de prever se um estudante obterá emprego ao sair da faculdade a partir de informações sobre sua graduação. Uma destas informações são todas notas obtidas em todas disciplinas cursadas pelo estudante. Porém, estudantes diferentes cursam um número diferente de disciplinas e podemos ter dificuldade em usar todas notas diretamente em um modelo. Uma solução é criar um conjunto fixo de atributos a partir destas informações como, por exemplo, o número de disciplinas cursadas, a média das notas e o desvio padrão. Assim, todos estudantes teriam exatamente três atributos.

É claro que os atributos criados devem potencialmente ser preditivos e este processo de criação se beneficia de ter pessoas que compreendam o domínio do problema. No exemplo, ter talvez recrutadores de empresas que nos digam o que eles consideram no processo de recrutamento seria certamente útil.

A criação de atributos estabelece as informações que o modelo terá acesso não só durante o treinamento, mas também durante a inferência. Portanto, é importante que a criação de atributos seja reproduzível com o modelo em produção. Por exemplo, se os dados são imagens podemos talvez aplicar algum algoritmo complexo de processamento de imagens para extrair informações sobre a estrutura de cada exemplo mas que não seria viável de ser aplicado em produção, talvez por ser lento demais e ser uma exigência classificar imagens em tempo real.

Em outro exemplo de criação de atributo, considere a tarefa de prever se um cliente irá comprar um determinado produto e temos o histórico de compras de todos clientes. Nossos dados contém a data e hora de cada compra. Porém, pode não ser importante a data absoluta mas sim o número de dias que se passaram entre o cliente comprar o primeiro produto e a nova compra. Assim, criamos um atributo que é apenas um inteiro representando a diferença em dias das datas de cada compra para a primeira compra. Note que aqui optamos por descartar informação de horas e minutos, bem como perdemos informações que podem ser importantes, como sasonalidade (e.g. a compra foi feita perto do Natal?).

Expansão de atributos

A expansão de atributos é diferente da criação ao gerar novos atributos que são externos ou derivados. Atributos externos expandem informações a partir de fontes externas aos dados brutos, mas que são relacionados a estes. Por exemplo, um atributo pode ser o nome de um país, o que pode ser de uso limitado; podemos criar um novo atributo a partir deste introduzindo o PIB daquele país. A informação de PIB não advém dos dados brutos disponíveis, mas são facilmente obtidos de fontes externas.

Claro, sempre é possível adicionar estas informações diretamente ao que consideramos dados brutos, mas em geral é importante, ao definir o pipeline de dados, ter especificado e explícito a origem de cada informação. Isto nos ajuda em processos de auditagem e verificação de qualidade de dados.

Atributos derivados são novos atributos definidos a partir de atributos já criados. Estes tem a intenção de introduzir conhecimento sobre a interação entre atributos e facilitar o processo de aprendizado pelo modelo. Em um problema de classificação, o modelo pode não ser capaz separar as classes a partir dos atributos originais mas, com a adição de atributos derivados, isso pode passar a ser possível. Considere o problema de classificação abaixo, com apenas dois atributos x1 e x2.

Claramente este problema não é linearmente separável e um classificador linear não seria capaz de aprender o conceito subjacente. Porém, vamos criar um novo atributo x3 derivado dos dois atributos existentes, tomando a soma dos quadrados: x3=x1² + x2². O resultado está representado abaixo.

Podemos ver que a adição deste atributo derivado torna as classes linearmente separáveis! Este é um exemplo artificial que ilustra de forma dramática o efeito. Em situações reais, atributos derivados advém de algum conhecimento sobre o domínio do problema. Por exemplo, se temos um atributo com o valor total gasto por um cliente e outro com o total de produtos adquiridos por este cliente, podemos considerar que a introdução do valor médio por produto, dividindo uma coluna pela outra, é informativo para a tarefa que temos em mãos.

A derivação de novos atributos é um processo bastante laboral e criativo, que pode ter um efeito considerável no desempenho final do modelo. Alguns algoritmos e modelos procuram fazer derivações automáticas. Máquinas de Vetor de Suporte tipicamente utilizam o chamado kernel trick para gerar uma representação multi-dimensional dos atributos originais, que tem efeito equivalente a introdução de múltiplos atributos derivativos.

Transformação de atributos

A transformação de atributos parte dos atributos já extraídos dos dados brutos ou derivados e os altera com algum objetivo. O tipo de transformação mais simples é a adaptação para um modelo, onde a transformação não altera de forma significativa a semântica do atributo. Por exemplo, pode envolver transformar dados categórios em numéricos ou vice-versa, mas também converter toda uma imagem de um espaço de cores para outro. A transformação é amplamente apenas sintática e a quantidade de informação disponível para o modelo não se altera.

Outras transformações visam corrigir discrepâncias ou problemas com os atributos. Por exemplo, alguns exemplos podem ter dados faltantes para algum atributo e pode ser desejável preencher estes lacunas — isto é, imputar valores — que não apenas indicar a ausência. Há diversas técnicas de imputação. Para dados categóricos, por exemplo, pode-se atribuir o valor mais frequente presente nos dados (ou mais frequente condicionado a alguma classe ou outro atributo). Para dados numéricos, pode-se tomar a média ou escolher aleatoriamente seguindo a distribuição dos valores presentes. De forma geral, deve-se imputar com valores que sejam plausíveis para cada exemplo sendo imputado. A imputação sempre traz o perigo de introduzir algum viés nos dados e pode ser preferível, quando possível, descartar os exemplos com valores faltando.

Outro tipo de discrepância em atributos numéricos são outliers. Diferente de valores faltantes, os valores outliers estão presentes mas são muito diferentes dos demais valores. Esta diferença pode advir de erros na coleta ou geração do atributo, ou pode ser uma ocorrência natural. Mesmo quando natural, pode ser desejável lidar com outliers de alguma forma pois eles podem tornar o aprendizado mais difícil para o modelo. O processo típico envolve detectar os outliers e, então, imputar um novo valor. Entre as técnicas para detecção de outliers está calcular e.g. média e desvio padrão e considerar outliers todos valores acima ou abaixo de algum limiar (2 desvios-padrão é comum); porém, para atributos que não são normalmente distribuídos outras técnicas podem ser mais adequadas.

Alguns algoritmos de treinamento são sensíveis a diferenças de escala entre atributos. Por exemplo, se um atributo é idade de uma pessoa em anos, os valores estarão em uma escala de algumas dezenas mas, se outro atributo for peso em gramas, os valores estarão em uma escala de muitos milhares. Isto pode levar o algoritmo de treinamento a dar mais atenção a peso do que a idade somente devido a escala. Para solucionar isso, podemos reescalar os atributos. Duas das técnicas mais comuns para isso são:

  • Normalização (normalization): transformar os valores para que estejam entre 0 e 1. Isso pode ser feito subtraindo cada valor do mínimo e dividindo o resultado pela diferença entre o máximo e o mínimo (Normalização Max-Min);
  • Estandardização (standardization): transformar os valores para que eles tenham média zero e desvio padrão unitário. Isso é feito subtraindo todos valores da média e dividindo o resultado pelo desvio padrão (i.e. calculando o z-score).

Em teoria, estandardização é mais adequada quando os atributos são distribuídos normalmente, mas na prática é comum testar ambas abordagens. Nem todo algoritmo é sensível a escala, mas muitos importantes são, em particular os usados em redes neurais e k-vizinhos mais próximos. Por outro lado, os comumente usados em árvores de decisão não são sensíveis a escala.

Seleção de atributos

Em um cenário ideal, os atributos seriam apenas os suficientes e necessários para habilitar o aprendizado. Menos atributos impediriam o aprendizado com o desempenho desejado, enquanto mais atributos tornariam o aprendizado mais difícil devido ao maior espaço de hipóteses. Naturalmente, não sabemos de antemão que atributos são necessários e muito menos se são suficientes. A seleção de atributos visa reduzir o número de atributos disponíveis para o modelo.

Isso é particularmente desejável para evitar a chamada maldição da dimensionalidade, que ocorre quando temos tantos atributos que acabamos com dados excessivamente esparsos. Dados esparsos são aqueles onde os pontos (exemplos) estão muito distantes uns dos outros no espaço de atributos, não permitindo estabelecer relações de similaridade e, portanto, discernir padrões nos exemplos. Ultimamente, padrões emergem da repetição de combinações entre atributos e, se há uma quantidade muito grande de atributos para uma quantidade insuficiente de exemplos, estas repetições podem não ocorrer.

Incidentalmente, a maldição da dimensionalidade é causada não só pelo número de atributos, mas também a quantidade de valores ou a distribuição de valores em cada atributo — uma transformação de atributo que visa reduzir o número de valores possíveis é chamada de binning, onde criamos grupos que representam um conjunto de valores; por exemplo, ao invés de ter um atributo "idade" representado por um inteiro, podemos criar categorias como "0–10", "11–20" etc.

Reduzir o número de atributos contribui para ter modelos mais explicáveis, reduzir tempo de treinamento e inferência e também reduzir sobrajustes. Há múltiplas técnicas para realizar seleção de atributos. Uma das mais simples envolve treinar o modelo múltiplas vezes, cada vez removendo um atributo e verificando o desempenho em um conjunto de validação; quando o desempenho não piora, mantém-se aquele atributo de fora e continua-se o processo para os demais. Uma variação desta técnica é não remover o atributo, mas gerar uma permutação aleatória dos valores entre os exemplos. Outra alternativa é utilizar métricas como ganho de informação e correlações com o rótulo, mantendo apenas atributos com altos valores.

Estas abordagens não consideram a possibilidade de interações entre atributos, porém, e outras técnicas, mais custosas computacionalmente, tratam a seleção de atributos como um problema de otimização combinatorial, realizando uma busca no espaço de combinações de atributos para encontrar uma boa combinação. Algoritmos Genéticos são utilizados com alguma frequência para isso.

Uma metodologia relacionada é a extração de atributos. Ao contrário de remover atributos, a extração de atributos procura encontrar alternativas para a representação dos exemplos a partir do atributos. Utiliza técnicas de redução de dimensionalidade para tanto. De forma mais geral, este processo se encaixa em uma área mais ampla chamada aprendizado de representações (representation learning), que se preocupa em encontrar de forma automática boas representações (i.e. atributos) para os dados que facilitam o processo de aprendizado. É uma área bastante popular atualmente principalmente devido a redes neurais, que geram representações intermediárias nativamente.

--

--

Ricardo Araujo

Computer Science professor at UFPel. Machine Learning and Artificial Intelligence practitioner and researcher.