[PYTHON] Analyse des séries chronologiques RNN_LSTM1

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! Ceci est le premier article de RNN_LSTM. Ravi de vous rencontrer.

Quoi apprendre cette fois ・ ・

Examen de l'apprentissage en profondeur

Qu'est-ce que le Deep Learning?

(Pour l'apprentissage en profondeur, apprenez à partir de «Bases de l'apprentissage en profondeur») -__ Deep learning __ fait référence à un modèle __ dans lequel la __ couche intermédiaire (couche cachée) du réseau neuronal est profondément définie. ・ Le réseau neuronal fait partie de l'apprentissage automatique qui applique le mécanisme de transmission cérébrale et se compose de __ "couche d'entrée", "couche intermédiaire" et "couche de sortie" __. -Bien que la valeur de sortie souhaitée pour l'apprentissage automatique puisse être obtenue lorsque les informations sont transmises de gauche à droite, la précision du modèle peut être améliorée en effectuant un «apprentissage» dans lequel les informations sont données de droite à gauche et les paramètres sont ajustés. -En approfondissant la couche, il est possible de réduire __ paramètres par rapport au cas où cela n'est pas fait, et il y a un avantage que __ l'efficacité d'apprentissage est bonne __.

Déterminer le nombre de couches et le nombre d'unités

-Une des choses à considérer lors de la construction d'un modèle pour un réseau neuronal est __ "nombre de couches" __ et __ "nombre d'unités" __. Puisqu'il n'y a pas de formule pour les déterminer, il est nécessaire de prendre des décisions exploratoires. -Le plus évident est le nombre d'unités (nombre de dimensions) __ dans la couche de sortie. Pour cela, le nombre de catégories (nombre de classes) à classer peut être spécifié tel quel. -En ce qui concerne le nombre d'unités dans les autres couches, il est habituel de commencer par le nombre d'unités __ "(couche d'entrée + couche de sortie) * 2/3" __. Les couches suivantes sont définies lors de la vérification des résultats d'apprentissage. -En ce qui concerne le nombre de __ couches intermédiaires __, ajoutez-le lorsque le nombre d'unités est susceptible d'augmenter dans la procédure ci-dessus.

Mesures de surapprentissage

-La première chose qui peut être mentionnée comme contre-mesure contre le surapprentissage, c'est-à-dire une méthode __ généralisation __, est __ "DropOut ()" __. Il s'agit d'une méthode de généralisation qui n'apprend pas les nœuds par un rapport fixe. En règle générale, définissez le ratio de __50% __. -La suppression peut être effectuée avec __ "model.add (Dropout (ratio))" __.

-Une autre méthode de généralisation est __ "Early Stop" __. Il s'agit d'une méthode pour éviter le surapprentissage en arrêtant l'apprentissage lorsque __la précision ne s'améliore pas lors d'un apprentissage répété. ・ On peut dire que la précision est meilleure lorsque l'erreur __ entre les données d'entraînement et les données de test est approximativement uniformément espacée __. -L'arrêt anticipé peut être fait avec __ "Early Stopping ()" __. En tant que paramètre, __ "monitor = 'val_loss'" __ est utilisé pour déterminer l'erreur comme critère de précision, et __ "patience" __ est utilisé pour spécifier le nombre de données passées pour juger l'erreur, et __ "mode" __ Spécifiez la définition (limite supérieure ou limite inférieure) dont la convergence est jugée.

RNN/LSTM

À propos de RNN

(Aussi appris sur RNN par "analyse de séries chronologiques") -__ RNN__ est un réseau __neural qui peut gérer des données de séries __time. Les informations passées sont conservées dans le modèle afin d'incorporer le concept de temps dans le réseau neuronal. ・ Cependant, au fur et à mesure que la série chronologique progresse, le gradient peut disparaître ou la quantité de calcul peut augmenter de manière explosive __ "explosion de gradient" __, donc cela ne convient pas pour un apprentissage à long terme __ Il y a un point. -Pour l'explosion du gradient, il existe une solution appelée "gradient clipping" __ qui dit "corriger le gradient si la valeur du gradient dépasse le seuil".

À propos de LSTM

-La solution au problème RNN ci-dessus est __ "LSTM" __. En remplaçant la couche intermédiaire de RNN par un bloc LSTM, le contexte peut être maintenu pendant longtemps.

Prévisions des données boursières UNIQLO

Définir le processus jusqu'à la création du modèle avec une fonction

・ Pour ces données, __ "Données de cours de l'action Unichrome" __ est utilisé. Cette fois, nous allons faire "Prédire les données __ du jour suivant __ à partir des données __ 15 jours passés". -Dans le code, tout d'abord, la fonction __ "apply_window ()" __ qui divise les données tous les n jours (window_size) est créée. -Ensuite, créez une fonction __ "split_train_test ()" __ qui divise les données en données d'entraînement et en données de test. Cette fois, __70% __ est utilisé par défaut comme données d'entraînement. -Créer une fonction __ "data_load ()" __ qui lit les données. Après avoir lu les données, reconnaissez la colonne «Date» comme des données de date et triez par date en fonction de celle-ci. Enfin, obtenez __close price __ (colonne 'Close') dans cet ordre. ・ Une fois que vous avez fait jusqu'à présent, créez __ "train_model ()" __ qui définit le modèle et effectue la formation. La taille unitaire de la couche d'entrée est __ "15" __ parce que "15 jours de données" est entré cette fois. Le modèle utilise __Sequential () __ et les données de séries chronologiques sont gérées par la couche __LSTM __. Après avoir défini la couche, compilez-la, et cette fois, entraînez-la avec le nombre de formations (époques) 10. -Enfin, créez une fonction __ "predict ()" __ qui prédit le modèle. Lors du retour, il est renvoyé sous forme de __ "tableau NumPy unidimensionnel" __ comme __ "pred.flatten ()" __.

・ Code![Capture d'écran 2020-11-08 19.58.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/db6ea786-8bb8-0e75- ba35-7560071141e8.png)

スクリーンショット 2020-11-08 19.59.12.png

Réglage de l'échelle (standardisation)

-Implémenter le modèle en utilisant les fonctions existantes. Après avoir chargé les données avec __ "data_load () __", obtenir le cours de clôture, fractionner les données avec __ "split_train_test ()" __, mettre à l'échelle les données __ avant de les transmettre au modèle __. Cette fois, nous ferons la standardisation. -Pour la standardisation, créez une instance avec __ "StandardScaler ()" __, calculez la distribution moyenne des données avec __ "fit_transform ()" __ pour les données d'entraînement, puis standardisez, et pour le test et les données __ Normaliser uniquement avec "transform ()" __ (car les données de test sont moins précises lorsqu'elles sont utilisées pour définir la normalisation).

-Après normalisation, divisez les données avec __ "apply_window ()" __. Cette fois, window_size est mis à 15, mais ici nous voulons inclure le "prix de clôture du lendemain" dans la taille, donc l'argument est __ "window_size + 1" __. La dernière (-1) de la liste de données divisée par ceci est transmise comme étiquette de réponse correcte (y_train), et les 15 autres données sont transmises comme données d'apprentissage (X_train) à __ "train_model ()" __. Après cela, prédisez avec "prédire ()" et vous avez terminé.

・ De plus, si vous souhaitez comparer les données prédites par prédire cette fois avec les données de test dans un diagramme, restaurez les données avec __ "inverse_transform ()" __ puis utilisez __ "plt.plot ()" __ pour illustrer. bien.

・ Code![Capture d'écran 2020-11-08 19.59.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/480715aa-ab35-a829- 9d3c-fd0f8d167ca7.png)

・ Résultat![Capture d'écran 2020-11-08 20.00.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/968fe309-e9e8-1b95- a559-fcc04896b00c.png)

(Développement) Prédire le cours de clôture après 10 jours

・ Dans la section précédente, le cours de clôture qui pouvait être prédit valait un jour, mais en décalant cette prédiction d'un jour et en l'exécutant pendant dix jours __, un modèle __ qui prédit le cours de clôture dans __10 jours peut être créé. .. -En tant que méthode concrète, créez une fonction __ "predict_ten_days ()" __ fonction qui prédit 10 fois, et passez-lui les données et le modèle. Cependant, le point de départ des données de test "supérieur ou égal à window_size (inférieur à 365-window_size)" est défini par __ "start_point" __, et les données sont utilisées à partir de cette position.

-Code (points supplémentaires uniquement, start_point est facultatif)![Screenshot 2020-11-08 20.00.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0 / 698700 / 06cccc3c-ee9b-b899-fc52-707d067f2bdb.png)

スクリーンショット 2020-11-08 20.01.14.png

・ Résultat![Capture d'écran 2020-11-08 20.01.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/7c8466ff-487c-66b3- 6e70-7c101d483e7d.png)

Sommaire

-En tant que méthode de généralisation, il existe également un «arrêt précoce» en plus du «décrochage» apparu jusqu'à présent. Cela permet d'éviter le surapprentissage en arrêtant automatiquement l'apprentissage lorsque la précision ne s'améliore pas. -Lors de la création d'un modèle qui effectue une certaine prédiction à partir des données des n derniers jours, divisez les données par n et ajustez la taille d'entrée du modèle en conséquence. ・ Si vous souhaitez effectuer plus d'analyses de séries chronologiques futures telles que des prévisions de cours boursiers dans quelques jours, vous pouvez créer un modèle en répétant les prévisions quotidiennes.

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

Recommended Posts

Analyse des séries chronologiques RNN_LSTM1
Python: analyse des séries chronologiques
Analyse des séries chronologiques 1 Principes de base
Analyse des séries chronologiques partie 4 VAR
Analyse de séries chronologiques Partie 3 Prévisions
Analyse de séries chronologiques Partie 1 Autocorrélation
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écomposition des séries temporelles
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
Python: analyse des séries temporelles: création d'un modèle SARIMA
Python: Analyse des séries temporelles: Constantity, modèle ARMA / ARIMA
Question sur la série chronologique Python
Afficher les séries chronologiques TOPIX
Diagramme de séries chronologiques / Matplotlib
[Python] Tracer des données de séries chronologiques
Une méthode d'étude pour les débutants pour apprendre l'analyse des séries chronologiques
Défi des prévisions de ventes futures: ⑤ Analyse des séries chronologiques par Prophet
Défi pour les prévisions de ventes futures: ① Qu'est-ce que l'analyse des séries chronologiques?
Calcul de la fidélité des clients dans les séries chronologiques
Prédiction de séries chronologiques facile avec Prophet
L'intrigue de séries temporelles a commencé ~ édition python ~
À propos des données de séries chronologiques et du surentraînement
[Statistiques] [Analyse des séries chronologiques] Tracez le modèle ARMA et saisissez la tendance.
Différenciation des données de séries chronologiques (discrètes)
Statistiques de mouvement pour la prédiction de séries chronologiques
LSTM (1) pour la prédiction de séries chronologiques (pour les débutants)
Illustrez instantanément la période prédominante dans les données de séries chronologiques à l'aide de l'analyse spectrale
Prédiction des données de séries chronologiques par projection simplex
Prédire les données de séries chronologiques avec un réseau neuronal
Comment comparer des données de séries chronologiques - Dérivée DTW, DTW-
[Python] Accélère le chargement du fichier CSV de séries chronologiques
Détection d'anomalies de données chronologiques pour les débutants
matplotlib Ecrire du texte dans un graphique de séries chronologiques
Comment gérer les données de séries chronologiques (mise en œuvre)
Lecture des données de séries chronologiques OpenFOAM et des ensembles de données
Introduction à l'analyse des séries temporelles ~ Modèle d'ajustement saisonnier ~ Implémenté en R et Python
Défi des prévisions de ventes futures: ④ Analyse des séries chronologiques en tenant compte de la saisonnalité par Stats Models