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 e 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
:
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.
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 números 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_color
tiver 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 outros elementos 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 | Laranja | 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, é 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 de outliers são agrupadas em um único bucket de outliers. 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 | "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 é 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 geralmente 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.