質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1331閲覧

時系列データの予測値を正しい値で得たい

yapimaru

総合スコア0

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/17 05:46

編集2021/06/17 07:05

前提・実現したいこと

詳解ディープラーニングという参考書のコードを参考にLSTMを用いた時系列データの
予測を行いたいのですが、本来なら0~1の範囲内で増減するはずの
予測値の値がほぼ一定になってしまいます。
なぜそうなるのか、理解できていないので皆様のお力をお借りしたい所存です。

■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python3

1''' 25.2.6 LSTM - Keras (sinæ³¢) 3''' 4 5 6import numpy as np 7import matplotlib.pyplot as plt 8from sklearn.model_selection import train_test_split 9import tensorflow as tf 10from tensorflow.keras import datasets 11from tensorflow.keras.models import Sequential 12from tensorflow.keras.layers import Dense, LSTM 13from tensorflow.keras import optimizers 14from tensorflow.keras.callbacks import EarlyStopping 15import sp波動法 16 17 18if __name__ == '__main__': 19 np.random.seed(123) 20 tf.random.set_seed(123) 21 22 ''' 23 1. データの準備 24 ''' 25 N=0 26 f = sp波動法.file 27 for i in range(len(f)): 28 if np.isnan(sp波動法.file['60日移動平均'][i]): 29 N+=1 30 else: 31 break 32 #print(N) 33 length_of_sequences = len(f) 34 35 maxlen = 60 36 37 x = [] 38 t = [] 39 40 for i in range(N,length_of_sequences - maxlen): 41 x.append(sp波動法.kairiritu[i:i+maxlen]) 42 t.append(sp波動法.jousyou[i+maxlen]) 43 44 x = np.array(x).reshape(-1, maxlen, 1) 45 t = np.array(t).reshape(-1, 1) 46 47 x_train, x_val, t_train, t_val = \ 48 train_test_split(x, t, train_size=0.8, test_size=0.2, shuffle=False) 49 #print(x) 50 #print(t) 51 # print(x_train.shape) 52 # print(x_val.shape) 53 # print(t_train.shape) 54 # print(t_val.shape) 55 56 ''' 57 2. モデルの構築 58 ''' 59 model = Sequential() 60 model.add(LSTM(50, activation='tanh', 61 recurrent_activation='sigmoid', 62 kernel_initializer='glorot_normal', 63 recurrent_initializer='orthogonal')) 64 model.add(Dense(1, activation='linear')) 65 66 ''' 67 3. モデルの学習 68 ''' 69 optimizer = optimizers.Adam(learning_rate=0.001, 70 beta_1=0.9, beta_2=0.999, amsgrad=True) 71 72 model.compile(optimizer=optimizer, 73 loss='mean_squared_error') 74 75 es = EarlyStopping(monitor='val_loss', 76 patience=10, 77 verbose=1) 78 79 hist = model.fit(x_train, t_train, 80 epochs=1000, batch_size=100, 81 verbose=2, 82 validation_data=(x_val, t_val), 83 callbacks=[es]) 84 85 ''' 86 4. モデルの評価 87 ''' 88 gen = [None for i in range(maxlen)] 89 cnt1=0 90 cnt2=0 91 cnt3=0 92 cnt4=0 93 num=0 94 #print(cnt) 95 #z = x[:1] 96 97 98 for i in range(len(f) - maxlen): 99 z1 = x[:i+N] 100 z = z1.reshape(-1, maxlen, 1) 101 #print(z) 102 preds = model.predict(z[-1:]) 103 #z = np.append(gen, preds)[1:] 104 105 gen.append(preds[0,0]) 106 107 #print(gen) 108 109 for i in range(len(f) - maxlen): 110 if gen[i] is None: 111 continue 112 if sp波動法.jousyou[i]==1: 113 if gen[i] >= 0.5: 114 cnt1+=1 115 else: 116 cnt2+=1 117 else: 118 if gen[i] < 0.5: 119 cnt1+=1 120 else: 121 cnt2+=1 122 正答率=cnt1/(cnt1+cnt2) 123 print(正答率) 124 125 fig = plt.figure() 126 plt.rc('font', family='serif') 127 #plt.xlim([0, len(f)]) 128 #plt.ylim([-0.2, 1.2]) 129 plt.plot(range(len(f)), sp波動法.jousyou, 130 color='gray', 131 linestyle='--', linewidth=0.5) 132 plt.plot(range(len(f)), gen, 133 color='black', linewidth=1, 134 marker='o', markersize=1, markerfacecolor='black', 135 markeredgecolor='black') 136 # plt.savefig('output.jpg') 137 plt.show()

試したこと

補足情報(FW/ツールのバージョンなど)

データはデューカスコピーから円ドルのBIDデータを一日足で二年分取得しています。
環境はanaconda3でインストールしたpython3をspyderで記述しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2021/06/17 06:16

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
yapimaru

2021/06/17 07:06

ご指摘ありがとうございます。 修正しました。
jbpb0

2021/06/17 22:20 編集

最後のplotは、どんな風になるのでしょうか?
yapimaru

2021/06/18 04:09

0.47付近でほぼ一定の値が図示されます。 学習データのxには乖離率が入りこの値は1.0±0.02程度の値で 教師データのtには上昇度が入りこの値は取得したデータの傾きが正の時は1、負の時は0となっています。
jbpb0

2021/06/20 10:53

hist = model.fit(... を実行している時に、各Epochで「loss:」と「val_loss:」の数値が表示されますが、それはEpochが進んだら減っていきますでしょうか? もし、EarlyStoppingが働いてすぐに終わるなら、model.fit()の最後の「callbacks=[es]」を無効にして実行してみてください もし、Epoch数が増えても「loss:」と「val_loss:」が減らないなら、学習がうまくできてませんので、学習後の予測もうまくできません
yapimaru

2021/06/20 16:05

データの期間が短い時は直ぐに終わってしまいますが長く取ると誤差も減っていき最終的には0.24辺りに落ち着きます
jbpb0

2021/06/20 22:04 編集

「データの期間」は「maxlen」のことでしょうか? それとも、 > 円ドルのBIDデータを一日足で二年分取得 の「二年」のことでしょうか? 「データの期間」を長くしたら、「loss:」だけではなく「val_loss:」も減りますでしょうか? 「データの期間」が学習時のval_lossにも効くならですが、その場合は学習後の予測精度にも効きそうですが、それを変えても、下記は変わらないのでしょうか? > 0.47付近でほぼ一定の値
yapimaru

2021/06/23 05:20

データの期間は取得しているcsvファイルのデータの期間なので二年のところを18年分とれば誤差は減り、 sp波動法のsp波動率の値を変更したら、それっぽい値になりました。 ありがとうございます。
jbpb0

2021/06/23 05:53

質問内容とは直接は関係無いかもしれませんが、コードでよく分からないところがあります 「1. データの準備」の for i in range(N,length_of_sequences - maxlen): x.append(sp波動法.kairiritu[i:i+maxlen]) で、「sp波動法.kairiritu」の最初のN個を飛ばしてxに格納しているのに、「4. モデルの評価」の for i in range(len(f) - maxlen): z1 = x[:i+N] で、xから取り出すのに再びNが出てきます ここでNが出てくる理由がよく分かりません また、「1. データの準備」の for i in range(N,length_of_sequences - maxlen): t.append(sp波動法.jousyou[i+maxlen]) では、xと同様に最初のN個を飛ばしてtに格納していて、x, tで学習しているので、学習後の予測では「sp波動法.jousyou」の最初のN個は関係無いと思うのですが、「4. モデルの評価」の for i in range(len(f) - maxlen): if gen[i] is None: のあたりでは、tではなく「sp波動法.jousyou」を使っていて、そこにはNは出てきません 最初のN個を飛ばして使わなくてもいいのでしょうか? というか、tを使えばいいのではないのでしょうか? 以上、コード見てて気になったところを書きましたけど、コード動かして確認してるのではないし、コードを完全に理解しているわけでもないので、的外れな指摘だったらごめんなさい
guest

回答1

0

hist = model.fit(...
を実行している時に、各Epochで「loss:」と「val_loss:」の数値が表示されますが、もし、Epoch数が増えても「loss:」と「val_loss:」が減らないなら、学習がうまくできてませんので、学習後の予測もうまくできません

投稿2021/07/02 10:52

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問