O pacote randomForest de R não pode lidar com fatores com mais de 32 níveis. Quando recebe mais de 32 níveis, emite uma mensagem de erro:
Não é possível lidar com preditores categóricos com mais de 32 categorias.
Mas os dados que tenho têm vários fatores. Alguns deles têm mais de 1000 níveis e outros mais de 100. Tem até 'estado' dos estados unidos, que é 52.
Então, aqui está a minha pergunta.
Por que existe essa limitação? randomForest se recusa a executar mesmo para o caso simples.
> d <- data.frame(x=factor(1:50), y=1:50) > randomForest(y ~ x, data=d) Error in randomForest.default(m, y, ...) : Can not handle categorical predictors with more than 32 categories.
Se é simplesmente devido à limitação de memória, como o randomForeestRegressor do scikit learn pode ser executado com mais de 32 níveis?
Qual é a melhor maneira de lidar com esse problema? Suponha que eu possua variáveis independentes X1, X2, ..., X50 e Y seja variável dependente. E suponha que X1, X2 e X3 tenham mais de 32 níveis. O que devo fazer?
O que estou pensando é em executar o algoritmo de agrupamento para cada um dos X1, X2 e X3, em que a distância é definida como diferença em Y. Vou executar três agrupamentos, pois há três variáveis problemáticas. E em cada agrupamento, desejo encontrar níveis semelhantes. E eu vou fundi-los.
Como isso soa?
fonte
randomForest
pode lidar com preditores categóricos com até 53 níveis. NotíciasRespostas:
É realmente um constrangimento muito razoável porque um split em um fator com níveis é realmente uma seleção de um dos 2 N - 2 combinações possíveis. Assim, mesmo com N como 25, o espaço das combinações é tão grande que essa inferência faz pouco sentido.N 2N- 2 N
A outra opção é alterar a representação - talvez seu resultado não dependa diretamente da entidade do estado, mas, por exemplo, área, população, número de pinheiros per capita ou outros atributos que você possa conectar ao seu sistema de informação.
Também pode ser que cada estado seja uma entidade tão isolada e não correlacionada que exija um modelo separado para si.
O agrupamento com base em uma decisão provavelmente é uma má idéia, pois dessa maneira você contrabandeia informações da decisão para atributos, que geralmente terminam em super ajuste.
fonte
O principal motivo é como o randomForest é implementado. A implementação de R segue muito as especificações originais de Breiman. O que é importante notar aqui é que, para variáveis fatoriais / categóricas, o critério de divisão é binário com alguns valores de rótulo à esquerda e os demais valores de rótulo à direita.
Por que as implementações de Weka e Python funcionam?
A implementação weka não usa árvores CART por padrão. Utiliza árvores C45 que não apresentam esse problema computacional, pois para entradas categóricas se divide em vários nós, um para cada valor de nível.
A implementação da floresta aleatória python não pode usar variáveis categóricas / fator. Você precisa codificar essas variáveis em variáveis dummy ou numéricas.
fonte
Você pode tentar representar essa coluna de maneira diferente. Você pode representar os mesmos dados que um quadro de dados esparso.
Código mínimo viável;
Observe como agora cada valor na coluna original se torna uma coluna dummy separada.
Código de exemplo mais extenso;
Mesmo que esse trecho de código mostre que você realmente não receberá mais o erro, notará que o algoritmo randomForest agora precisa de um longo tempo antes de terminar. Isso ocorre devido a uma restrição de CPU; agora, você também pode mapear essa tarefa por amostragem.
Para mais informações, consulte este blogpost:
https://blog.cloudera.com/blog/2013/02/how-to-resample-from-a-large-data-set-in-parallel-with-r-on-hadoop/
fonte
Você pode usar o pacote extraTrees. O algoritmo de florestas extremamente aleatórias não tenta nenhum ponto de interrupção / divisão, mas apenas um subconjunto aleatório limitado de divisões.
fonte
Outra opção: dependendo do número de níveis e do número de observações em seus dados, você pode mesclar alguns níveis. Além de ficar abaixo do limite, pode reduzir a variação se você tiver muitos níveis com apenas algumas observações. Hadley é forcats: fct_lump faz isso.
fonte