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:
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.
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 Number | Category |
---|---|
0 | Red |
1 | Orange |
2 | Blue |
... | ... |
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.
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.
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.
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.
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.