A floresta aleatória está se ajustando demais

15

Estou tentando usar a regressão aleatória de floresta no scikits-learn. O problema é que estou recebendo um erro de teste muito alto:

train MSE, 4.64, test MSE: 252.25.

É assim que meus dados ficam: (azul: dados reais, verde: previsto):

Regressão florestal limpa

Estou usando 90% para treinamento e 10% para teste. Este é o código que estou usando após tentar várias combinações de parâmetros:

rf = rf = RandomForestRegressor(n_estimators=10, max_features=2, max_depth=1000, min_samples_leaf=1, min_samples_split=2, n_jobs=-1) 
test_mse = mean_squared_error(y_test, rf.predict(X_test))
train_mse = mean_squared_error(y_train, rf.predict(X_train))

print("train MSE, %.4f, test MSE: %.4f" % (train_mse, test_mse))
plot(rf.predict(X))
plot(y)

Quais são as estratégias possíveis para melhorar meu encaixe? Há algo mais que eu possa fazer para extrair o modelo subjacente? Parece-me incrível que, depois de tantas repetições do mesmo padrão, o modelo se comporte tão mal com novos dados. Tenho alguma esperança de tentar ajustar esses dados?

elyase
fonte
Você está treinando essa função periódica com o eixo x como entrada e o eixo y como o rótulo de x <= 245 e testando x> 245? Ou estou interpretando mal o seu enredo?
Rrenaud 12/12/12
tipo, na verdade o eixo x é o índice de observação; no total, existem 300 observações; portanto, a partir de 245, ou seja, dados de teste não utilizados para o treinamento do modelo, o vetor de recurso de entrada consiste em números inteiros e tem forma (300,2) e se assemelham a uma função linear do índice de observação, por isso não adicionei informações sobre ele para não complicar demais a pergunta.
elyase
11
Você pode remover o ciclo (parte sazonal) dos seus dados primeiro (e a tendência).
Prost R.,
Você analisou a análise de séries temporais? Não está claro para mim o que está no seu eixo x, mas me parece periódico. Confira aqui e deixe-me saber se isso ajuda: otexts.org/fpp/7/5
Bram Van Camp

Respostas:

21

Eu acho que você está usando uma ferramenta errada; se todo o seu X é equivalente ao índice, você está basicamente tendo alguma função amostrada e tentando extrapolá-la. O aprendizado de máquina tem tudo a ver com interpolar a história, portanto, não é de surpreender que ele tenha uma falha espetacular nesse caso.f:RR

O que você precisa é de uma análise de séries temporais (por exemplo, extração de tendências, análise de espectro e auto-regressão ou HMM do restante) ou física (por exemplo, pensando se existe uma ODE que possa produzir essa saída e tentando ajustar seus parâmetros através de quantidades conservadas).


fonte
não é aprendizado de máquina sobre como extrair modelos generalizáveis ​​dos dados? Uma vez que um determinado conjunto interpole bem os dados, podemos escolher aqueles com melhores propriedades de extrapolação / generalização usando, por exemplo, validação cruzada. Existe algo errado no meu entendimento?
Elyase
Extrapolação é diferente de generalização - imagine que você é o sujeito de um experimento a seguir: você vê uma tela e possui um botão vermelho e verde. Primeiro, a tela mostra um vídeo da sala onde você está, onde outra pessoa pressionou o botão verde para gato, leão e tigre mostrado em uma tela e depois vermelho para lobo e cachorro e, dessa forma, reuniu 5 deliciosos biscoitos.
11
Agora, a tela mostra um lince; você executa uma interpolação adequada e generalizável da história, pressiona o botão verde e recebe um choque elétrico em vez de um biscoito. Por que isso aconteceu? Porque a solução é um ciclo (gggrrr) e as imagens dos animais são apenas uma decepção. Você fez o mesmo com sua floresta - atraiu-a para uma reprodução idiota do seu conjunto de treinamento enquanto oculta as informações reais.
Bom exemplo, mas não o veja da maneira que você vê. No seu exemplo, temos os seguintes dados: um destino ( gou r) e 2 recursos ( index(temporal) e animal). A partir desses dados, eu poderia ajustar vários modelos que podem dar mais ou menos peso ao recurso 1 ou 2 (ou igual a ambos). A validação cruzada (assumindo dados suficientes) deve chegar a um modelo com o recurso 2 (animal) com menos importância. Percebo que meu modelo está ajustando demais os dados, mas ainda acho que devo conseguir extrair um modelo que siga esse padrão (porque o comportamento não mudou) com um espaço de modelo grande o suficiente.
Elyase
11
Não; mesmo que você solicite mais dados, o experimentalista ainda pode estender o engano do animal e ofuscar ainda mais o padrão para mantê-lo não óbvio. Ou seja, a extrapolação simplesmente não pode ser feita com o aprendizado porque, por definição, requer informações que não estão presentes no treinamento - dessa forma, você deve aplicar algumas suposições ou coletar dados adicionais para que o problema se torne interpolação.
9

O maior problema é que as árvores de regressão (e algoritmos baseados nelas, como florestas aleatórias) preveem funções constantes por partes, fornecendo um valor constante para entradas que caem sob cada folha. Isso significa que, ao extrapolar para fora do domínio de treinamento, eles apenas prevêem o mesmo valor que seriam para o ponto mais próximo em que tinham dados de treinamento. O @mbq está correto, pois existem ferramentas especializadas para o aprendizado de séries temporais que provavelmente seriam melhores que as técnicas gerais de aprendizado de máquina. No entanto, florestas aleatórias são particularmente ruins para este exemplo, e outras técnicas gerais de ML provavelmente teriam um desempenho muito melhor do que o que você está vendo. SVMs com kernels não lineares são uma opção que vem à mente. Como sua função possui estrutura periódica, isso também sugere trabalhar no domínio da frequência,

Daniel Mahler
fonte
O AFAIK SVM tem o mesmo problema de floresta aleatória. Eles não prevêem bem fora do espaço onde foram treinados. Provavelmente rede neural seria uma melhor solução
Donbeo
Se os dados estiverem em uma curva e o kernel for do tipo certo para caber nessa curva, um SVM poderá extrapolar ao longo dessa curva. Se os dados tiverem uma tendência linear, um SVM linear se ajustará à linha extrapolará ao longo dessa linha. Kernel mais complexo pode ajustar e extrapolar comportamentos mais complexos. Depende de ter o tipo certo de kernel. Isso não torna os SVMs a ferramenta certa para extrapolação e previsão de TS, mas os torna melhores do que florestas aleatórias.
Daniel Mahler
3

Este é um exemplo de livro didático para ajuste excessivo de dados, o modelo se sai muito bem em dados treinados, mas é recolhido em qualquer novo dado de teste. Esta é uma das estratégias para resolver isso: Faça uma validação cruzada de dez vezes dos dados de treinamento para otimizar os parâmetros.

Etapa 1. Crie uma função de minimização do MSE usando a otimização do NM. Um exemplo pode ser visto aqui: http://glowingpython.blogspot.de/2011/05/curve-fitting-using-fmin.html

Etapa 2. Dentro desta função de minimização, o objetivo é reduzir o MSE. Para fazer isso, crie uma divisão de dez vezes os dados em que um novo modelo é aprendido em 9 dobras e testado na 10ª dobra. Este processo é repetido dez vezes, para obter o MSE em cada dobra. O MSE agregado é retornado como o resultado do objetivo.

Etapa 3. O fmin no python fará as iterações para você. Verifique quais parâmetros de hiper são necessários para o ajuste fino (n_estimators, max_features etc.) e passe-os para o fmin.

O resultado serão os melhores hiperparâmetros que reduzirão a possibilidade de excesso de ajuste.

Vikram
fonte
Sim, parece estar sobreajustando (o que a Regressão Aleatória na Floresta normalmente não faz, daí a pergunta). Agora, observei que alterar os parâmetros tem pouco efeito com os regressores de RF. Agora, a validação cruzada requer um modelo subjacente flexível o suficiente para ser otimizado. Que tipo de modelos / algoritmo de ML você recomenda para esse tipo de dados.
Elyase #
3

Algumas sugestões:

  1. Ajuste seus parâmetros usando um abordagem de janela rolante (seu modelo deve ser otimizado para prever os próximos valores da série temporal, para não prever valores entre os fornecidos)
  2. Experimente outros modelos (mesmo os mais simples, com a seleção correta de recursos e estratégias de engenharia de recursos, podem ser mais adequados ao seu problema)
  3. Tente aprender as transformações ideais da variável de destino (ajuste isso também, há uma tendência linear / exponencial negativa, você pode estimar)
  4. Análise espectral talvez
  5. Parece que os máximos / mínimos são igualmente espaçados. Saiba onde eles recebem seus recursos (sem entrada do operador, faça um algoritmo descobri-lo para remover o viés) e adicione-o como um recurso. Projete também um recurso nearest maximum. Não sei, pode funcionar, ou talvez não, você só pode saber se testá-lo :)
Firebug
fonte
Mas, como disse Daniel em sua resposta, a floresta aleatória não funcionará para esse tipo de problema por design, uma vez que não é capaz de prever valores fora do intervalo observado na amostra de trem. Parâmetros de ajuste etc. não levariam a lugar algum.
Tim
11
Sugestão # 2 @Tim. E o Random Forests não funcionará ingenuamente nesses dados, mas a extração inteligente de recursos pode fazê-lo funcionar.
Firebug
1

x2x2

Vladislavs Dovgalecs
fonte
0

Depois de ler o post acima, quero dar outra resposta diferente.

Para modelos baseados em árvore, como floresta aleatória, eles não podem extrapolar o valor além do conjunto de treinamento. Portanto, não acho que seja um problema excessivo, mas uma estratégia de modelagem errada.

Então, o que podemos fazer para a previsão de séries temporais com o modelo de árvore?

A maneira possível é combiná-lo com a regressão linear: primeiro, diminua a série temporal (ou tendência de modelagem com regressão linear) e depois modele o residual com árvores (os resíduos são limitados, para que os modelos em árvore possam lidar com isso).

Além disso, existe um modelo de árvore combinado com a regressão linear que pode extrapolar, chamado cubista, que faz regressão linear na folha.

wolfe
fonte
0

Se você simplesmente deseja prever dentro dos limites do gráfico, simplesmente aleatoriamente as observações antes de dividir o conjunto de dados deve resolver o problema. Torna-se então um problema de interpolação da extrapolação, como mostrado.

Deepon GhoseRoy
fonte