Codificação one-hot vs dummy no Scikit-learn

50

Existem duas maneiras diferentes de codificar variáveis ​​categóricas. Digamos, uma variável categórica tem n valores. A codificação one-hot converte-a em n variáveis, enquanto a codificação fictícia converte-a em n-1 variáveis. Se tivermos k variáveis ​​categóricas, cada uma com n valores. Uma codificação quente termina com variáveis kn , enquanto a codificação fictícia termina com variáveis kn-k .

Ouvi dizer que, para codificação one-hot, a interceptação pode levar a um problema de colinearidade, o que faz o modelo não parecer. Alguém chama isso de " armadilha variável fictícia ".

Minhas perguntas:

  1. O modelo de regressão linear do Scikit-learn permite que os usuários desativem a interceptação. Portanto, para a codificação one-hot, devo sempre definir fit_intercept = False? Para codificação fictícia, fit_intercept sempre deve ser definido como True? Não vejo nenhum "aviso" no site.

  2. Como a codificação one-hot gera mais variáveis, ela tem mais grau de liberdade do que a codificação fictícia?

Munichong
fonte

Respostas:

35

O modelo de regressão linear do Scikit-learn permite que os usuários desativem a interceptação. Portanto, para a codificação one-hot, devo sempre definir fit_intercept = False? Para codificação fictícia, fit_intercept sempre deve ser definido como True? Não vejo nenhum "aviso" no site.

Para um modelo linear não regulamentado com codificação one-hot, sim, você precisa definir a interceptação como falsa ou incorrer em colinearidade perfeita. sklearntambém permite uma penalidade de encolhimento da cordilheira e, nesse caso, não é necessário; na verdade, você deve incluir a interceptação e todos os níveis. Para codificação dummy, você deve incluir uma interceptação, a menos que padronize todas as suas variáveis; nesse caso, a interceptação é zero.

Como a codificação one-hot gera mais variáveis, ela tem mais grau de liberdade do que a codificação fictícia?

A interceptação é um grau adicional de liberdade; portanto, em um modelo bem especificado, tudo se iguala.

Para o segundo, e se houver k variáveis ​​categóricas? As variáveis ​​k são removidas na codificação fictícia. O grau de liberdade ainda é o mesmo?

Não foi possível ajustar um modelo no qual você usou todos os níveis de ambas as variáveis ​​categóricas, interceptadas ou não. Pois, assim que você codificar todos os níveis em uma variável no modelo, digamos com variáveis ​​binárias , você terá uma combinação linear de preditores igual ao vetor constantex1,x2,,xn

x1+x2++xn=1

Se você tentar inserir todos os níveis de outro categórico no modelo, você terá uma combinação linear distinta igual a um vetor constantex

x1+x2++xk=1

e assim você criou uma dependência linear

x1+x2+xnx1x2xk=0

Portanto, você deve deixar de fora um nível na segunda variável, e tudo se alinha adequadamente.

Digamos, eu tenho 3 variáveis ​​categóricas, cada uma com 4 níveis. Na codificação fictícia, 3 * 4-3 = 9 variáveis ​​são construídas com uma interceptação. Na codificação one-hot, 3 * 4 = 12 variáveis ​​são criadas sem interceptação. Estou correcto?

A segunda coisa realmente não funciona. A matriz de design da coluna criada por você será singular. Você precisa remover três colunas, uma de cada uma das três codificações categóricas distintas, para recuperar a não singularidade do seu design.3×4=12

Matthew Drury
fonte
Obrigado. Para o segundo, e se houver k variáveis ​​categóricas? As variáveis ​​k são removidas na codificação fictícia. O grau de liberdade ainda é o mesmo?
Munichong 18/07/16
@ChongWang Eu editei uma resposta ao seu comentário na minha resposta.
Matthew Drury
Desculpe, estou um pouco perdido aqui. Digamos, eu tenho 3 variáveis ​​categóricas, cada uma com 4 níveis. Na codificação fictícia, 3 * 4-3 = 9 variáveis ​​são construídas com uma interceptação. Na codificação one-hot, 3 * 4 = 12 variáveis ​​são criadas sem interceptação. Estou correcto? Portanto, aqui o DF da codificação fictícia é 9-1, enquanto o DF da codificação one-hot é 12. Estou correto?
Munichong 19/07/16
@ChongWang Editado novamente.
Matthew Drury
@MatthewDrury Eu tenho o mesmo problema com linear_model no sklearn. Após a codificação fictícia, a Decision Tree e o KNN funcionam bem, mas a regressão linear cai na singularidade. Entendo pela sua resposta que devo remover um "nível da segunda variável", mas não sei o que praticamente significa? Por exemplo, tenho 3 recursos numéricos e 3 categóricos (fabricante, modelo e tipo de combustível). O modelo é naturalmente confiável no fabricante, pois um fabricante pode ter n modelos. Então, como proceder nesse tipo de cenário comum se eu quiser usar a regressão linear?
Harvey