[PYTHON] Analyse des séries chronologiques

Aidemy 2020/11/10

introduction

Bonjour, c'est Yope! Je suis une école littéraire croustillante, mais j'étais intéressé par les possibilités de l'IA, alors je suis allé à l'école spécialisée en IA "Aidemy" pour étudier. Je voudrais partager les connaissances acquises ici avec vous, et je les ai résumées dans Qiita. Je suis très heureux que de nombreuses personnes aient lu l'article de synthèse précédent. Merci! Cette fois, je posterai la pratique de l'analyse des séries chronologiques. Ravi de vous rencontrer.

Quoi apprendre cette fois ・ Analyse de séries chronologiques à l'aide de LSTM (prévisions de ventes)

Analyse de séries chronologiques à l'aide de LSTM

À propos de LSTM

(En savoir plus sur le LSTM dans "Extraction du thème 1 du texte japonais" et "Analyse négative / positive 3") -__ LSTM__ est un type de RNN, et peut stocker les données saisies au début . Autrement dit, il s'agit d'un modèle RNN capable de __ stockage à long terme.

Procédure de prévision des ventes

・ Cette fois, nous utiliserons LSTM pour prédire données de vente. La procédure est la même que pour les autres prédictions de données. __ ① Collecte de données __ __② Traitement des données __ __③ Création du modèle __ __④ Prévisions / Évaluation __

① Collecte de données

Lecture des données

・ Cette fois, nous collecterons des données en lisant les données __csv des prévisions de ventes de champagne. -Dans la prédiction de données LSTM, seule la valeur des données de série __time est utilisée __, donc seule cette donnée est acquise. Plus précisément, __ "pd.read_csv ()" __ doit être exécuté, mais dans l'argument, __ "usecols = [colonne]" __ spécifie la colonne à extraire __ et __ "skipfooter =" Dans "Nombre de lignes" __, spécifiez le nombre de lignes __ qui ne sont pas lues à partir de la fin de __. De plus, lors de l'utilisation de skipfooter, il est nécessaire de spécifier __ "engine = 'python'" __. -Après avoir lu le fichier, utilisez __ ".values" __ pour récupérer uniquement __ données hors index et colonne __. -Enfin, convertir en type __float avec __ ".astype ('float32')" __ pour le rendre approprié pour l'analyse LSTM.

・ Code![Capture d'écran 2020-11-07 16.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/0b331f86-594b-321d- 55cd-62127694301c.png)

・ Résultat (seulement une partie)![Capture d'écran 2020-11-07 16.50.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/71ca1207 -7f78-ad5a-3d25-42ce612eb76a.png)

② Traitement des données

Créer un jeu de données

-Ici, __ formatez les données dans un formulaire qui peut être utilisé pour l'analyse . ・ Tout d'abord, les données sont divisées en __ données de formation et données de test, mais les données de séries de __ temps contiennent également des informations telles que la périodicité et la continuité __, donc si les données sont divisées au hasard, Ne le divisez pas au hasard, car les informations seront perdues et elles seront corrompues en tant que données. ・ Cette fois, les données originales sont divisées en __3, et les 2/3 premiers sont destinés à l'entraînement et le 1/3 restant est destiné aux tests. -En tant que code, il faut d'abord définir __la longueur à diviser __. Cette fois, il est divisé par 2/3 du total, 0,67 lorsqu'il est exprimé sous forme de fraction, donc cela est exprimé comme __ "int (len (ensemble de données) * 0,67)" __. -En fonction de cette longueur, divisez les données en «train» et «test». Si la longueur à diviser est __ "train_size" __, le train peut être obtenu avec __ [0: train_size ,:] __, et le test peut être obtenu avec __ [train_size: len (dataset) ,:] __. ça peut.

・ Code![Capture d'écran 2020-11-07 17.14.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/ddc6b5eb-9caa-db2f- a8b5-03564d2d3293.png)

Mise à l'échelle des données

・ (Révision) __ La mise à l'échelle __ est un processus __ qui égalise le degré d'influence de __ valeurs en égalisant les données avec différentes unités et plages selon une certaine norme. -Il existe __ "normalisation" __ et __ "standardisation" __ pour la mise à l'échelle. La normalisation est __ "valeur la plus basse 0 valeur la plus élevée 1" __, et la normalisation est __ "moyenne 0 écart type 1" __. -Si la mise à l'échelle est effectuée avec des données de test, le modèle s'adaptera trop aux données et la précision de la prédiction sera faible. -Lors de la mise à l'échelle avec normalisation, utilisez __ "MinMaxScaler (feature_range = (0,1))" __. Définissez les paramètres de mise à l'échelle en fonction des données d'entraînement avec __ "fit (train)" __, puis mettez-le à l'échelle avec __ "transform (train)" et "transform (test)" __ respectivement.

・ Code![Capture d'écran 2020-11-07 20.19.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/84b9fd35-956c-5a5d- 59c9-cc0ef1cf5bbd.png)

・ Résultat (partie seulement)![Screenshot 2020-11-07 20.19.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/2d9134e0 -0479-69d0-2e6a-9d954233d3eb.png)

Création des données d'entrée et étiquette de réponse correcte

・ Dans cette prédiction, __ "prédiction des données suivantes" __ est effectuée en utilisant __ "plusieurs données avant le point de référence" __, donc les données d'entrée sont __ "le point de référence". Les données de ce point à n points avant sont __, et l'étiquette de réponse correcte est __ "données au point suivant le point de référence" __. -Lors de la création de données, le processus d'acquisition "du point de référence et des données de ce point vers n points avant" est répété __, créez donc une __fonction qui définit ce processus itératif à l'avance __ Ensuite, transmettez-lui les données d'entraînement et les données de test créées dans la section précédente pour créer __input data __ et __correct label __. · Le code est comme suit. La signification sera décrite plus loin.

スクリーンショット 2020-11-07 20.34.05.png

-Pour cette fonction __ "create_dataset" __, les données dataset et __ "look_back" __ qui spécifient jusqu'où le point de référence (n) doit être pris sont passés en arguments. Tout d'abord, préparez __ "data_X" __ "data_X" __ pour stocker les données d'entrée __ "data_Y" __ pour stocker l'étiquette de réponse correcte. -Pour __ "for i in range (look_back, len (dataset))" __, cela représente la position de __ "le point du jour après le point de référence" __. En d'autres termes, le point de référence est __ "i-1" . Dans data_X, __ "dataset [i-look_back: i, 0]" __ "data of i-look_back or more and less than i (jusqu'au point de référence)" __ est stocké, et dans data_Y __ "dataset" [i, 0] " stocke " les données du jour après le point de référence ". Tout ce que vous avez à faire est de les renvoyer sous forme de tableau __np.array __.

・ Cette fois, __3 données précédentes sont définies comme 1 ensemble __, c'est-à-dire __ "look_back = 3" __. Vous pouvez créer __ "train_X" "train_Y" __ en transmettant les données d'entraînement et look_back à la fonction create_dataset comme dans le code ci-dessus, et en transmettant les données de test de la même manière __ "test_X" et "test_Y" __ Peut être créé.

Formatage des données d'entrée

-Bien que les données d'entrée et l'étiquette de réponse correcte aient été créées dans la section précédente, les __ données d'entrée ne sont pas encore dans un format pouvant être analysé par LSTM, nous allons donc les formater __. -Spécifiquement, les données d'entrée sont converties en 3D de __ "nombre de lignes x nombre de variables x nombre de colonnes" __. Le nombre de lignes est __le nombre total de données __, le nombre de variables est le nombre d'éléments inclus dans l'ensemble ___1 __ et le nombre de colonnes est __ le nombre de types de données à traiter __.

-Convertissez les dimensions avec __ "reshape ()" __. Une fois passé à l'argument, il devient __ (numpy.shape [0], numpy.shape [1], 1) __.

・ Code![Capture d'écran 2020-11-07 21.39.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/e4d55aa7-e26e-23fe- 9604-46ac2b47dc79.png)

・ Résultat (partie de train_X)![Capture d'écran 2020-11-07 21.40.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/ ff4ed61b-bf29-550b-9fa9-478a8142b4be.png)

③ Création de modèle

Création et formation de modèles LSTM

・ Cette fois, nous allons créer avec le modèle __Sequential __. Par conséquent, la couche LSTM peut être ajoutée avec __ "model.add (LSTM ())" __. Spécifiez le nombre de blocs __LSTM __ et créez une couche d'entrée de longueur look_back et dimension 1 avec __input_shape = (look_back, 1) __. -La couche de sortie correspond aux données du lendemain, c'est-à-dire qu'une classe suffit, donc __ "Dense (1)" __. -Ensuite, exécutez __compile . __ Définissez la fonction de perte loss et optimizer. Étant donné que ce temps correspond au regression model, __mean square error "mean_squared_error" __ est utilisé pour la fonction de perte (la fonction qui mesure l'erreur entre l'étiquette correcte et la sortie). Il existe différents algorithmes d'optimisation (méthodes qui modifient les poids pour que le gradient de la fonction de perte diminue), mais __ je ne peux pas le dire avant de l'essayer __.

-L'apprentissage se fait avec __ "model.fit ()" __. Passez epochs (nombre d'apprentissage) et batch_size (nombre de divisions de données) comme arguments. ・ Après cela, changez le nombre de couches et le nombre d'époques en __tune __. Si la couche LSTM est ajoutée après la couche LSTM, écrivez __ "return_sequences = True" __ dans l'argument de la source d'ajout.

·code スクリーンショット 2020-11-07 23.04.50.png

・ Résultat (seulement une partie)![Capture d'écran 2020-11-07 23.05.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/dd32ab50 -c35b-c3ac-2ec6-1c4c29ade57f.png)

④ Prévisions / évaluation

-Enfin, prédire et évaluer le modèle. -Utilisez __ "model.predict ()" __ pour la prédiction. Vous pouvez y passer train_X et test_X. ・ Ensuite, nous évaluerons le résultat de la prédiction, mais pour l'évaluer correctement __, il est nécessaire de restaurer les données mises à l'échelle __. J'ai mis à l'échelle avec __ "transform ()" __, mais cette fois j'utilise __ "inverse_transform ()" __ qui fait le contraire.

-Au moment de la mise à l'échelle, les paramètres de mise à l'échelle ont été définis sur la base des données d'apprentissage avec __ "fit (train)" __, mais la même définition est utilisée pour cette transformation inverse. Si cette définition est "scaler_train", "train_predict" qui stocke la valeur prédite des données d'apprentissage et "train_Y" qui stocke l'étiquette de réponse correcte sont renvoyés à l'original comme suit.

スクリーンショット 2020-11-07 23.18.04.png

・ Faites de même pour les données de test. Une fois que vous avez fait cela, l'étape suivante consiste à évaluer __data __. -Pour l'indice de précision des données de séries chronologiques, utilisez le __ "erreur quadratique moyenne" __ qui est sorti plus tôt. Encore une fois, cet indice montre à quel point la valeur prédite est éloignée de la bonne réponse, et plus elle est proche de __0, plus la précision __ est élevée.

-En tant que code, écrivez __ "math_sqrt (mean_squared_error (étiquette correcte, valeur prédite))" __. -Dans ce cas, l'étiquette de réponse correcte est stockée dans la 0ème colonne __ de __train_Y, et la valeur prédite est stockée dans la 0ème colonne __ (chaque ligne) de __train_predict, donc chaque code ressemble à ce qui suit. Il doit être spécifié dans.

・ Code![Capture d'écran 2020-11-07 23.30.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/31dd419b-64f1-2762- 78f4-7d4d6492b454.png)

・ Résultat![Capture d'écran 2020-11-07 23.30.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/7c9dbf22-8174-9066- bb2b-a3327a6cf54d.png)

Visualisation des résultats de prédiction

・ Je veux voir ce qui est visualisé cette fois, donc je ne posterai qu'un code spécifique.

・ Code![Capture d'écran 2020-11-07 23.33.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/649132c4-c813-5a12- 712e-f70aca646b64.png)

・ Résultat![Capture d'écran 2020-11-07 23.38.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/2cb856dc-b466-6366- cc1f-09db83c4395d.png)

Sommaire

-Pour l'analyse des séries chronologiques, il est conseillé de créer un modèle utilisant "LSTM", qui permet un stockage à long terme. -Même si des données sont acquises, elles ne peuvent pas être utilisées pour l'analyse telles quelles, donc formatez-les. Après la mise à l'échelle, vous pouvez le transmettre au modèle en le séparant en données d'entrée et en étiquettes correctes. Pour les données d'entrée, créez la dimension en trois dimensions. ・ Le modèle est séquentiel. Le modèle est terminé après l'ajout de couches, la compilation et l'entraînement. Puis évaluez le modèle. Il est nécessaire de restaurer les données mises à l'échelle au moment de l'évaluation.

Cette fois, c'est fini. Merci d'avoir lu jusqu'à la fin.

Recommended Posts

Analyse des séries chronologiques
Analyse de séries chronologiques Partie 3 Prévisions
Défi des prévisions de ventes futures: ② Analyse des séries chronologiques à l'aide de PyFlux
Défi des prévisions de ventes futures: ⑤ Analyse des séries chronologiques par Prophet
Python: analyse des séries chronologiques
Analyse des séries chronologiques RNN_LSTM1
Analyse des séries chronologiques 1 Principes de base
Analyse des séries chronologiques partie 4 VAR
Analyse de séries chronologiques Partie 1 Autocorrélation
Défi des prévisions de ventes futures: ④ Analyse des séries chronologiques en tenant compte de la saisonnalité par Stats Models
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Analyse des séries chronologiques 3 Prétraitement des données des séries chronologiques
Défi pour les prévisions de ventes futures: ① Qu'est-ce que l'analyse des séries chronologiques?
Analyse des séries chronologiques 2 Stabilité, modèle ARMA / ARIMA
J'ai essayé l'analyse de séries chronologiques! (Modèle AR)
Analyse des séries chronologiques Partie 2 AR / MA / ARMA
Analyse des séries chronologiques 4 Construction du modèle SARIMA
Analyse des séries chronologiques n ° 6 Faux retour et partie républicaine
Décomposition des séries temporelles
Python: analyse des séries temporelles: création d'un modèle SARIMA
Python: Analyse des séries temporelles: Constantity, modèle ARMA / ARIMA
Python 3.4 Créer un environnement Windows7-64bit (pour l'analyse des séries chronologiques financières)
Question sur la série chronologique Python
Afficher les séries chronologiques TOPIX
Diagramme de séries chronologiques / Matplotlib
Une méthode d'étude pour les débutants pour apprendre l'analyse des séries chronologiques
[Python] Tracer des données de séries chronologiques
[Statistiques] [Analyse des séries chronologiques] Tracez le modèle ARMA et saisissez la tendance.