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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

Q&A

解決済

1回答

741閲覧

pythonのkerasによる時系列予測において、loss/accuracyの変化率が鈍い

imonikai

総合スコア13

Keras

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

機械学習

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

0グッド

1クリップ

投稿2019/10/21 18:11

ある実験から記録されたデータの数値を用いて、
次にどのような数値が来るかの予測を行いたく
機械学習(keras+tensorflow)を使い始めました。

環境は、google colaboratoryのjupyter notebookと
もう一つの環境は、centos7 + python3.7 + keras + tensorflow(ともに最新)になります。

まだ初心者であるため、色々なサイトから時系列予測の
プログラムや説明サイトを眺めながら下記のような
プログラムを作成し、実行したところ問題点が何点か上がり
どうしても解決できないため、質問させていただきました。

【問題1】
pythonを実行した所、プログラムが起動するまでに5分程度かかり、
やっとこ動作してもかなりゆっくりになってしまう。
これはCSVが5000レコードほどあるためでしょうか?
プログラムのmodelを作成する直前までだけを動作させるとすぐに終了します。

【問題2】
プログラムが起動しても、model(Sequential)の評価にすごく時間が掛かる

Train on 4068 samples, validate on 1018 samples
Epoch 1/10000
756/4068 [====>.........................] - ETA: 1:24:07 - loss: 27.4171 - acc: 0.0013

このような感じで1つ評価するのに1時間ほどかかるのは、
batch_sizeが小さく、epochsが大きすぎるからでしょうか。

【問題3】

  • lossの値が全く減少しない
  • val_lossの値も同様に減少しない。
  • また、accuracyの値も上昇せず、0.02あたりでうろつく
  • val_accuracyについては、0e000-00となり、まったく動かない

のはなぜでしょうか。

このようにlossの値が減らない、accuracyが上昇しないのは

  • m.add(LSTM(4068, ~の箇所の数値がおかしい
  • compileのlossの指定がおかしい
  • fitのbatch_sizeやepochsがおかしい
  • そもそもこのCSVデータは値がランダムすぎて解析できない

(実際に予測したいデータは
14528
5193
15
863
14229
9841
のような感じのCSVデータで現在、5000ちょっとのデータ数になります)

  • やり方自体がおかしい

とかの理由でしょうか。

ちなみにcompileのlossには色々試してはみました。

  • mean_squared_logarithmic_error → lossが一番小さい値(10ぐらいまで)になる
  • mean_absolute_error → lossが4桁の数字ぐらいまでになる
  • mean_squared_error → ひどいときにはlossが100000や1000000の桁になるときがある

という結果でした。

activationにもいろいろ試しましたが、reluが一番いいのかなという印象でした。
softmax、tanhとかも使用しましたがあまり良くない印象でした。

なので、loss=mean_squared_logarithmic_error、activation=reluの
組み合わせをよく使っています。

【質問4】
下記のプログラムでは、3としていますが、実際には

python

1# 何個ひとまとめとするか設定 2summary_num = 300

というように、300個をひとまとめとして、その次のデータを予測させているのですが、それではあまりにも多すぎるということでしょうか

【質問5】
もし解決方法があればご教授・ご指摘いただけると幸いですです

以上、何かわかることがございましたら
ヒントだけでもいただけると助かります。

よろしくお願いいたします。

下記にCSVデータのサンプルと、
実際に動作させているプログラムを記述します。

CSV

1"7","yyyy-mm-dd h24:M:i","70" 2"6","yyyy-mm-dd h24:M:i","60" 3"5","yyyy-mm-dd h24:M:i","50" 4"4","yyyy-mm-dd h24:M:i","40" 5"3","yyyy-mm-dd h24:M:i","30" 6"2","yyyy-mm-dd h24:M:i","20" 7"1","yyyy-mm-dd h24:M:i","10"

python

1import numpy as np 2import pandas as pd 3import sys 4from keras.models import Sequential 5from keras.layers import Dense, Dropout, Activation 6from keras.layers import LSTM 7from keras.layers import RepeatVector 8from keras.layers import TimeDistributed 9from keras.callbacks import EarlyStopping 10from keras.optimizers import Adam,Adamax 11from matplotlib import pylab as plt 12import seaborn as sns 13%matplotlib inline 14sns.set() 15 16 17#--------------------------------------------- 18# CSV 19csv_file = 'data.csv' 20 21# 何個ひとまとめとするか設定 22summary_num = 3 23 24#--------------------------------------------- 25# CSV読み込み 26df = pd.read_csv( 27 csv_file, 28 header=0, 29 usecols=[2], 30 names =['counts'] 31) 32 33# CSVが1行目(最新)→最終列(最古)となって記述されているので、読み込んだCSVの並びを反転させる 34df = df.iloc[::-1] 35 36# pandas→arrayに変換 37ary_hits = df.values 38 39#----------------------------------------- 40# np.array化した配列を取得する 41train_x = np.array([]) # 教師データを格納する入れ物 42train_y = np.array([]) # 上記のラベルを格納する入れ物 43test_x = np.array([]) # テスト用データを格納する入れ物 44 45# 全体的なリストを入れる入れ物(教師データと回答データ) 46tmp_list_x = [] # train_x に入る要素を格納する入れ物 47tmp_list_y = [] # train_y に入る要素を格納する入れ物 48tmp_list_tx = [] # tmp_list_tx に入る要素を格納する入れ物 49 50# CSVデータから配列を作成する際に何回ループさせるかを判定 51# 一番最後まで行ってしまったら、教師データの回答データを作成できないので一歩手前で止めておく 52loop_cnt = len(ary_hits) - 1 53 54# 何回目に外側のループを抜けるのかを設定 55# さらに1を引くことで、最後のデータを教師データの回答データとして扱うために1を引いている 56exit_num = len(ary_hits) - summary_num 57 58#----------------------------------------- 59for i in range(loop_cnt): 60 if i == exit_num: 61 # 調査対象データを作成する 62 # 第n~n+l回をひとまとめにした入れ物 63 tmp_train_x_list = [] 64 for j in range(i, i + summary_num): 65 tmp_train_x_list.append(int(ary_hits[j][0])) 66 67 tmp_list_tx.append(tmp_train_x_list) 68 break 69 70 # 第n~n+l回をひとまとめにした入れ物 71 tmp_train_x_list = [] 72 for j in range(i, i + summary_num): 73 tmp_train_x_list.append(int(ary_hits[j][0])) 74 75 tmp_list_x.append(tmp_train_x_list) 76 tmp_list_y.append([int(ary_hits[i + summary_num][0])]) 77 78# ★★★★ 79# tmp_list_xには、[[10,20,30], [20,30,40], [30, 40, 50], [40, 50, 60]] 80# のような形のデータが入ります。 81# 各カラムに3個の数字が入っているのはsummary_num =3 と指定しているためです。 82# test_xには、[[50, 60, 70]]が入ります。 83# こちらもsummary_num =3 としているため3個になります。 84# 実際に動作させたときは、summary_num =300や500などで動作させています。 85# 86# tmp_list_yには、tmp_list_xに対するラベルとして[[40], [50], [60], [70]]が入ります。 87 88 89# リストで作成してから、np.arrayに変換し、さらに教師データ及び、テストデータはfloat型にする 90x = np.array(tmp_list_x).astype('float32') # 教師データ 91y = np.array(tmp_list_y) # 教師データに対応するラベル 92x_input = np.array(tmp_list_tx).astype('float32') # 確認用のテストデータ 93 94# 標準化(?)する 95# CSVの予測したいデータ(第三カラム)は、0~99,999までの数字が入っているので 96# 99999で割ることにより、0~1の間に収まるようにした 97# 色々なサイトを見たところ、-1 ~ 1の間に収めるべきだとあったので99999で割る対応をした 98x /= 99999 99x_input /= 99999 100 101 102 103#----------------------- 104# 行列のフォーマット変更。 105x = x.reshape((x.shape[0], x.shape[1], 1)) 106y = y.reshape((y.shape[0], y.shape[1], 1)) 107 108 109#----------------------- 110# modelを作成 111m = Sequential() 112 113m.add(LSTM(4068, input_shape=(x.shape[1], x.shape[2]))) # 4068にしたのは、validation_split=0.2とした時にトレーニングデータ数が4068となったため設定 114m.add(Activation('relu')) 115m.add(Dropout(0.25)) 116m.add(RepeatVector(y.shape[1])) 117m.add(LSTM(2, activation='relu', return_sequences=True)) 118m.add(TimeDistributed(Dense(1))) 119 120m.compile( 121 optimizer=Adam(), 122 loss = 'mean_squared_logarithmic_error', 123 metrics = ['accuracy']) 124 125 126# 過学習を防止 127early_stopping = EarlyStopping(monitor='val_loss', mode='auto', patience=20) 128 129# 学習開始 130history = m.fit(x, y, batch_size=36, epochs=10000, validation_split=0.2, callbacks=[early_stopping]) 131 132 133#------------------- 134# テストデータの行列のフォーマット変換 135x_input = x_input.reshape((x_input.shape[0], x_input.shape[1], 1)) 136# 実際に評価を行う 137result = m.predict(x_input) 138display(result ) 139 140 141 142 143 144 145def plot_history(history): 146 147 # 精度の履歴をプロット 148 plt.plot(history.history['acc']) 149 plt.plot(history.history['val_acc']) 150 plt.title('model accuracy') 151 plt.xlabel('epoch') 152 plt.ylabel('accuracy') 153 plt.legend(['acc', 'val_acc'], loc='upper right') 154 plt.show() 155 156 # 損失の履歴をプロット 157 plt.plot(history.history['loss']) 158 plt.plot(history.history['val_loss']) 159 plt.title('model loss') 160 plt.xlabel('epoch') 161 plt.ylabel('loss') 162 plt.legend(['loss', 'val_loss'], loc='upper right') 163 plt.show() 164 165 166 167# 学習履歴をプロット 168plot_history(history) 169

説明として…
サンプルのCSVを基にすると、
xの教師データには、[[10,20,30], [20,30,40], [30, 40, 50], [40, 50, 60]]
が格納されます。
またyには、xに対するラベルとして
[[40], [50], [60], [70]]
のように格納されます。
(これは「標準化」、「行列のフォーマット変更」さる前のデータ構造になります。)

確認(テスト用)データとして、
x_input には、
[[50, 60, 70]]
が入ります。
(こちらも「標準化」、「行列のフォーマット変更」さる前のデータ構造になります。)

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

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

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

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

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

guest

回答1

0

ベストアンサー

コード読んでないので、一般論での回答になります。

CSVが5000レコードほどあるため

5000行ということでしょうか?それなら、少なすぎます。

精度が上がらない原因について
・正規化していますか?
・5000行ならデータが少なすぎる可能性あり

投稿2019/10/23 08:21

yamato_user

総合スコア2321

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

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

imonikai

2019/10/24 13:03

ありがとうございます 正規化していないので正規化を学んで組み込んでみようと思います (min-max z-scoreを試したいと思います、他に試すものありましたらご教授いただけると助かります) あとデータですが、1日1〜2件ぐらいしか増加しないので、10000件以上になるには時間がかかってしまうので今のところこの5000件のデータで試しております
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問