Como transformar dados categóricos

Alguns dos seus recursos podem ser valores discretos que não estão em uma relação ordenada. Os exemplos incluem raças de cães, palavras ou códigos postais. Esses recursos são conhecidos como categóricos, e cada valor é chamado de categoria. Você pode representar valores categóricos como strings ou até mesmo números, mas não poderá comparar esses números nem os subtrair uns dos outros.

Muitas vezes, você precisa representar atributos que contenham valores inteiros como dados categóricos em vez de dados numéricos. Por exemplo, considere um recurso de código postal em que os valores são números inteiros. Se você representar numericamente esse recurso, então pedirá ao modelo que encontre uma relação numérica entre diferentes códigos postais. Por exemplo, você espera que o modelo determine que o código postal 20004 é o dobro ou metade do sinal como código postal 10002. Ao representar códigos postais como dados categóricos, você permite que o modelo encontre sinais separados para cada código postal individual.

Se o número de categorias de um campo de dados for pequeno, como o dia da semana ou uma paleta limitada de cores, será possível criar um recurso exclusivo para cada categoria. Exemplo:

Cada cor na paleta é representada como um recurso separado.
Ou seja, cada cor é um recurso separado no vetor de atributos.
Por exemplo, vermelho é um recurso, laranja é um recurso separado
e assim por diante. Figura 1: um recurso exclusivo para cada categoria.

 

Assim, um modelo pode aprender um peso separado para cada cor. Por exemplo, o modelo pode descobrir que carros vermelhos são mais caros do que carros verdes.

Assim, os atributos poderão ser indexados.

Agora, cada cor na paleta pertence ao mesmo recurso. 
Ou seja, a cor agora é apenas um atributo no vetor de atributos.
Cada cor tem um valor exclusivo. Por exemplo, vermelho tem o valor 0, laranja tem 
o valor 1 e assim
por diante. Figura 2: recursos indexados.

 

Esse tipo de mapeamento é chamado de vocabulário.

Vocabulário

Em um vocabulário, cada valor representa um recurso único.

Index NumberCategory
0Red
1Orange
2Blue
......

O modelo procura o índice da string, atribuindo 1,0 ao slot correspondente no vetor de recursos e 0,0 a todos os outros slots no vetor de recursos.

Diagrama do processo completo para mapear categorias para vetores de recursos.
No diagrama, os atributos de entrada são amarelo, laranja, azul e azul. O sistema usa um vocabulário armazenado (vermelho é 0, laranja é 1, azul é 2, amarelo é 3 e assim por diante) para mapear o valor de entrada para um ID. Portanto, o sistema mapeia amarelo, laranja, azul, azul para 3, 1, 2, 2. Em seguida, o sistema converte esses valores em um vetor de atributos one-hot. Por exemplo,
considerando um sistema com sete cores possíveis, 3 se torna 0,0, 0,0, 0,0, 1,0, 0,0,
0,0, 0,0. Figura 3: o processo completo de mapeamento de categorias para vetores de recursos.

Observação sobre representação esparsa

Se as categorias forem os dias da semana, você poderá, por exemplo, representar sexta-feira com o vetor de atributos [0, 0, 0, 0, 1, 0, 0]. No entanto, a maioria das implementações de sistemas de ML representará esse vetor na memória com uma representação esparsa. Uma representação comum é uma lista de valores não vazios e seus índices correspondentes, por exemplo, 1,0 para o valor e [4] para o índice. Isso permite que você gaste menos memória armazenando uma grande quantidade de 0s e permite uma multiplicação de matrizes mais eficiente. Em termos de matemática subjacente, o [4] é equivalente a [0, 0, 0, 0, 1, 0, 0].

Fora do vocabulário (OOV)

Assim como os dados numéricos contêm outliers, os dados categóricos também. Por exemplo, considere um conjunto de dados com descrições de carros. Um dos recursos desse conjunto de dados pode ser a cor do carro. Suponha que as cores comuns do carro (preto, branco, cinza e assim por diante) sejam bem representadas no conjunto de dados e que você transforme cada uma delas em uma categoria para saber como essas diferentes cores afetam o valor. No entanto, suponha que esse conjunto de dados contenha um número pequeno de carros com cores excêntricas (mauve, puce, abacate). Em vez de dar a cada uma dessas cores uma categoria separada, você poderia transformá-las em uma categoria geral, chamada Fora do vocabulário (OOV). Ao usar OOV, o sistema não perderá tempo treinando em cada uma dessas cores raras.

Hashing

Outra opção é gerar hash de cada string (categoria) para o espaço de índice disponível. A geração de hash geralmente causa colisões, mas você depende do modelo aprendendo uma representação compartilhada das categorias no mesmo índice que funciona bem para o problema em questão.

Por termos importantes, o hash pode ser pior do que a seleção de um vocabulário, devido a colisões. Por outro lado, para gerar hash não é necessário montar um vocabulário, o que é uma vantagem quando a distribuição de atributos muda ao longo do tempo.

Diagrama mostrando duas listas de palavras. Uma lista é composta por 10 palavras. A outra lista mostra as 10 palavras divididas em oito buckets de hash. Assim, seis dos buckets de hash contêm uma palavra, enquanto dois dos buckets de hash contêm duas palavras.  Cada bucket com hash é identificado por um número de 1 a 8. Figura 4: mapeamento de itens para um vocabulário.

Híbrido de hash e vocabulário

Você pode adotar uma abordagem híbrida e combinar hashes com um vocabulário. Use um vocabulário para as categorias mais importantes nos seus dados, mas substitua o bucket OOV por vários buckets OOV e use o hash para atribuir categorias a buckets.

As categorias nos buckets de hash precisam compartilhar um índice, e o modelo provavelmente não fará boas previsões, mas alocamos uma certa quantidade de memória para tentar aprender as categorias fora do nosso vocabulário.

Diagrama mostrando três listas de palavras. Uma lista consiste em 10 palavras
para categorizar. As outras duas listas mapeiam essas 10 palavras em buckets de vocabulário e hash. Ou seja, cinco palavras mapeiam diretamente para
vocabulário, enquanto cinco outras palavras mapeiam para dois buckets de hash. Um bucket de hash
contém duas palavras e o outro bucket de hash contém três palavras.  O vocabulário
contém palavras comuns, e o bucket de hash contém palavras
raras. Figura 5: abordagem híbrida que combina vocabulário e hash.

Observação sobre embeddings

Lembre-se de que o embedding do Curso intensivo de machine learning é um atributo categórico representado como um valor contínuo. Os modelos diretos convertem com frequência os índices de um índice para um embedding.

Diagrama mostrando o processo completo de mapeamento de categorias para vetores de recursos
usando incorporação. Uma tabela de embedding consiste em um conjunto numerado de linhas. Cada linha
tem um conjunto de valores de ponto flutuante entre 0,0 e 1,0. Para converter uma
categoria, o sistema copia a linha correspondente da tabela de embedding.
Por exemplo, se a categoria de entrada for 0, o sistema copiará a primeira linha
da tabela de embedding para o vetor do atributo. Se a categoria de entrada for 1,
o sistema vai copiar a segunda linha da tabela de embedding para o vetor de
atributos. Figura 6: vetores esparsos de atributos por incorporação

As outras transformações que discutimos poderiam ser armazenadas em disco, mas os embeddings são diferentes. Como os embeddings são treinados, eles não são uma transformação de dados típica. Eles fazem parte do modelo. Eles são treinados com outros pesos de modelos e funcionalmente são equivalentes a uma camada de pesos.

E as embeddings pré-treinadas? Os embeddings pré-treinados costumam ser modificáveis durante o treinamento, então ainda são parte conceitualmente do modelo.