O termo dimensão é sinônimo do número de elementos em um vetor de atributos. Alguns recursos 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, terça e quarta-feira |
| planeta | 8 | Mercúrio, Vênus, Terra |
Quando um atributo categórico tem um número baixo de categorias possíveis, é possível 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, 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:
Números de índice
Os modelos de machine learning só podem manipular números de ponto flutuante. Portanto, é necessário converter cada string em um número de índice exclusivo, como na ilustração a seguir:
Depois de converter strings em números de índice exclusivos, você precisará processar os dados para representá-los de maneiras que ajudem o modelo a aprender relações significativas entre os valores. Se os dados de atributos categóricos forem deixados como inteiros indexados e carregados em um modelo, ele vai tratar os valores indexados como números de ponto flutuante contínuos. O modelo consideraria "roxo" seis vezes mais provável do que "laranja".
Codificação one-hot
A próxima etapa na criação de um vocabulário é converter cada número de índice na respectiva 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_colortiver oito categorias possíveis, o vetor one-hot que o 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 cor 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 de índice, que é transmitido para o vetor de recursos. O modelo aprende um peso separado para cada elemento do vetor de atributos.
A ilustração a seguir sugere as várias transformações na representação do vocabulário:
Representação esparsa
Um atributo cujos valores são predominantemente zero (ou vazios) é chamado de atributo esparso. Muitos atributos categóricos, como car_color, tendem a ser 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 o 1 está na posição 2 (ao iniciar a contagem em 0), a representação esparsa do vetor one-hot anterior é:
2
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, não na representação esparsa.
Valores atípicos em dados categóricos
Assim como os dados numéricos, os dados categóricos também têm outliers. Suponha que car_color contenha não apenas as cores mais usadas, mas também algumas cores atípicas raramente usadas, como "Mauve" ou "Avocado".
Em vez de dar a cada uma dessas cores discrepantes uma categoria separada, você pode agrupá-las em uma única categoria "geral" chamada fora do vocabulário (OOV). Em outras palavras, todas as cores discrepantes são agrupadas em um único bucket. O sistema aprende um único peso para esse bucket de outliers.
Codificação de 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 | "happy", "walking" |
| 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 má escolha. Os embeddings, detalhados em um módulo separado, geralmente são uma opção muito melhor. Os embeddings reduzem bastante o número de dimensões, o que beneficia os modelos de duas maneiras importantes:
- O modelo normalmente treina mais rápido.
- O modelo criado normalmente infere previsões mais rapidamente. Ou seja, o modelo tem menor latência.
O hashing (também chamado de truque de hashing) é uma maneira menos comum de reduzir o número de dimensões.
Exercício: teste de conhecimentos
"Red" não é um número de ponto flutuante. Você
precisa converter strings como "Red" em números de ponto flutuante.