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

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

Nome do atributo Nº de categorias Exemplos de categorias
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 recurso categórico tiver um número baixo de categorias possíveis, ele poderá ser codificado como um vocabulário. Com uma codificação de vocabulário, o modelo trata cada valor categórico possível como um recurso separado. Durante o treinamento, o modelo 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 recurso 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 (valores possíveis) para car_color:

Figura 1. Cada cor na paleta é representada como um recurso
      separado. Ou seja, cada cor é um elemento separado no vetor de características.
      Por exemplo, "Vermelho" é um recurso, "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 aprendizado de máquina pode ser treinado diretamente com valores de string brutos, como "Vermelho" e "Preto", 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 aprendizado de máquina só pode ser treinado com atributos com valores de ponto flutuante. Portanto, é necessário 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ê precisa converter cada string em um número de índice exclusivo, como na seguinte ilustração:

Figura 2. Cada cor está associada a um valor inteiro exclusivo. Por
      exemplo, "Vermelho" é associado ao número inteiro 0, "Laranja" ao
      número inteiro 1 e assim por diante.
Figura 2. Recursos indexados.

Exercício: verificar sua intuição

O modelo precisa ser treinado diretamente nos números de índice mostrados na Figura 2?
Sim
Se o modelo fosse treinado com os números de índice, ele trataria cada um deles como um valor numérico e consideraria "Black" (número de índice 5) como 5 vezes mais significativo para o modelo do que "Orange" (número de índice 1).
Não
Seu modelo não pode ser treinado com números de índice. Se isso acontecesse, o modelo trataria cada número de índice como um valor numérico e consideraria "Black" (índice 5) como cinco vezes mais significativo para o modelo do que "Orange" (índice 1).

Codificação one-hot

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

  • Cada categoria é representada por um vetor (matriz) de N elementos, em que N é o número de categorias. Por exemplo, se car_color tiver oito categorias possíveis, o vetor one-hot que representa terá oito elementos.
  • Exatamente um dos elementos em um vetor one-hot tem o valor 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, e não a string ou o número de índice, que é transmitido ao vetor de recursos. O modelo aprende um peso separado para cada elemento do vetor de recursos.

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

Figura 3. Diagrama do processo completo para mapear categorias para vetores de características. No diagrama, os recursos de entrada são "amarelo",
      "laranja", "azul" e "azul" uma segunda vez.  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. Assim, o sistema mapeia "Amarelo",
      'Laranja', 'Azul' e 'Azul' para 3, 1, 2, 2. Em seguida, o sistema converte esses valores em um vetor de atributo one-hot. Por exemplo, dado 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 elemento com valores predominantemente nulos (ou vazios) é chamado de elemento vazio. Muitos atributos categóricos, como car_color, tendem a ser esparsos. Representação esparsa significa armazenar a posição de 1,0 em um vetor esparsa. 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), a representação esparsa do vetor one-hot anterior é:

2

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

Valores atípicos em dados categóricos

Assim como os numéricos, os categóricos também contêm outliers. Suponha que car_color contenha não apenas as cores conhecidas, mas também algumas cores outliers raramente usadas, como "Mauve" ou "Avocado". Em vez de dar a cada uma dessas cores de outliers uma categoria separada, você pode agrupá-las em uma única categoria geral chamada fora do vocabulário (OOV, na sigla em inglês). Em outras palavras, todas as cores atípicas são agrupadas em um único bucket de atípicos. O sistema aprende um único peso para esse bucket de valor discrepante.

Como codificar atributos categóricos de alta dimensão

Alguns recursos categóricos têm um grande número de dimensões, como os da tabela a seguir:

Nome do atributo Nº de categorias Exemplos de categorias
words_in_english ~500.000 "feliz", "caminhar"
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 é uma escolha ruim. As incorporações, detalhadas em um módulo de incorporação separado, geralmente são uma opção muito melhor. As incorporações reduzem substancialmente o número de dimensões, 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 latência mais baixa.

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