A maioria dos algoritmos de Machine Learning trabalham apenas com dados numéricos, porém os problemas do mundo real muitas vezes trarão variáveis categóricas (ex: sim/não, alto/médio/baixo, ruim/regular/bom entre outros exemplos). Como podemos, então, construir um modelo de Machine Learning que utiliza variáveis desse tipo?
As duas maneiras mais comuns de converter/codificar variáveis categóricas são: Label Encoder e One-hot Encoder. Ambos os métodos tem o mesmo objetivo: codificar categorias em números. Nesse artigo vamos falar um pouco sobre elas, suas vantagens e desvantagens e quando utilizar cada uma.
Label Encoder
Label Encoding consiste em converter as classes categóricas em números que as representam (ex: masculino/feminino são convertidos em 0/1, Brasil/EUA/Japão serão convertidos em 0/1/2, etc.). Vamos utilizar como exemplo os países, que não possuem relação de ordem, utilizar o Label Encoder teria o seguinte resultado:
A coluna "País" poderia ser removia, porém optamos por mantê-la na imagem para fins didáticos.
Porém o Label Encoder introduz um novo problema para o modelo. Se tomarmos como exemplo os países: Brasil/EUA/Japão (que foram convertidos em 0/1/2) o modelo poderá se confundir ao achar que as datas representam algum tipo de ordem: 0 < 1 < 2 e atribuir um peso maior ao Japão por exemplo.
Sendo assim fica claro que, se precisarmos converter variáveis sem que haja qualquer relação de ordem, devemos evitar utilizar o Label Encoder. Podemos implementar o LabelEncoder (presente no pacote Scikitlearn) em python:
# importar pacotes
from sklearn.preprocessing import LabelEncoder
# instanciar encoder
le = LabelEncoder()
# 'treinar' encoder
le.fit(y_train)
# realizar a transformação
y_train = le.transform(y_train)
# visualizar classes encontradas
le.classes_
# recuperar os labels originals
le.inverse_transform(y_train)
One-hot Encoder
Como dissemos, dependendo da situação, podemos confundir o modelo ao utilizar o Label Encoder, tornando-a uma solução inviável. Para evitar isso, podemos utilizar o One-hot Encoder.
De maneira simples, o One-hot Encoder pega as categorias de uma coluna e as divide em várias colunas, cada uma representando uma categoria, essas colunas são preenchidas com valor 0 ou 1 - dependendo da categoria original. Tomemos nosso exemplo anterior dos países, se utilizarmos o One-hot Encoder teremos um resultado semelhante ao ilustrado abaixo:
Também podemos implementar o OneHotEncoder (presente no pacote Scikitlearn) em python:
# importar pacotes
from sklearn.preprocessing import OneHotEncoder
# instanciar encoder
le = OneHotEncoder()
# 'treinar' encoder
le.fit(X_train)
# criar dataframe
X_train_enc = le.transform(X_train)
A desvantagem desse método comparado ao anterior é que, se tivermos muitas categorias para uma variável, iremos produzir muitas colunas adicionais e dependendo do modelo que estamos utilizando, podemos introduzir outros problemas de desempenho.
Conclusão
O intuito desse artigo foi trazer um pouco sobre as diferenças das duas principais formas de conversão de variáveis categóricas para modelos de Machine Learning - Label Encoder e One-hot Encoder.
Em resumo, vimos que o Label Encoder é uma excelente ferramenta para converter variáveis categóricas que possuem alguma relação de ordem, no entanto não é indicado para variáveis que não possuem tal relação devido a possibilidade de introduzir problemas no modelo.
Já o One-hot Encoder é ideal para os casos em que o Label Encoder não é indicado, no entanto, dependendo do número de categorias, o One-hot Encoder pode introduzir outro tipo de problema no modelo.
A escolha do método de codificação dependerá do problema que está sendo analisado.