J'essaie d'utiliser la régression aléatoire des forêts dans scikits-learn. Le problème est que j'obtiens une erreur de test très élevée:
train MSE, 4.64, test MSE: 252.25.
Voici à quoi ressemblent mes données: (bleu: données réelles, vert: prévu):
J'utilise 90% pour la formation et 10% pour le test. Voici le code que j'utilise après avoir essayé plusieurs combinaisons de paramètres:
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)
Quelles sont les stratégies possibles pour améliorer mon ajustement? Puis-je faire autre chose pour extraire le modèle sous-jacent? Il me semble incroyable qu'après tant de répétitions du même modèle, le modèle se comporte si mal avec de nouvelles données. Ai-je un quelconque espoir d'essayer d'adapter ces données?
Réponses:
Je pense que vous utilisez un mauvais outil; si votre X entier est équivalent à l'index, vous avez essentiellement une fonction échantillonnée et essayez de l'extrapoler. L'apprentissage automatique consiste à interpoler l'histoire, il n'est donc pas surprenant qu'il obtienne un échec spectaculaire dans ce cas.f:R→R
Ce dont vous avez besoin est une analyse de séries chronologiques (c'est-à-dire extraire la tendance, analyser le spectre et autorégresser ou HMMing le reste) ou physique (c'est-à-dire penser s'il existe un ODE qui peut produire une telle sortie et essayer d'adapter ses paramètres via des quantités conservées).
la source
g
our
) et 2 fonctionnalités (index
(temporelles) etanimal
). À partir de ces données, je pourrais adapter plusieurs modèles qui peuvent donner plus ou moins de poids aux fonctionnalités 1 ou 2 (ou égales aux deux). La validation croisée (en supposant suffisamment de données) devrait aboutir à un modèle avec la caractéristique 2 (animal) ayant moins d'importance. Je peux voir que mon modèle sur-adapte les données, mais je pense toujours que je devrais pouvoir extraire un modèle qui suit ce modèle (car le comportement n'a pas changé) avec un espace modèle suffisamment grand.Le plus gros problème est que les arbres de régression (et les algorithmes basés sur eux comme les forêts aléatoires) prédisent des fonctions constantes par morceaux, donnant une valeur constante pour les entrées tombant sous chaque feuille. Cela signifie que lorsqu'ils extrapolent en dehors de leur domaine de formation, ils prédisent simplement la même valeur que pour le point le plus proche auquel ils avaient des données de formation. @mbq a raison de dire qu'il existe des outils spécialisés pour l'apprentissage des séries chronologiques qui seraient probablement meilleurs que les techniques générales d'apprentissage automatique. Cependant, les forêts aléatoires sont particulièrement mauvaises pour cet exemple, et là d'autres techniques ML générales fonctionneraient probablement beaucoup mieux que ce que vous voyez. Les SVM avec des noyaux non linéaires sont une option qui vient à l'esprit. Puisque votre fonction a une structure périodique, cela suggère également de travailler dans le domaine fréquentiel,
la source
Il s'agit d'un exemple de manuel pour le sur-ajustement des données, le modèle fonctionne très bien sur les données entraînées mais s'effondre sur toutes les nouvelles données de test. Voici l'une des stratégies pour y remédier: effectuer une validation croisée décuplée des données d'entraînement pour optimiser les paramètres.
Étape 1. Créez une fonction de minimisation MSE à l'aide de l'optimisation NM. Un exemple peut être vu ici: http://glowingpython.blogspot.de/2011/05/curve-fitting-using-fmin.html
Étape 2. Au sein de cette fonction de minimisation, l'objectif est de réduire le MSE. Pour ce faire, créez une division des données dix fois où un nouveau modèle est appris sur 9 fois et testé sur le 10ème. Ce processus est répété dix fois, pour obtenir le MSE sur chaque pli. Le MSE agrégé est renvoyé comme résultat de l'objectif.
Étape 3. Le fmin en python fera les itérations pour vous. Vérifiez quels hyper paramètres sont nécessaires pour être affinés (n_estimators, max_features etc.) et passez-les au fmin.
Le résultat sera les meilleurs hyper-paramètres qui réduiront la possibilité de sur-ajustement.
la source
Quelques suggestions:
nearest maximum
. Je sais pas, ça pourrait marcher, ou peut-être pas, vous ne pouvez savoir que si vous le testez :)la source
la source
Après avoir lu le post ci-dessus, je veux donner une autre réponse différente.
Pour les modèles basés sur des arbres, tels que la forêt aléatoire, ils ne peuvent pas extrapoler la valeur au-delà de l'ensemble d'apprentissage. Donc, je ne pense pas que ce soit un problème trop approprié, mais une mauvaise stratégie de modélisation.
Alors, que pouvons-nous faire pour la prédiction de séries chronologiques avec un modèle d'arbre?
Le moyen possible est de le combiner avec une régression linéaire: d'abord, détruisez la série chronologique (ou modélisez la tendance avec une régression linéaire), puis modélisez le résiduel avec des arbres (les résidus sont bornés, afin que les modèles d'arbres puissent les gérer).
Par ailleurs, il existe un modèle d'arbre combiné à une régression linéaire pouvant extrapoler, appelé cubiste, il fait une régression linéaire sur la feuille.
la source
Si vous voulez simplement prédire dans les limites du graphique, alors simplement randomiser les observations avant de diviser l'ensemble de données devrait résoudre le problème. Il devient alors un problème d'interpolation à partir du problème d'extrapolation comme indiqué.
la source