La forêt aléatoire est trop adaptée

15

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):

Régression forestière nettoyée

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?

elyase
la source
Entraînez-vous cette fonction périodique avec l'axe x comme entrée et l'axe y comme étiquette pour x <= 245, puis testez-vous pour x> 245? Ou est-ce que j'interprète mal votre intrigue?
rrenaud
en quelque sorte, en fait l'axe des x est l'indice d'observation, au total il y a 300 observations, donc à partir de 245, c'est-à-dire des données de test non utilisées pour l'apprentissage du modèle, le vecteur d'entité d'entrée est composé d'entiers, a une forme (300,2) et ressemblent étroitement à une fonction linéaire de l'indice d'observation, donc je n'ai pas ajouté d'informations à ce sujet afin de ne pas trop compliquer la question.
elyase
1
Vous voudrez peut-être d'abord supprimer le cycle (partie saisonnière) de vos données (et la tendance).
R. Prost
Avez-vous étudié l'analyse des séries chronologiques? Ce n'est pas clair pour moi ce qui se trouve sur votre axe X, mais cela me semble périodique. Vérifiez ici et faites-moi savoir si cela aide: otexts.org/fpp/7/5
Bram Van Camp

Réponses:

21

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:RR

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
l'apprentissage automatique ne consiste-t-il pas à extraire des modèles généralisables des données? Une fois que l'on a un certain ensemble qui interpole bien les données, on peut choisir celles avec de meilleures propriétés d'extrapolation / généralisation en utilisant par exemple la validation croisée. Y a-t-il quelque chose qui ne va pas dans ma compréhension?
elyase
L'extrapolation est différente de la généralisation - imaginez que vous faites l'objet d'une expérience suivante: vous voyez un écran et vous avez un bouton rouge et vert. Tout d'abord, l'écran montre une vidéo de la pièce dans laquelle vous vous trouvez, où une autre personne a appuyé sur le bouton vert pour chat, lion et tigre affiché sur un écran, puis sur rouge pour le loup et le chien et a ainsi rassemblé 5 délicieux cookies.
1
Maintenant, l'écran montre un lynx roux; vous effectuez une interpolation appropriée et généralisable de l'historique, appuyez sur le bouton vert et obtenez un choc électrique au lieu d'un cookie. Pourquoi est-ce arrivé? Parce que la solution est un cycle (gggrrr) et les images d'animaux ne sont qu'une tromperie. Vous avez fait de même pour votre forêt - l'attirée dans une reproduction stupide de votre ensemble d'entraînement tout en cachant les vraies informations.
Bon exemple mais ne le voyez pas comme vous. Dans votre exemple, nous avons les données suivantes: une cible ( gou r) et 2 fonctionnalités ( index(temporelles) et animal). À 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.
elyase
1
Nan; même si vous demandez plus de données, l'expérimentateur peut toujours étendre la tromperie animale et obscurcir davantage le schéma pour le maintenir non évident. C'est-à-dire que l'extrapolation ne peut tout simplement pas être effectuée avec l'apprentissage car, par définition, cela nécessite des informations qui ne sont pas présentes dans la formation - de cette façon, vous devez soit appliquer des hypothèses ou collecter des données supplémentaires afin que le problème devienne une interpolation.
9

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,

Daniel Mahler
la source
AFAIK SVM a le même problème de forêt aléatoire. Ils ne prédisent pas bien en dehors de l'espace où ils ont été formés. Un réseau de neurones serait probablement une meilleure solution
Donbeo
Si les données se trouvent sur une courbe et que le noyau est du bon type pour s'adapter à cette courbe, alors un SVM pourra extrapoler le long de cette courbe. Si les données ont une tendance linéaire, un SVM linéaire s'adaptera à la ligne extrapolera le long de cette ligne. Un noyau plus complexe peut adapter et extrapoler des comportements plus complexes. Cela dépend du bon type de noyau. Cela ne fait pas des SVM l'outil idéal pour l'extrapolation et la prédiction TS, mais cela les rend meilleurs que les forêts aléatoires.
Daniel Mahler
3

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.

Vikram
la source
Oui, il semble être trop adapté (ce que la régression aléatoire des forêts ne fait normalement pas, d'où la question). Maintenant, j'ai observé que la modification des paramètres a peu d'effet avec les régresseurs RF. Désormais, la validation croisée nécessite un modèle sous-jacent suffisamment flexible pour être optimisé. Quel type de modèles / algorithmes ML recommandez-vous pour ce type de données.
elyase
3

Quelques suggestions:

  1. Ajustez vos paramètres en utilisant une approche de fenêtre glissante (votre modèle doit être optimisé pour prédire les valeurs suivantes dans la série chronologique, pas pour prédire les valeurs parmi celles fournies)
  2. Essayez d'autres modèles (des modèles encore plus simples, avec la bonne sélection de fonctionnalités et les stratégies d'ingénierie des fonctionnalités, pourraient s'avérer mieux adaptés à votre problème)
  3. Essayez d'apprendre les transformations optimales de la variable cible (accordez-la aussi, il y a une tendance linéaire / exponentielle négative, vous pourrez peut-être l'estimer)
  4. Analyse spectrale peut-être
  5. Les maxima / minima sont également espacés, semble-t-il. Apprenez où ils reçoivent vos fonctionnalités (pas d'opérateur, faites-le découvrir par un algorithme pour supprimer les biais) et ajoutez-les en tant que fonctionnalité. Concevez également une fonctionnalité nearest maximum. Je sais pas, ça pourrait marcher, ou peut-être pas, vous ne pouvez savoir que si vous le testez :)
Pyromane
la source
Mais, comme l'a dit Daniel dans sa réponse, la forêt aléatoire ne fonctionnera pas pour ce type de problèmes par conception car elle n'est pas en mesure de prédire les valeurs en dehors de la plage observée dans l'échantillon de train. Le réglage des paramètres, etc. ne mènerait nulle part.
Tim
1
Suggestion # 2 @Tim. Et Random Forests ne fonctionnera pas naïvement sur ces données, mais une extraction intelligente des fonctionnalités pourrait le faire fonctionner.
Firebug
1

X2X2

Vladislavs Dovgalecs
la source
0

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.

Wolfe
la source
0

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é.

Deepon GhoseRoy
la source