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!
fonte
Respostas:
O
ranger
pacote em R ( pdf ), que é relativamente novo, fará isso. A implementação do ranger de florestas aleatórias tem umcase.weights
argumento que pega um vetor com pesos individuais de caso / observação.fonte
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.
fonte
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.
fonte