Práticas recomendadas para codificar recursos categóricos para Árvores de Decisão?

13

Ao codificar recursos categóricos para regressão linear, existe uma regra: o número de manequins deve ser um a menos que o número total de níveis (para evitar colinearidade).

Existe uma regra semelhante para as Árvores de Decisão (ensacadas, reforçadas)? Estou perguntando isso, porque uma prática padrão em Python parece ser a de expandir os nníveis em nmanequins (sklearns OneHotEncoderou Pandas pd.get_dummies), o que me parece subótimo.

O que você sugeriria como práticas recomendadas para codificar recursos categóricos para árvores de decisão?

Sergey Bushmanov
fonte

Respostas:

12

Parece que você entende que é capaz de ter nníveis, ao contrário de n-1, porque, diferentemente da regressão linear, não precisa se preocupar com a colinearidade perfeita.

(Estou abordando isso da perspectiva R, mas presumo que seja o mesmo no Python.) Isso depende de duas coisas, como 1) qual pacote você está usando e 2) quantos níveis de fator você possui.

1) Se você estiver usando o randomForestpacote de R , se tiver <33 níveis de fator, poderá prosseguir e deixá-los em um recurso, se desejar. Isso ocorre porque, na implementação da floresta aleatória de R, ele verifica quais níveis de fator devem estar de um lado da divisão e quais do outro (por exemplo, 5 dos seus níveis podem ser agrupados no lado esquerdo e 7 podem ser agrupados juntos à direita). Se você dividir o recurso categórico em nmanequins, o algoritmo não terá essa opção à sua disposição.

Obviamente, se o pacote em particular que você estiver usando não puder lidar com recursos categóricos, você precisará criar nvariáveis ​​fictícias.

2) Como mencionei acima, a implementação de floresta aleatória de R pode lidar apenas com 32 níveis de fator - se você tiver mais do que isso, precisará dividir seus fatores em subconjuntos menores ou criar uma variável dummy para cada nível.

Tchotchke
fonte
11
Obrigado! Estou entendendo você corretamente: a menos que eu esteja modelando em R, onde os recursos categóricos randomForestsão codificados automaticamente, eu devo usar nmanequins porque a colinearidade não é um problema para a RF?
Sergey Bushmanov
3
Ter mais de 32 categorias de códigos binários codificados terá um comportamento ligeiramente diferente na árvore, pois a RF selecionará apenas uma dessas colunas binárias, em vez de selecionar a única coluna do fator com muitos níveis. Essa diferença sutil significa que a divisão nas colunas binárias será menos informativa quando comparada à divisão na coluna fatorial, pois existe apenas uma opção (0/1) versus (1 / {2,3}, {2,1} / 3 ) etc.
Sycorax diz Reinstate Monica
@ user777 Não é um problema ter mais de 32 variáveis. É um problema não ter variáveis ​​de categoria "agrupadas" em Python sklearn... Praticamente falando, existe uma evidência (experiência prática, pesquisa, etc.) de que variáveis ​​"dumificadas" terão desempenho pior do que variáveis ​​categóricas "agrupadas" [em R]
Sergey Bushmanov
11
Teoricamente, podemos esperar que os não agrupados tenham um desempenho um pouco pior, porque você está dando menos flexibilidade ao modelo. No caso agrupado, se fosse realmente melhor tratar esse recurso como não agrupado, o modelo seria capaz de fazer isso (colocando um grupo de um lado e depois todo o resto do outro). No entanto, na prática, eu ficaria surpreso se não houvesse muita diferença (em particular no caso da RF, onde você está criando muitas árvores)
Tchotchke
2
Acho que a implementação randomForest usando recursos com muitos níveis de fator (> 15) é lenta como mencionado, mas também para gerar um desempenho medíocre do modelo. Eu acho que um número muito alto de divisões possíveis reduzirá a decorrelação pretendida de árvores no conjunto. extraTrees e Rborist apenas tentam uma subamostra de divisões catagóricas em cada nó. Isso pode ajudar a correlação e certamente acelerar. Assim, é possível uma variedade de soluções entre "randomForest try any split" e "sklern dummy-variable only try 1-versus-rest splits". Também agrupamentos diferentes dos muitos níveis em menos níveis podem ser úteis.
Soren Havelund Welling
4

Existe outra abordagem para lidar com variáveis ​​categóricas que é chamada de codificação de destino / impacto.

Nesse esquema, a idéia é codificar o recurso usando uma coluna flutuante única na qual o valor é a média da variável de destino em todas as linhas que compartilham a categoria. Isso é especialmente útil para modelos baseados em árvore, pois impõe uma relação de ordem dentro do recurso (ou seja, valores à direita da categoria têm resposta média mais alta que valores à esquerda) e facilita a divisão do espaço do preditor.

Aqui está uma boa explicação do assunto:
https://towardsdatascience.com/why-you-should-try-mean-encoding-17057262cd0

E aqui está um link para o artigo que originalmente propôs a codificação: http://helios.mm.di.uoa.gr/~rouvas/ssi/sigkdd/sigkdd.vol3.1/barreca.pdf

Há mais alguns detalhes para evitar estimar a média em categorias com contagens baixas e também há outro modelo, o CatBoost, que propõe uma solução para a polarização introduzida por essa codificação, mas, na minha experiência, é uma maneira simples e muito útil de codificar variáveis ​​categóricas de alta cardinalidade .

Ludecan
fonte