Ponderando dados mais recentes no modelo Random Forest

14

Estou treinando um modelo de classificação com a Random Forest para discriminar entre 6 categorias. Meus dados transacionais têm aproximadamente 60k + observações e 35 variáveis. Aqui está um exemplo de como ele se parece aproximadamente.

 _________________________________________________
|user_id|acquisition_date|x_var_1|x_var_2| y_vay  |
|-------|----------------|-------|-------|--------|
|111    | 2013-04-01     | 12    | US    | group1 |
|222    | 2013-04-12     | 6     | PNG   | group1 |
|333    | 2013-05-05     | 30    | DE    | group2 |
|444    | 2013-05-10     | 78    | US    | group3 |
|555    | 2013-06-15     | 15    | BR    | group1 |
|666    | 2013-06-15     | 237   | FR    | group6 |

Depois que o modelo for criado, eu gostaria de pontuar as observações da última semana. Como houve mudanças no sistema, as observações mais recentes se parecerão mais com o ambiente das observações atuais que eu gostaria de prever. Portanto, quero criar uma variável de peso para que a Floresta Aleatória dê mais importância às observações recentes.

Alguém sabe se o pacote randomForest em R é capaz de lidar com pesos por observação?

Além disso, você pode sugerir qual é um bom método para criar a variável de peso? Por exemplo, como meus dados são de 2013, eu estava pensando em usar o número do mês a partir da data como peso. Alguém vê algum problema com esse método?

Muito obrigado antecipadamente!

Nikolay Nenov
fonte
Você pode postar uma pergunta no estouro de pilha. Eles ajudarão você mais com problemas de implementação. O foco deste site é mais teórico.
Alex Williams
Provavelmente não sou suficientemente claro na minha redação, mas minhas perguntas não estão relacionadas ao problema de implementação. Por exemplo, na parte em que estou perguntando sobre a criação da variável de peso, não quero perguntar qual comando no R pode me ajudar a fazer isso. Eu estava simplesmente me perguntando se, com isso, estaria violando alguma das suposições da floresta aleatória.
Nikolay Nenov
1
A resposta é não, acredito. Você pode atribuir pesos a diferentes grupos, como expliquei na minha resposta abaixo. Entendo que não é disso que você está interessado, mas é uma ideia semelhante. Você pode tentar usar observações duplicadas, como eu sugiro.
Alex Williams

Respostas:

5

O rangerpacote em R ( pdf ), que é relativamente novo, fará isso. A implementação do ranger de florestas aleatórias tem um case.weightsargumento que pega um vetor com pesos individuais de caso / observação.

GrantRWHumphries
fonte
Arrumado! Costuras como a solução que eu estava procurando. Você tem um link para os detalhes de como a probabilidade é calculada case.weights?
Nikolay Nenov
1
Não tenho 100% de certeza de como eles calculam as probabilidades - mas acho que, se você quiser começar, dê uma olhada neste artigo: Malley, JD, Kruppa, J., Dasgupta, A., Malley, KG e Ziegler A. (2012). Máquinas de probabilidade: estimativa consistente de probabilidade usando máquinas de aprendizagem não paramétricas. Methods Inf Med 51: 74-81. Dx.doi.org/10.3414/ME00-01-0052
GrantRWHumphries
7

Você pode reamostrar os dados para representar demais os pontos de dados mais recentes. De qualquer forma, Rf envolve um passo do tipo "sampel-com-substituição" e "ensacamento mais ou menos equilibrado" para classes desequilibradas usa amostragem para representar demais a classe minoritária e produz resultados tão bons ou melhores quanto a floresta aleatória ponderada em minha experiência.

Você pode reamostrar no nível da construção de sua matriz de treinamento ( referência ), em vez de durante o ensacamento, para manter a implementação fácil, embora eu sugira fazer várias repetições nesse caso.

Internamente, algumas implementações de floresta aleatória, incluindo o scikit-learn, na verdade usam pesos de amostra para acompanhar quantas vezes cada amostra está em bolsa e deve ser equivalente a sobreamostragem no nível de ensacamento e próximo à sobreamostragem no nível de treinamento na validação cruzada.

Ryan Bressler
fonte
4

Você deve procurar o parâmetro "classwt". Não parece ser o que você está interessado diretamente, mas pode lhe dar uma idéia do que você deseja fazer.

Veja aqui: Pergunta nº 1 do Stack Exchange

E aqui: Pergunta nº 2 do Stack Exchange

Artigo sobre florestas aleatórias ponderadas: PDF

A idéia básica é ponderar as classes de forma que os grupos / classificações raramente observados tenham maior probabilidade de serem selecionados em suas amostras de inicialização. Isso é útil para dados desequilibrados (quando as probabilidades anteriores de diferentes classes são amplamente diferentes).

Parece-me que você deseja fazer algo semelhante, mas para eventos recentes (não para determinados grupos / classificações). Uma maneira simples de fazer isso seria criar observações duplicadas (ou seja, colocar linhas repetidas e idênticas) para observações mais recentes. No entanto, isso pode ser potencialmente ineficiente. Não conheço uma maneira de ponderar diretamente cada observação em R, mas poderia não ter consciência disso.

Você pode tentar procurar implementações alternativas, por exemplo, em C - na pior das hipóteses, elas podem ser personalizadas com um pouco de codificação.

Alex Williams
fonte
1
Muito obrigado pelos links, Alex. O artigo fornece bons exemplos de casos em que você deseja ponderar seus classificadores. Receio que isso não esteja funcionando para mim, pois não se pode usar o parâmetro "classwt" para outra coisa senão ponderar os classificadores - ou seja, você precisa de um peso por classe, caso contrário, o randomForest retornaria um erro.
Nikolay Nenov
1
Sim, acho que você não pode usar o "classwt" diretamente. Você quer algum parâmetro como "pesos de observação", mas acho que não existe.
Alex Williams