Dados categóricos: vocabulário e codificação one-hot

O termo dimensão é um sinônimo do número de elementos em uma vetor de recurso. Alguns atributos categóricos são de baixa dimensão. Exemplo:

Nome do atributo No de categorias Categorias de exemplo
snowed_today 2 Verdadeiro, falso
skill_level 3 Iniciante, profissional, especialista
season 4 Inverno, Primavera, Verão, Outono
day_of_week 7 Segunda-feira, terça-feira, quarta-feira
planeta 8 Mercúrio, Vênus, Terra

Quando um atributo categórico tem um número baixo de categorias possíveis, codificá-lo como um vocabulário. Com uma codificação de vocabulário, o modelo trata cada valor categórico possível como um atributo separado. Durante o treinamento, a aprende pesos diferentes para cada categoria.

Por exemplo, suponha que você esteja criando um modelo para prever o preço de um carro com base em parte, em um atributo categórico chamado car_color. Talvez os carros vermelhos valham mais do que os verdes. Como os fabricantes oferecem um número limitado de cores externas, car_color é um atributo categórico de baixa dimensão. A ilustração a seguir sugere um vocabulário (possíveis valores) para car_color:

Figura 1. Cada cor da paleta é representada como uma cor
      . Ou seja, cada cor é um atributo separado no vetor de atributos.
      Por exemplo, "vermelho" é um atributo "Laranja" é um recurso separado,
      e assim por diante.
Figura 1. Um recurso exclusivo para cada categoria.

Exercício: verificar sua intuição

Verdadeiro ou falso: um modelo de machine learning pode ser treinado diretamente em valores brutos de string, como "Red" e "Black", sem converter esses valores em vetores numéricos.
Verdadeiro
Durante o treinamento, um modelo só pode manipular números de ponto flutuante. A string "Red" não é um número de ponto flutuante. Você precisa converter strings como "Red" em números de ponto flutuante.
Falso
Um modelo de machine learning só pode ser treinado em atributos valores de ponto flutuante, portanto, você precisará converter essas strings em valores de ponto flutuante antes do treinamento.

Números de índice

Os modelos de machine learning só podem manipular números de ponto flutuante. Portanto, você deve converter cada string em um número de índice exclusivo, como em na ilustração a seguir:

Figura 2. Cada cor está associada a um valor inteiro exclusivo. Para
      exemplo, "vermelho" está associado ao número inteiro 0, "laranja" com o
      inteiro 1 e assim por diante.
Figura 2. Atributos indexados.

Verifique sua intuição

Caso seu modelo seja treinado diretamente com os números de índice mostrados na figura 2?
Sim
Se o modelo treinado com números de índice, tratar cada um incorretamente como um valor numérico e considerar "Black" (índice número 5) seja cinco vezes mais significativo ao modelo do que "Orange" (índice número 1).
Não
Seu modelo não pode ser treinado com números de índice. Nesse caso, o modelo trata cada número de índice como um valor numérico e considerar que "Black" (número de índice 5) é cinco vezes mais significativo para o modelo do que "Orange" (número do índice 1).

Codificação one-hot

A próxima etapa na construção de um vocabulário é converter cada número de índice em a codificação one-hot. Em uma codificação one-hot:

  • Cada categoria é representada por um vetor (matriz) de N elementos, onde N é o número de categorias. Por exemplo, se car_color tiver oito possibilidades o vetor one-hot representado terá oito elementos.
  • Exatamente um dos elementos em um vetor one-hot tem o valor de 1,0. todos os elementos restantes têm o valor 0,0.

Por exemplo, a tabela a seguir mostra a codificação one-hot para cada um em car_color:

Recurso Vermelho Orange Azul Amarelo Verde Preto Roxo Marrom
"Vermelho" 1 0 0 0 0 0 0 0
"Laranja" 0 1 0 0 0 0 0 0
"Azul" 0 0 1 0 0 0 0 0
"Amarelo" 0 0 0 1 0 0 0 0
"Verde" 0 0 0 0 1 0 0 0
"Preto" 0 0 0 0 0 1 0 0
"Roxo" 0 0 0 0 0 0 1 0
"Marrom" 0 0 0 0 0 0 0 1

É o vetor one-hot, não a string ou o número do índice, que é transmitido ao vetor do atributo. O modelo aprende um peso separado para cada elemento de vetor de recurso.

A ilustração a seguir sugere as várias transformações na representação do vocabulário:

Figura 3. Diagrama do processo completo de mapeamento das categorias
      vetores de atributo. No diagrama, os atributos de entrada são "amarelo",
      "Laranja", "Azul" e "Azul" pela segunda vez.  O sistema usa um
      vocabulário ("Vermelho" é 0, "Laranja" é 1, "Azul" é 2, "Amarelo" é 3 e
      assim por diante) para mapear o valor de entrada para um ID. Assim, o sistema mapeia "amarelo",
      "Laranja", "Azul" e "Azul" como 3, 1, 2 e 2. O sistema então converte
      esses valores em um vetor de atributos one-hot. Por exemplo, considerando um sistema
      com oito cores possíveis, 3 se torna 0, 0, 0, 1, 0, 0, 0, 0.
Figura 3. O processo completo para mapear categorias para vetores de recursos.

Representação esparsa

Um atributo com valores predominantemente zero (ou vazio) é denominado atributo esparso. Muitas categóricos, como car_color, tendem a ser atributos esparsos. Representação esparsa significa armazenar a posição do 1.0 em um vetor esparso. Por exemplo, o vetor one-hot para "Blue" é:

[0, 0, 1, 0, 0, 0, 0, 0]

Como 1 está na posição 2 (ao iniciar a contagem em 0), o representação esparsa do vetor one-hot anterior é:

2

Observe que a representação esparsa consome muito menos memória do que um vetor one-hot de oito elementos. É importante ressaltar que o modelo precisa ser treinado na vetor one-hot, e não a representação esparsa.

Outliers em dados categóricos

Assim como os numéricos, os categóricos também contêm outliers. Suponha car_color contém não apenas as cores mais usadas, mas também algumas cores raramente usadas cores outliers, como "Mauve" ou "Avocado". Em vez de dar a cada uma dessas cores outliers uma categoria separada, você pode colocá-los em uma tabela chamada fora do vocabulário (OOV, na sigla em inglês). Em outras palavras, todas as cores outliers são agrupadas em um único um bucket outlier. O sistema aprende um único peso para o bucket de outlier.

Como codificar atributos categóricos de alta dimensão

Alguns atributos categóricos têm muitas dimensões, como as da tabela a seguir:

Nome do atributo No de categorias Categorias de exemplo
words_in_english Aprox. 500.000 "feliz", "caminhando"
US_postal_codes ~42.000 "02114", "90301"
last_names_in_Germany ~850.000 "Schmidt", "Schneider"

Quando o número de categorias é alto, a codificação one-hot geralmente não é uma boa escolha. Embeddings, detalhados em um outro Módulo Embeddings, geralmente são uma escolha muito melhor. Os embeddings reduzem bastante o número de o que beneficia os modelos de duas maneiras importantes:

  • Normalmente, o treinamento do modelo é mais rápido.
  • O modelo criado normalmente infere previsões mais rapidamente. Ou seja, o modelo tem menor latência.

Hash (também chamado de hash) ) é uma forma menos comum de reduzir o número de dimensões.