Vou explicar meu problema com um exemplo. Suponha que você queira prever a renda de um indivíduo, com alguns atributos: {Idade, Sexo, País, Região, Cidade}. Você tem um conjunto de dados de treinamento como esse
train <- data.frame(CountryID=c(1,1,1,1, 2,2,2,2, 3,3,3,3),
RegionID=c(1,1,1,2, 3,3,4,4, 5,5,5,5),
CityID=c(1,1,2,3, 4,5,6,6, 7,7,7,8),
Age=c(23,48,62,63, 25,41,45,19, 37,41,31,50),
Gender=factor(c("M","F","M","F", "M","F","M","F", "F","F","F","M")),
Income=c(31,42,71,65, 50,51,101,38, 47,50,55,23))
train
CountryID RegionID CityID Age Gender Income
1 1 1 1 23 M 31
2 1 1 1 48 F 42
3 1 1 2 62 M 71
4 1 2 3 63 F 65
5 2 3 4 25 M 50
6 2 3 5 41 F 51
7 2 4 6 45 M 101
8 2 4 6 19 F 38
9 3 5 7 37 F 47
10 3 5 7 41 F 50
11 3 5 7 31 F 55
12 3 5 8 50 M 23
Agora, suponha que eu queira prever a renda de uma nova pessoa que mora na Cidade 7. Meu conjunto de treinamento tem três amostras impressionantes com pessoas na Cidade 7 (suponha que isso seja muito), então provavelmente posso usar a renda média na Cidade 7 para prever a renda desse novo indivíduo.
Agora, suponha que eu queira prever a renda de uma nova pessoa que mora na Cidade 2. Meu conjunto de treinamento possui apenas 1 amostra com a Cidade 2; portanto, a renda média na Cidade 2 provavelmente não é um preditor confiável. Mas provavelmente posso usar a renda média na Região 1.
Extrapolando um pouco essa ideia, posso transformar meu conjunto de dados de treinamento como
Age Gender CountrySamples CountryIncome RegionSamples RegionIncome CitySamples CityIncome
1: 23 M 4 52.25 3 48.00 2 36.5000
2: 48 F 4 52.25 3 48.00 2 36.5000
3: 62 M 4 52.25 3 48.00 1 71.0000
4: 63 F 4 52.25 1 65.00 1 65.0000
5: 25 M 4 60.00 2 50.50 1 50.0000
6: 41 F 4 60.00 2 50.50 1 51.0000
7: 45 M 4 60.00 2 69.50 2 69.5000
8: 19 F 4 60.00 2 69.50 2 69.5000
9: 37 F 4 43.75 4 43.75 3 50.6667
10: 41 F 4 43.75 4 43.75 3 50.6667
11: 31 F 4 43.75 4 43.75 3 50.6667
12: 50 M 4 43.75 4 43.75 1 23.0000
Portanto, o objetivo é combinar de alguma forma o CityIncome, o RegionIncome e o CountryIncome, usando o número de amostras de treinamento de cada um para dar peso / credibilidade a cada valor. (Idealmente, ainda incluindo informações de idade e sexo.)
Quais são as dicas para resolver esse tipo de problema? Prefiro usar modelos baseados em árvores, como floresta aleatória ou aumento de gradiente, mas estou tendo problemas para obter um bom desempenho.
ATUALIZAR
Para qualquer pessoa disposta a dar uma facada nesse problema, geramos dados de amostra para testar sua solução proposta aqui .
fonte
Respostas:
Estou pensando nesse problema há algum tempo, com inspirações das seguintes perguntas neste site.
Como posso incluir efeitos aleatórios em um randomForest?
Floresta aleatória em dados agrupados
Florestas aleatórias / adaboost na configuração de regressão de painel
Floresta aleatória para dados do painel binário
Modelando Dados em Cluster Usando Árvores de Regressão Aprimoradas
Deixe-me apresentar primeiro os modelos de efeitos mistos para dados hierárquicos / aninhados e começar com um modelo simples de dois níveis (amostras aninhadas nas cidades). Para a ésima amostra da i- ésima cidade, escrevemos o resultado y i j em função das covariáveis (uma lista de variáveis incluindo sexo e idade), que é a interceptação aleatória de cada cidade, . Se assumirmos que e seguem distribuições normais com média 0 e variâncias ej Eu yeu j y i j = f ( x i j ) + u i + ϵ i j ,xeu j
Para o método baseado em floresta aleatória, você pode tentar
MixRF()
em nosso pacote RMixRF
no CRAN.fonte
Dado que você tem apenas duas variáveis e aninhamento direto, eu repetiria os comentários de outros que mencionam um modelo hierárquico de Bayes. Você mencionou uma preferência por métodos baseados em árvore, mas há uma razão específica para isso? Com um número mínimo de preditores, acho que a linearidade geralmente é uma suposição válida que funciona bem, e qualquer erro de especificação do modelo pode ser facilmente verificado através de gráficos residuais.
Se você tivesse um grande número de preditores, o exemplo de RF baseado na abordagem EM mencionada por @Randel certamente seria uma opção. Uma outra opção que ainda não vi é usar o reforço baseado em modelo (disponível no pacote mboost no R ). Essencialmente, essa abordagem permite estimar a forma funcional de seus efeitos fixos usando vários aprendizes básicos (lineares e não lineares), e as estimativas de efeitos aleatórios são aproximadas usando uma penalidade baseada em crista para todos os níveis desse fator em particular. Este artigo é um ótimo tutorial (os alunos da base de efeitos aleatórios são discutidos na página 11).
Analisei seus dados de amostra, mas parece que ele possui apenas as variáveis de efeitos aleatórios de Cidade, Região e País. Nesse caso, seria útil calcular as estimativas empíricas de Bayes para esses fatores, independentemente de quaisquer preditores. Isso pode realmente ser um bom exercício para começar em geral, como talvez os níveis mais altos (país, por exemplo), tenham uma variação mínima explicada no resultado e, portanto, provavelmente não valeria a pena adicioná-los ao seu modelo.
fonte
mboost
pacote.mboost
Parece interessante - vou dar uma olhada. ObrigadoIsso é mais um comentário ou sugestão do que uma resposta, mas acho que você faz uma pergunta importante aqui. Como alguém que trabalha exclusivamente com dados multiníveis, posso dizer que descobri muito pouco sobre aprendizado de máquina com dados multiníveis. No entanto, Dan Martin, recém-doutorado em psicologia quantitativa na Universidade da Virgínia, fez sua dissertação sobre o uso de árvores de regressão com dados em vários níveis. Abaixo está um link para um pacote R que ele escreveu para alguns desses propósitos:
https://github.com/dpmartin42/mleda/blob/master/README.md
Além disso, você pode encontrar sua dissertação aqui:
http://dpmartin42.github.io/about.html
fonte
A função
RFcluster()
do pacote gamclass para R "adapta florestas aleatórias para funcionar (ainda que desajeitadamente e ineficientemente) com dados de resultados categóricos agrupados". O exemplo a seguir é da página de ajuda paraRFcluster
:Isso retorna uma precisão OOB (onde os "sacos" são sacos de alto-falantes, não sacos de amostras de alto-falantes individuais), que minha máquina fornece como 0,57.
fonte
Você pode dar uma olhada no metboost : Miller PJ et al. metboost: análise de regressão exploratória com dados hierarquicamente agrupados.arXiv: 1702.03994
Citação do resumo: Propomos uma extensão para as árvores de decisão de decisão aprimoradas denominadas metboost para dados agrupados hierarquicamente. Ele funciona restringindo a estrutura de cada árvore a ser a mesma entre os grupos, mas permitindo que o nó terminal signifique diferir. Isso permite que preditores e pontos de divisão levem a diferentes previsões dentro de cada grupo e aproximam efeitos específicos de grupos não lineares. É importante ressaltar que o metboost permanece computacionalmente viável para milhares de observações e centenas de preditores que podem conter valores ausentes.
É implementado no pacote R mvtboost
fonte