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

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

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

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

Python 3.x

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

機械学習

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

解決済

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

imonikai
imonikai

総合スコア0

Keras

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

Python 3.x

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

機械学習

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

1回答

0評価

1クリップ

7閲覧

投稿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

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

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

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

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

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

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

CSV

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

python

import numpy as np import pandas as pd import sys from keras.models import Sequential from keras.layers import Dense, Dropout, Activation from keras.layers import LSTM from keras.layers import RepeatVector from keras.layers import TimeDistributed from keras.callbacks import EarlyStopping from keras.optimizers import Adam,Adamax from matplotlib import pylab as plt import seaborn as sns %matplotlib inline sns.set() #--------------------------------------------- # CSV csv_file = 'data.csv' # 何個ひとまとめとするか設定 summary_num = 3 #--------------------------------------------- # CSV読み込み df = pd.read_csv( csv_file, header=0, usecols=[2], names =['counts'] ) # CSVが1行目(最新)→最終列(最古)となって記述されているので、読み込んだCSVの並びを反転させる df = df.iloc[::-1] # pandas→arrayに変換 ary_hits = df.values #----------------------------------------- # np.array化した配列を取得する train_x = np.array([]) # 教師データを格納する入れ物 train_y = np.array([]) # 上記のラベルを格納する入れ物 test_x = np.array([]) # テスト用データを格納する入れ物 # 全体的なリストを入れる入れ物(教師データと回答データ) tmp_list_x = [] # train_x に入る要素を格納する入れ物 tmp_list_y = [] # train_y に入る要素を格納する入れ物 tmp_list_tx = [] # tmp_list_tx に入る要素を格納する入れ物 # CSVデータから配列を作成する際に何回ループさせるかを判定 # 一番最後まで行ってしまったら、教師データの回答データを作成できないので一歩手前で止めておく loop_cnt = len(ary_hits) - 1 # 何回目に外側のループを抜けるのかを設定 # さらに1を引くことで、最後のデータを教師データの回答データとして扱うために1を引いている exit_num = len(ary_hits) - summary_num #----------------------------------------- for i in range(loop_cnt): if i == exit_num: # 調査対象データを作成する # 第n~n+l回をひとまとめにした入れ物 tmp_train_x_list = [] for j in range(i, i + summary_num): tmp_train_x_list.append(int(ary_hits[j][0])) tmp_list_tx.append(tmp_train_x_list) break # 第n~n+l回をひとまとめにした入れ物 tmp_train_x_list = [] for j in range(i, i + summary_num): tmp_train_x_list.append(int(ary_hits[j][0])) tmp_list_x.append(tmp_train_x_list) tmp_list_y.append([int(ary_hits[i + summary_num][0])]) # ★★★★ # tmp_list_xには、[[10,20,30], [20,30,40], [30, 40, 50], [40, 50, 60]] # のような形のデータが入ります。 # 各カラムに3個の数字が入っているのはsummary_num =3 と指定しているためです。 # test_xには、[[50, 60, 70]]が入ります。 # こちらもsummary_num =3 としているため3個になります。 # 実際に動作させたときは、summary_num =300や500などで動作させています。 # # tmp_list_yには、tmp_list_xに対するラベルとして[[40], [50], [60], [70]]が入ります。 # リストで作成してから、np.arrayに変換し、さらに教師データ及び、テストデータはfloat型にする x = np.array(tmp_list_x).astype('float32') # 教師データ y = np.array(tmp_list_y) # 教師データに対応するラベル x_input = np.array(tmp_list_tx).astype('float32') # 確認用のテストデータ # 標準化(?)する # CSVの予測したいデータ(第三カラム)は、0~99,999までの数字が入っているので # 99999で割ることにより、0~1の間に収まるようにした # 色々なサイトを見たところ、-1 ~ 1の間に収めるべきだとあったので99999で割る対応をした x /= 99999 x_input /= 99999 #----------------------- # 行列のフォーマット変更。 x = x.reshape((x.shape[0], x.shape[1], 1)) y = y.reshape((y.shape[0], y.shape[1], 1)) #----------------------- # modelを作成 m = Sequential() m.add(LSTM(4068, input_shape=(x.shape[1], x.shape[2]))) # 4068にしたのは、validation_split=0.2とした時にトレーニングデータ数が4068となったため設定 m.add(Activation('relu')) m.add(Dropout(0.25)) m.add(RepeatVector(y.shape[1])) m.add(LSTM(2, activation='relu', return_sequences=True)) m.add(TimeDistributed(Dense(1))) m.compile( optimizer=Adam(), loss = 'mean_squared_logarithmic_error', metrics = ['accuracy']) # 過学習を防止 early_stopping = EarlyStopping(monitor='val_loss', mode='auto', patience=20) # 学習開始 history = m.fit(x, y, batch_size=36, epochs=10000, validation_split=0.2, callbacks=[early_stopping]) #------------------- # テストデータの行列のフォーマット変換 x_input = x_input.reshape((x_input.shape[0], x_input.shape[1], 1)) # 実際に評価を行う result = m.predict(x_input) display(result ) def plot_history(history): # 精度の履歴をプロット plt.plot(history.history['acc']) plt.plot(history.history['val_acc']) plt.title('model accuracy') plt.xlabel('epoch') plt.ylabel('accuracy') plt.legend(['acc', 'val_acc'], loc='upper right') plt.show() # 損失の履歴をプロット plt.plot(history.history['loss']) plt.plot(history.history['val_loss']) plt.title('model loss') plt.xlabel('epoch') plt.ylabel('loss') plt.legend(['loss', 'val_loss'], loc='upper right') plt.show() # 学習履歴をプロット plot_history(history)

説明として…
サンプルの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]]
が入ります。
(こちらも「標準化」、「行列のフォーマット変更」さる前のデータ構造になります。)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Keras

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

Python 3.x

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

機械学習

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