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):
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?
regression
random-forest
scikit-learn
elyase
fonte
fonte
Respostas:
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: R → R
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
g
our
) e 2 recursos (index
(temporal) eanimal
). 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.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,
fonte
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.
fonte
Algumas sugestões:
nearest maximum
. Não sei, pode funcionar, ou talvez não, você só pode saber se testá-lo :)fonte
fonte
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.
fonte
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.
fonte