Aidemy 2020/11/10
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 ・ ・
(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 __.
-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.
-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
(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".
-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.
・ 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)
-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)
・ 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)
・ 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)
-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