Amostragem com substituição em R randomForest


11

A implementação randomForest não permite amostragem além do número de observações, mesmo quando amostragem com substituição. Por que é isso?

Funciona bem:

rf <- randomForest(Species ~ ., iris, sampsize=c(1, 1, 1), replace=TRUE)
rf <- randomForest(Species ~ ., iris, sampsize=3, replace=TRUE)

O que eu quero fazer:

rf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), replace=TRUE)
Error in randomForest.default(m, y, ...) : 
  sampsize can not be larger than class frequency

Erro semelhante sem amostra estratificada:

rf <- randomForest(Species ~ ., iris, sampsize=151, replace=TRUE)
Error in randomForest.default(m, y, ...) : sampsize too large

Como eu esperava que o método coletasse amostras de autoinicialização quando substituir = TRUE nos dois casos, eu não esperava esse limite.

Meu objetivo é usar isso com a opção de amostragem estratificada, a fim de extrair uma amostra suficientemente grande de uma classe relativamente rara.


Não sei ao certo qual é o verdadeiro motivo, mas um exemplo de bootstrap geralmente tem o mesmo tamanho do seu exemplo original, portanto esse comportamento parece perfeitamente alinhado com o que eu esperaria de algo que pretenda obter exemplos de bootstrap.
joran

1
Bem, essa foi a minha escolha de palavras, não a documentação, mas seu argumento é bem aceito. Ainda assim, isso é inconveniente ao tentar reequilibrar a distribuição e não sei o motivo pelo qual essa é uma restrição útil a ser imposta.
cohoz

Respostas:


5

Isso não responde ao motivo , mas, para contornar isso, pode-se duplicar os dados da classe rara nos dados de treinamento e coletar uma amostra estratificada do resultado.

Duas desvantagens dessa abordagem, em comparação com uma superamostra "natural":

  • as estimativas fora da bolsa não são mais significativas
  • são necessários mais recursos para armazenar o objeto e coletar amostras aleatórias

mas permitirá construir a floresta com as proporções de classe desejadas.


4

Eu tenho exatamente a mesma pergunta e encontrei isso no changelog for randomForest :

Alterações no 4.1-0:

  • Em randomForest (), se o tamanho da amostra for fornecido, a amostragem será feita agora sem substituição, além de estratificada por classe. Portanto, o tamanho da amostra não pode ser maior que as frequências da classe.

A configuração de substituir = TRUE manualmente também não parece substituir isso.


2
Pode ser que o parâmetro de substituição esteja simplesmente sendo ignorado, mas posteriormente nesse log de alterações: Alterações em 4.5-12: * Adicionado o argumento 'strata' ao randomForest, que, em conjunto com 'sampsize', permite amostragem (com ou sem substituição) de acordo com uma variável estratos (que pode ser algo diferente da variável de classe). Atualmente, apenas funciona na classificação.
cohoz

Por exemplo, o mesmo erro é gerado viarf <- randomForest(Species ~ ., iris, sampsize=c(51, 1, 1), strata=iris$Species, replace=TRUE)
cohoz

Além disso, alguns casos de teste com a versão atual (4.6-7) indicam que as amostras são coletadas com substituição, portanto essa não é a explicação.
cohoz

1
Acabei superamostrando antes de executar o randomForest. Provavelmente há algo errado com essa metodologia, mas parece que funciona quando eu testo os resultados.
Hgcrpd

1
Não, essa é a solução alternativa que eu uso e faz exatamente o que se deseja. Especialmente para o caso de uso de uma classe relativamente rara, duplicar os dados dessa classe no conjunto de treinamento e antes de coletar uma amostra estratificada funciona bem e o "custo" em termos de memória / CPU adicional não é muito alto. Eu acho que vale a pena escrever-se uma uma "resposta", embora ele realmente não é um ...
cohoz
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.