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:

Resultado - Label Encoder

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:

Resultado - One-hot Encoder

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.

Referências

Choosing the right Encoding method-Label vs OneHot Encoder
how can your choice of encoding play a major role in your prediction model
Label Encoder vs. One Hot Encoder in Machine Learning
Originally published here: http://blog.contactsunny.com/data-science/label-encoder-vs-one-hot-encoder-in-machine-learning