Quando usar o One Hot Encoding vs LabelEncoder vs DictVectorizor?

97

Estou construindo modelos com dados categóricos já há algum tempo e, nessa situação, basicamente uso como padrão a função LabelEncoder do scikit-learn para transformar esses dados antes de criar um modelo.

Eu entendo a diferença entre OHE, LabelEncodere DictVectorizorem termos do que eles estão fazendo para os dados, mas o que não está claro para mim é quando você pode optar por empregar uma técnica em detrimento de outro.

Existem certos algoritmos ou situações em que um tem vantagens / desvantagens em relação aos outros?

anthr
fonte
2
Em referência à resposta do AN6U5 e a esta declaração:> Ainda existem algoritmos como árvores de decisão e florestas aleatórias que podem funcionar com variáveis ​​categóricas muito bem e o LabelEncoder pode ser usado para armazenar valores usando menos espaço em disco. O uso do LabelEncoder não transformaria um recurso categórico em um numérico, fazendo com que uma árvore de decisão fizesse divisões com algum valor que realmente não faz sentido, pois o mapeamento é arbitrário?
Nico
1
Nico, acho que o que o AN6U5 está dizendo é especificamente para árvores de decisão: funciona bem, porque a árvore se dividiria em cachorro, gato, rato ou 1,2,3 e o significado de "gato" vs "2" não é importante para uma árvore (pense na maneira como ela se divide). No caso de algo como regressão logística, os valores fazem parte de uma equação, pois você multiplica os valores de peso *, de modo que isso pode causar problemas de treinamento e de peso, dado que cão: 1 e gato: 2 não possui relação numérica 1 * 2 (embora ainda pode funcionar com exemplos e épocas de treinamento suficientes).
Doug F

Respostas:

126

Existem alguns casos em que LabelEncoder ou DictVectorizor são úteis, mas na minha opinião são bastante limitados devido à ordinalidade.

LabelEncoder pode transformar [cachorro, gato, cachorro, rato, gato] em [1,2,1,3,2], mas a ordinalidade imposta significa que a média de cachorro e rato é gato. Ainda existem algoritmos, como árvores de decisão e florestas aleatórias, que podem funcionar muito bem com variáveis ​​categóricas, e o LabelEncoder pode ser usado para armazenar valores usando menos espaço em disco.

A codificação One-Hot tem a vantagem de que o resultado é binário e não ordinal e que tudo fica em um espaço vetorial ortogonal. A desvantagem é que, para alta cardinalidade, o espaço de recursos pode explodir rapidamente e você começa a lutar com a maldição da dimensionalidade. Nesses casos, normalmente utilizo a codificação one-hot seguida pelo PCA para redução da dimensionalidade. Acho que a combinação criteriosa de PCA mais quente raramente pode ser superada por outros esquemas de codificação. O PCA encontra a sobreposição linear; portanto, tenderá naturalmente a agrupar recursos semelhantes no mesmo recurso.

AN6U5
fonte
1
Muito obrigado - isso é muito útil e faz muito sentido. Existem outros esquemas de codificação usados ​​para casos específicos / de borda? Você já encontrou uma situação em que utilizaria diferentes esquemas de codificação para diferentes recursos?
anthr
21

Embora o AN6U5 tenha dado uma resposta muito boa, eu gostaria de acrescentar alguns pontos para referência futura. Ao considerar One Hot Encoding (OHE) e Label Encoding , devemos tentar entender qual modelo você está tentando construir. Nomeadamente, as duas categorias de modelo que consideraremos são:

  1. Modelos baseados em árvores : árvores de decisão reforçadas por gradiente e florestas aleatórias.
  2. Modelos Não Baseados em Árvore : Linear, kNN ou Rede Neural.

Vamos considerar quando aplicar OHE e quando aplicar Label Encoding ao criar modelos baseados em árvore.

Aplicamos OHE quando:

  1. Quando os valores que estão próximos um do outro na codificação do rótulo correspondem aos valores de destino que não estão próximos (dados não lineares).
  2. Quando o recurso categórico não é ordinal (cachorro, gato, rato).

Aplicamos a codificação de etiquetas quando:

  1. O recurso categórico é ordinal (Jr. kg, Sr. kg, escola primária, ensino médio, etc.).
  2. Quando podemos criar um codificador de etiqueta que atribua etiquetas fechadas a categorias semelhantes : Isso leva a menos vazamentos na trança, reduzindo o tempo de execução.
  3. Quando o número de recursos categóricos no conjunto de dados é enorme: a codificação de um recurso quente com um grande número de valores pode levar a (1) alto consumo de memória e (2) o caso em que recursos não categóricos raramente são usados ​​pelo modelo. Você pode lidar com o 1º caso se empregar matrizes esparsas. O segundo caso pode ocorrer se você construir uma árvore usando apenas um subconjunto de recursos. Por exemplo, se você tiver 9 recursos numéricos e 1 categórico com 100 valores exclusivos e codificou esse recurso categórico uma vez, obterá 109 recursos. Se uma árvore for construída com apenas um subconjunto de recursos, os 9 recursos numéricos iniciais raramente serão usados. Nesse caso, você pode aumentar o tamanho do controle de parâmetro desse subconjunto. No xgboost, ele é chamado colsample_bytree, no Random Forest max_features do sklearn.

Caso deseje continuar com o OHE, como sugerido por @ AN6U5, convém combinar o PCA com o OHE.

Vamos considerar quando aplicar a OHE e a codificação de etiquetas ao criar modelos não baseados em árvore.

Para aplicar a codificação de etiqueta, a dependência entre o recurso e o destino deve ser linear para que a codificação de etiqueta seja utilizada efetivamente.

Da mesma forma, caso a dependência seja não linear, convém usar o OHE para o mesmo.

Nota: Algumas das explicações foram mencionadas em Como vencer um concurso de ciência de dados da Coursera.

Pushkaraj Joshi
fonte
Explicação muito intuitiva. Não deveria ser "splits", não "spillts"?
dzieciou
0

LabelEncoder é para dados ordinais, enquanto OHE é para dados nominais.

vochicong
fonte