[PYTHON] Ce que vous ne devriez pas faire dans le processus d'analyse des données de séries chronologiques (y compris la réflexion)

** (Addition 1) Il a été souligné que l'utilisation des termes ("dans l'échantillon", "hors de l'échantillon") est inappropriée. [Seconde moitié de cet article](http://qiita.com/TomokIshii/items/ac7bde63f2c0e0de47b3#%E8%BF%BD%E8%A8%98%E7%94%A8%E8%AA%9E-in-sample -sortie de l'échantillon-% E3% 81% AE% E5% AE% 9A% E7% BE% A9% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6) J'ai ajouté ce point. ** ** ** (Addition 2) [Deuxième moitié](http://qiita.com/TomokIshii/items/ac7bde63f2c0e0de47b3#%E8%BF%BD%E8%A8%982%E7%94%A8%E8%AA%9E -en-échantillon-% E3% 81% AE% E5% AE% 9A% E7% BE% A9% E3% 81% AB% E3% 81% A4% E3% 81% 84% E3% 81% A6) J'ai fait. ** **

Après avoir publié Qiita, même si vous remarquez une erreur dans le contenu, vous avez tendance à perdre du temps et à le laisser tel quel. Ce n'est pas grave si c'est une très petite erreur, mais si c'est une erreur théorique ou un malentendu, il faut que la mauvaise transmission continue, et nous devons y réfléchir. (Il est rapide de supprimer un article, mais s'il a un "j'aime", il est impoli de le supprimer ...)

Par ailleurs, dans la précédente Comparaison des modèles de régression - ARMA vs Random Forest Regression - Qiita, le décalage (délai) est utilisé comme quantité de caractéristiques à partir des données de la série chronologique. Présente comment le faire.

Cette fois, ce sont des données de séries chronologiques univariées, mais je les ai essayées comme modèle pour estimer la valeur actuelle en utilisant des données passées. En particulier, Volume_current ~ Volume_Lag1 + Volume_Lag2 + Volume_Lag3 Voici le modèle. Je voulais que les données d'entraînement et les données de test soient identiques à celles de la dernière fois (70, 30), mais comme NaN apparaît dans le processus de calcul de la valeur de décalage, dropna () la première partie et définissez la longueur des données sur (67, 30). fait.

Tout d'abord, prétraitez les données.

df_nile['lag1'] = df_nile['volume'].shift(1) 
df_nile['lag2'] = df_nile['volume'].shift(2)
df_nile['lag3'] = df_nile['volume'].shift(3)

df_nile = df_nile.dropna()

X_train = df_nile[['lag1', 'lag2', 'lag3']][:67].values
X_test = df_nile[['lag1', 'lag2', 'lag3']][67:].values

y_train = df_nile['volume'][:67].values
y_test = df_nile['volume'][67:].values

Utilisez le régresseur de forêt aléatoire de Scikit-learn.

from sklearn.ensemble import RandomForestRegressor
r_forest = RandomForestRegressor(
            n_estimators=100,
            criterion='mse',
            random_state=1,
            n_jobs=-1
)
r_forest.fit(X_train, y_train)
y_train_pred = r_forest.predict(X_train)
y_test_pred = r_forest.predict(X_test)

Selon la procédure typique d'apprentissage automatique, les données sont divisées en données d'entraînement / données de test, le modèle est ajusté à l'aide des données d'apprentissage, puis les réponses sont mises en correspondance avec la valeur de prédiction du modèle et le libellé des données de test. Qu'est-ce qui ne va pas? Le flux du code ci-dessus est expliqué à l'aide d'une figure.

** Fig.1 Comment prédire et vérifier des données de séries chronologiques incorrectes **

TSA_procedure1.png

Générez 3 données de décalage à partir des données de la série chronologique d'origine avec pandas.DaraFrame.shift. Après cela, il est divisé en données d'apprentissage (dans l'échantillon) et en données de test (hors échantillon) à un moment prédéterminé. À première vue, cela semble bon, mais dans cette procédure, la section des données de test (partie rose) de la série de données d'origine sera incorporée dans la série de données de décalage. Dans la vérification de modèle, un tel traitement peut être effectué, mais en réalité, les données (hors échantillon) après un temps prédéterminé n'existent pas pour les informations futures, de sorte que ce traitement ne peut pas être effectué.

La bonne façon de procéder consiste à remplir les valeurs de décalage requises pour la prédiction des données une par une et à avancer.

** Fig.2 Comment prédire et vérifier les données de séries chronologiques correctes **

TSA-procedure2.png

Dans la figure ci-dessus, les informations roses doivent être exclues comme réponse lors de la validation. Au moment (xn-3), toutes les données d'entraînement peuvent être alignées sur les données bleues de l'échantillon. À la prochaine fois (xn-2), les données Lag-3 seront perdues, donc la valeur ici sera calculée à l'aide du modèle de prédiction. À la prochaine fois (xn-1), on pense que le processus de calcul consistera à remplir les parties manquantes de Lag-2 et Lag-3. C'est le code ci-dessous.

def step_forward(rf_fitted, X, in_out_sep=67, pred_len=33):
    # predict step by step
    nlags = 3
    idx = in_out_sep - nlags - 1

    lags123 = np.asarray([X[idx, 0],
                          X[idx, 1],
                          X[idx, 2]])

    x_pred_hist = []
    for i in range(nlags + pred_len):
        x_pred = rf_fitted.predict([lags123])
        if i > nlags:
            x_pred_hist.append(x_pred)
        lags123[0] = lags123[1]
        lags123[1] = lags123[2]
        lags123[2] = x_pred

    x_pred_np = np.asarray(x_pred_hist).squeeze()

    return x_pred_np

Dans le code ci-dessus, rf_fitted est un modèle de forêt aléatoire pour lequel l'ajustement (apprentissage) de la régression a été effectué. En utilisant cela, la valeur future, qui correspond au hors-échantillon, est calculée pas à pas.

Vérifiez maintenant en quoi les valeurs prédites diffèrent de manière incorrecte / correcte.

** Fig.3 Mauvaise prédiction ** tsa_nile1.png

En se concentrant sur la ligne hors échantillon dessinée en cyan, la composante haute fréquence de la section prédite de la valeur d'entrée (ligne pointillée) qui ne doit pas être mentionnée dans la figure ci-dessus est reflétée dans la valeur prédite (ligne cyan continue). On dirait qu'il y en a. Cependant, le degré de chevauchement dans cette section semble être élevé.

** Fig.4 Prédiction par la bonne voie ** tsa_nile2.png

Sur cette figure, la composante haute fréquence de la valeur prédite de la section prédite semble être assez petite, et dans la seconde moitié de la section, elle semble être légèrement différente de la valeur réelle (ligne pointillée). Cependant, sur cette figure, une tendance importante à la «diminution graduelle» de la section dans l'échantillon peut être observée dans la valeur prédite hors échantillon. (De mon point de vue personnel ...)

Veuillez noter qu'il existe de tels pièges dans l'analyse des données de séries chronologiques. (Cela peut être la base des bases pour les personnes qui manipulent habituellement des données de séries chronologiques.) Vous devez trouver les données de séries chronologiques sur le site de compétition d'apprentissage automatique "Kaggle" etc. et étudier une petite partie pratique. Je sens ça.

J'espère également que les personnes qui aiment ou "stockent" mes articles postés tiendront également compte de la fiabilité des articles. (C'est un "avis" que cela peut être faux. Je serais encore plus heureux si vous pouviez commenter l'erreur.)

Références, site web

(Ajout 1) Définition des termes "dans l'échantillon" et "hors échantillon"

Pour cet article, "in-sample" est utilisé comme synonyme de "training data", mais je ne pense pas que cela signifie cela. Dans le cas de la régression uniquement, j'ai reçu un tweet disant "la valeur de la variable explicative est la même que les données d'apprentissage". Comme vous l'avez souligné, la compréhension de "in-sample" était ambiguë, alors lisez "in-sample" -> "training data" et "out-of-sample" -> "test data" dans cet article. J'espère que vous pourrez le changer. Je n'ai pas entièrement compris le concept des termes ci-dessus à ce stade, je mettrai donc à jour l'article à une date ultérieure.

(Ajout 2) À propos de la définition du terme "dans l'échantillon"

J'ai vérifié le "in-sample" dans l'article, veuillez donc vous y référer ci-dessous.

Au moment de la rédaction de l'article ci-dessus, les termes "dans l'échantillon" / "hors échantillon" étaient divisés à un certain point de l'axe des temps, les données jusqu'à ce point étaient "dans l'échantillon" et les données après ce point étaient Je pensais que c'était "hors échantillon". Bien que cet usage soit inexact, il semble que le terme soit souvent utilisé de cette manière.

Par exemple, StackExchange, questions à validation croisée, Quelle est la différence entre les prévisions «dans l'échantillon» et «hors échantillon»? -entre-dans-échantillon-et-hors-échantillon-prévisions) a l'explication suivante comme réponse.

if you use data 1990-2013 to fit the model and then you forecast for 2011-2013, it's in-sample forecast. but if you only use 1990-2010 for fitting the model and then you forecast 2011-2013, then its out-of-sample forecast.

J'ai recherché dans la littérature «Les éléments de l'apprentissage statistique, 2e édition» «l'usage» exact du terme. Ce livre est un manuel standard pour la modélisation et l'apprentissage automatique, et heureusement, il est distribué gratuitement par l'Université de Stanford. (Je ne "lisais" pas, je téléchargeais juste ...)

«Dans l'échantillon» a été expliqué au chapitre 7, «Évaluation et sélection du modèle», dans l'explication des performances de généralisation et de l'erreur de généralisation.

Training set:

\mathcal{T} = \{ (x_1, y_1), (x_2, y_2), ...(x_N, y_N) \}

Lors de l'évaluation de nouvelles données (données de test) avec le modèle "\ hat {f}" obtenu à l'aide de, l'erreur de généralisation suivante se produit.

Err_{\mathcal{T}} = E_{X^0, Y^0} [L(Y^0,\ \hat{f}(X^0)) \mid \mathcal{T}]  \\

Il existe divers facteurs qui réduisent la précision de la généralisation, et l'un d'eux est que les points de données (variables explicatives) diffèrent entre les données d'apprentissage et les données de test. Si les points de données correspondent, l'erreur «in-sample» suivante se produit.

Err_{in} = \frac{1}{N} \sum_{i=1}^{N} E_{Y^0} [L(Y^0_i ,\ \hat{f}(x_i)) \mid \mathcal{T} ]

Il peut être difficile de comprendre l'explication de la citation fragmentaire, mais comparez les deux formules ci-dessus. Il convient de noter l'argument de l'expression de modèle "hat {f}", où le général "X ^ 0" devient "x_i" (x dans les données d'apprentissage) dans l'expression ci-dessous. Ces données deviennent des données "in-samle". La figure ci-dessous est illustrée.

insample1.png

Prenons le cas où un modèle (ligne noire) est obtenu à partir de données d'entraînement (données de train) constituées de 6 points. (En fait, vous ne pouvez pas obtenir une courbe sinusoïdale comme une ligne à 6 points. Veuillez comprendre qu'il s'agit d'un diagramme explicatif.)

insample2.png

Les données "in-sample" sont celles dont la valeur x correspond à ces données d'apprentissage. Cette fois, les données d'apprentissage étaient x = 5, 10, 15, donc celle qui ne correspond pas à cela n'est pas "dans l'échantillon". Par conséquent, les données de x> 20 sur l'axe des x sont différentes et, en outre, les points d'intervalle tels que x = 4, 7 ne sont pas "dans l'échantillon". C'est la raison pour laquelle les citations StackExchange, validées croisées ne sont pas exactes au début. Cependant, dans l'analyse de séries chronologiques qui est souvent effectuée, les points de données sont souvent à intervalles réguliers (par exemple, quotidiennement, mensuellement), et dans ce cas, même s'ils sont séparés par un certain point sur l'axe des temps, «dans l'échantillon» / autre que cela. Parce qu'il peut être divisé en, il y a une situation dans laquelle il correspond à la définition du terme d'origine.

À l'exception du malentendu sur la façon d'utiliser ce terme, les explications dans le texte et le traitement de l'analyse des données chronologiques sont correctes à ce stade, veuillez donc vérifier.

L'usage des mots changera, comme "Vous pouvez manger de la nourriture délicieuse **" et "Vous pouvez manger de la nourriture délicieuse **", mais cette fois, "Utilisons correctement les termes techniques". La question était une leçon.

Recommended Posts

Ce que vous ne devriez pas faire dans le processus d'analyse des données de séries chronologiques (y compris la réflexion)
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Analyse des données, que faites-vous après tout?
Puissance des méthodes de prédiction dans l'analyse de données chronologiques Semi-optimisation (SARIMA) [Memo]
Illustrez instantanément la période prédominante dans les données de séries chronologiques à l'aide de l'analyse spectrale
Ne pas être conscient du contenu des données en python
Que faire si la barre de progression n'est pas affichée dans tqdm de python
Notez ce que vous voulez faire à l'avenir avec Razpai
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Comment calculer la somme ou la moyenne des données csv de séries chronologiques en un instant
Vous ne devez pas utiliser l'option --color = always de la commande grep
Expliquer le mécanisme de Linux que vous ne connaissez pas de manière inattendue
Que faire si vous ne pouvez pas utiliser la poubelle dans Lubuntu 18.04.
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Traiter le résultat de% time,% timeit
Différenciation des données de séries chronologiques (discrètes)
Ne changez pas l'ordre des colonnes lors de la concaténation des trames de données pandas.
Tracer CSV de données de séries temporelles avec une valeur unixtime en Python (matplotlib)
Implémenter une partie du processus en C ++
Analyse des séries chronologiques 4 Construction du modèle SARIMA
Conversion des données de temps en notation 25 heures
Prétraitement dans l'apprentissage automatique 1 Processus d'analyse des données
Dans pandas.DataFrame, même lors de l'attribution d'une seule colonne spécifique, si l'index est attaché, vous n'avez pas à vous soucier de l'ordre des données
Exemple de ce qu'il faut faire lorsque l'exemple de script ne fonctionne pas (OpenCV-Python)
Je souhaite visualiser l'état des transferts de la J League 2020, que dois-je faire?
Trouvez l'index des éléments qui correspondent aux conditions dans la trame / série de données pandas
Que faire si vous obtenez «Python non configuré». Utilisation de PyDev dans Eclipse
Que faire lorsque le graphique n'apparaît pas sur le notebook Jupyter (IPython)
Raccourcir le temps d'analyse d'Openpose à l'aide du son
Acquisition de données chronologiques (quotidiennes) des cours des actions
Lire la sortie du sous-processus, ouvrir en temps réel
[Analyse des données] Dois-je acheter le drapeau Harumi?
L'histoire de la lecture des données HSPICE en Python
Voir les détails des données de séries chronologiques dans Remotte
Comment lire les données de séries chronologiques dans PyTorch
Que dois-je faire avec DICOM de MPEG2?
Environnement enregistré pour l'analyse des données avec Python
Que faire quand n'est pas dans le fichier sudoers. Cet incident sera signalé.
Que faire si vous obtenez "(35, 'Erreur de connexion SSL')" dans pycurl (l'un d'entre eux)
estimation personnelle en temps réel (que dois-je faire pour éviter l'estimation d'images en dehors de la catégorie) * Échec.
Que faire lorsque Python ne passe pas de la version système dans pyenv
Vérifiez le temps de traitement et le nombre d'appels pour chaque processus avec python (cProfile)
Que faire si vous avez corrigé l'erreur dans l'adresse IP du fichier de zone mais ne pouvez pas vous connecter au serveur DNS