# Engenharia de características

A engenharia de características ou extração de características ou descoberta de características é o processo de usar o conhecimento do domínio para extrair características (informações, propriedades, atributos) de dados brutos. A motivação é usar esses recursos extras para melhorar a qualidade dos resultados de um processo de aprendizado de máquina, em comparação com o fornecimento apenas de dados brutos para o processo de aprendizado de máquina.

## Processo

O processo de engenharia de características é:
* Brainstorming ou teste de características
* Decisão de quais características criar
* Criação das características
* Testando o impacto das características identificadas na tarefa
* Melhoria das características, se necessário
* Repetição

### Características construídas típicas

A lista a seguir fornece algumas maneiras típicas de fabricar características úteis
* Transformações numéricas (como calcular frações ou mudar a escala)
* Codificação de categorias como one-hot-encoder ou ou target-encoder (para dados categóricos)
* Agrupamento
* Valores agregados por grupos
* Análise de componentes principais (para dados numéricos)
* Construção de características: construir novos parâmetros "físicos", baseados no conhecimento, relevantes para o problema. Por exemplo, em física, a construção de números adimensionais, como número de Reynolds em dinâmica de fluidos, o número de Nusselt em transferência de calor, o número de Arquimedes em sedimentação, a construção de primeiras aproximações da solução, como resistência analítica de soluções de materiais em mecânica, etc.

## Relevância

As características variam em importância. Mesmo características relativamente insignificantes podem contribuir para um modelo. A seleção de características pode reduzir o número de características para evitar que um modelo se torne muito específico para o conjunto de dados de treinamento (overfitting).

## Explosão

A explosão de características ocorre quando o número de características identificadas cresce de forma inadequada. Causas comuns incluem:
* Modelos de recursos - a implementação de modelos de características em vez de codificar novas características
* Combinações de características - combinações que não podem ser representadas por um sistema linear
A explosão de características pode ser limitada por meio de técnicas como: regularização, métodos de kernel e seleção de características.

## Automação

A automação da engenharia de características é um tópico de pesquisa que remonta à década de 1990. Desde 2016 estão disponíveis comercialmente softwares de aprendizado de máquina que incorporam engenharia de características automatizada. A literatura acadêmica relacionada pode ser dividida em dois tipos:
* O aprendizado de árvore de decisão multi-relacional (MRDTL, na sigla em inglês) usa um algoritmo supervisionado que é semelhante a uma árvore de decisão.
* Deep Feature Synthesis usa métodos mais simples.

### Aprendizado de árvore de decisão multi-relacional (MRDTL)

O MRDTL gera características na forma de consultas SQL adicionando cláusulas sucessivamente às consultas. Por exemplo, o algoritmo pode começar com
A consulta pode ser refinada sucessivamente adicionando condições, como "WHERE t1.charge <= -0,392".
No entanto, a maioria dos estudos de MRDTL baseiam as implementações em bancos de dados relacionais, o que resulta em muitas operações redundantes. Essas redundâncias podem ser reduzidas usando técnicas como propagação de id de tupla. A eficiência pode ser aumentada usando atualizações incrementais, o que elimina redundâncias.

### Implementações de código aberto

Existem várias bibliotecas e ferramentas de código aberto que automatizam a engenharia de características em dados relacionais e séries temporais:
* featuretools é uma biblioteca Python para transformar séries temporais e dados relacionais em matrizes de recursos para aprendizado de máquina.
* OneBM ou One-Button Machine combina transformações de características e seleção de características em dados relacionais com técnicas de seleção de características.
* A comunidade getML é uma ferramenta de código aberto para engenharia de características automatizada em séries temporais e dados relacionais. É implementada em C/C++ com uma interface Python. Demonstrou ser pelo menos 60 vezes mais rápido que tsflex, tsfresh, tsfel, featuretools ou kats.
* tsfresh é uma biblioteca Python para extração de características em dados de séries temporais. Ela avalia a qualidade das características usando testes de hipóteses.
* tsflex é uma biblioteca Python de código aberto para extrair características de dados de séries temporais. Apesar de ser 100% escrito em Python, demonstrou ser mais rápida e mais eficiente em termos de memória do que tsfresh, seglearn ou tsfel.
* seglearn é uma extensão para dados de séries temporais sequenciais e multivariados para a biblioteca em Python scikit-learn.
* tsfel é um pacote em Python para extração de características em dados de séries temporais.
* kats é um kit de ferramentas Python para analisar dados de séries temporais.

### Síntese profunda de características

O algoritmo de síntese profunda de características (DFS) venceu 615 de 906 equipes humanas em uma competição.

## Repositório de características

O Feature Store é um repositório onde as características são armazenadas e organizadas com o propósito explícito de serem usadas para treinar modelos (por cientistas de dados) ou fazer previsões (por aplicativos que possuem um modelo treinado). É um local central onde você pode criar ou atualizar grupos de características criadas a partir de várias fontes de dados diferentes ou criar e atualizar novos conjuntos de dados desses grupos de características para treinar modelos ou para uso em aplicativos que não desejam calcular as características, mas apenas recuperá-las quando precisar delas para fazer previsões.
Um repositório de características inclui a capacidade de armazenar código usado para gerar características, aplicar o código a dados brutos e fornecer essas características a modelos mediante solicitação. Características úteis incluem controle de versão de características e políticas que regem as circunstâncias em que as características podem ser usadas.
Os repositórios de características podem ser ferramentas de software independentes ou incorporadas a plataformas de aprendizado de máquina.