Estou trabalhando em um conjunto de dados com mais de 200.000 amostras e aproximadamente 50 recursos por amostra: 10 variáveis contínuas e as outras ~ 40 são variáveis categóricas (países, idiomas, campos científicos etc.). Para essas variáveis categóricas, você tem, por exemplo, 150 países diferentes, 50 idiomas, 50 campos científicos, etc.
Até agora, minha abordagem é:
Para cada variável categórica com muitos valores possíveis, pegue apenas a que possui mais de 10000 amostras que recebem esse valor. Isso reduz para 5 a 10 categorias em vez de 150.
Crie uma variável fictícia para cada uma das categorias (se 10 países, em seguida, para cada amostra, adicione um vetor binário de tamanho 10).
Alimente um classificador de floresta aleatório (valide cruzadamente os parâmetros etc ...) com esses dados.
Atualmente, com essa abordagem, eu só consigo obter 65% de precisão e sinto que mais pode ser feito. Especialmente, não estou satisfeito com o meu 1), pois sinto que não deveria remover arbitrariamente os "valores menos relevantes" de acordo com o número de amostras que eles têm, porque esses valores menos representados poderiam ser mais discriminatórios. Por outro lado, minha RAM não pode permitir adicionar 500 colunas * 200000 linhas aos dados, mantendo todos os valores possíveis.
Você teria alguma sugestão para lidar com tantas variáveis categóricas?
Respostas:
1) As florestas aleatórias devem ser capazes de lidar com valores categóricos de forma nativa; portanto, procure uma implementação diferente para que você não precise codificar todos esses recursos e usar toda a sua memória.
2) O problema com os recursos categóricos de alta cardinalidade é que é fácil se ajustar a eles. Você pode ter dados suficientes para que isso não seja um problema, mas tenha cuidado.
3) Sugiro olhar para a seleção aleatória de recursos baseados em florestas, usando o método proposto por Brieman ou contrastes artificiais . O método de contrastes artificiais (ACE) é interessante porque compara a importância do recurso à importância de uma versão embaralhada de si mesma que combate alguns dos problemas de alta cardinalidade. Existe um novo artigo "Florestas aleatórias guiadas por módulo" que pode ser interessante se você tiver muitos outros recursos, pois utiliza um método de seleção de recursos que conhece grupos de recursos altamente correlacionados.
4) Outra opção usada em algum momento é ajustar o algoritmo para que ele use as malas fora da bolsa para fazer a seleção final do recurso depois de ajustar as divisões nas malas na bolsa, o que às vezes ajuda a combater o excesso de ajustes.
Existe uma implementação de ás quase completa aqui e eu tenho uma implementação de memória eficiente / rápida em rf que lida com variáveis categóricas nativamente aqui ... a opção -evaloob suporta a opção 4 Estou trabalhando para adicionar suporte para o ACE e algumas outras rf com base em métodos de seleção de recursos, mas ainda não foi concluído.
fonte
pandas.get_dummies
função). A implementação de floresta aleatória do H2O teve um desempenho muito bom para mim (consulte 0xdata.com/docs/master/model/rf ).Em vez de dummificar suas categorias, por que você não usaria simplesmente uma única variável numérica para cada uma? No contexto de florestas aleatórias, sempre me perguntei sobre as consequências de fazer isso (porque concordo que parece suspeito introduzir ordinalidade em dados categóricos com os quais, se freqüentemente não faz sentido), mas na prática (pelo menos com a implementação de RFs do scikit-learn que tenho usado), observei muitas vezes que isso não faz diferença nos resultados (não sei por que).
fonte
Eu acho que você deve considerar uma / mais técnica (s) de redução variável . Ele se livra dos preditores não tão influentes.
Eu tenho lido muito sobre pré-processamento de dados e é uma ótima solução para reduzir o n ° de suas variáveis.
Minhas sugestões são as seguintes:
'nzv'
função do'caret'
pacote. Isso reduzirá bastante sua dimensão de dados.Além disso, eu sugeriria o uso do algoritmo AdaBoost em vez do RF. Pessoalmente, as pesquisas que fiz me deram coeficientes de Gini muito semelhantes para esses dois métodos. A parte boa do AdaBoost é que, no R, ele lida com as observações ausentes. Então você pode pular o primeiro passo desta lista
Espero que tenha ajudado um pouco. Boa sorte
fonte
Você pode considerar modelos de efeitos mistos. Eles são populares nas ciências sociais devido ao seu desempenho em dados categóricos de alta cardinalidade, e eu os usei para criar ótimos modelos preditivos que superam as abordagens populares de aprendizado de máquina, como árvores com gradiente, florestas aleatórias e regressão logística regularizada com rede elástica. A implementação mais conhecida é o pacote lme4 do R; a função que você usaria para classificação é glmer, que implementa regressão logística de efeitos mistos. Você pode ter problemas com a escala do seu conjunto de dados, mas eu fiz 80k linhas com 15 recursos sem muita dificuldade.
fonte
Quando você diz "criar variável fictícia para cada uma das categorias" , parece que você está usando Python e não R? A floresta aleatória R pode lidar nativamente com categorias, também com consequente redução de memória. Tente R.
Em seguida, você não precisa remover / mesclar manualmente os níveis categóricos, isso soa como uma grande dor. E mesmo se você fez, você não tem garantia de que as categorias mais populosas são as mais preditivas. Controle a complexidade da floresta aleatória com o tamanho do nó : inicie com um tamanho de nó grande e reduza-o progressivamente (essa é a pesquisa por hiperparâmetro).
A seleção de variáveis será útil. @lorelai dá boas recomendações. Tente eliminar recursos inúteis (de baixa importância ou altamente correlacionados). A construção de árvores é quadrática em relação ao número de recursos, portanto, se você eliminar um terço, pagará dividendos.
fonte
Você deve olhar para o pacote H2O.ai. Ele lida com variáveis categóricas prontas para uso sem precisar fazer nenhuma codificação (verifique se as variáveis são fatores).
Gosto particularmente da implementação do Gradient Boosted Machine (GBM), porque é possível analisar a importância da variável após a construção do modelo. Os GBMs também têm o bom recurso de serem resistentes a sobreposições.
Se você deseja explorar outros modelos, eles têm: GLM, Random Forest, Naive Bayes, Deep Learning, etc.
Consulte: http://docs.h2o.ai/h2o/latest-stable/h2o-docs/data-science/gbm.html
Também é fácil de instalar (Windows, Linux, Mac) e fácil de executar com APIs usando R, Python, Java e Scala.
Ele pode usar vários núcleos para acelerar as coisas.
Em um futuro próximo, eles oferecerão suporte a GPUs.
Também é de código aberto e gratuito (existe suporte para empresas).
fonte