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

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

新規登録して質問してみよう
ただいま回答率
85.35%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

機械学習

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

Python

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

Q&A

解決済

1回答

1992閲覧

multivariate LSTMを行ったが、正しいかどうか判断ができません。

multinguish

総合スコア6

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/07/31 09:11

編集2021/07/31 10:46

前提・実現したいこと

非エンジニア、独学のpython初心者です。
multivariate LSTMにより血流量を予測する試みを行なっています。
血流量の他に血圧(収縮期、平均、拡張期)や脈拍、呼吸数を用いています。
1分おきの時系列データを収集し、前半8割の値から後半2割の血流量を予測しました。
学習、グラフ作成まで行い、予測精度をRMSEで計算しました。

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

グラフを見るとRMSEがここまで低いようには思えません。
精度が正しいかどうか、正しくない場合コードのどの部分に問題があるかが判断できません。
もしわかる方がいらっしゃいましたらご指導いただければ幸いです。

該当のソースコード

python

1import numpy as np 2import pandas as pd 3import matplotlib.pyplot as plt 4import time 5from keras.models import Sequential 6from keras.layers import Dense, LSTM 7from keras import metrics 8from sklearn.preprocessing import MinMaxScaler 9from sklearn.model_selection import train_test_split 10 11#データの取り込み 12df = pd.read_csv('1.18min.csv') 13df['time'] = pd.to_datetime(df['time']) 14df

表

flow = np.array([df.iloc[:,1]]) sBP = np.array([df.iloc[:,2]]) mBP = np.array([df.iloc[:,3]]) dBP = np.array([df.iloc[:,4]]) HR = np.array([df.iloc[:,5]]) RR = np.array([df.iloc[:,7]]) #データをプロット plt.figure(figsize = (10,6)) f, = plt.plot(flow[0, :]) s, = plt.plot(sBP[0, :]) m, = plt.plot(mBP[0, :]) d, = plt.plot(dBP[0, :]) h, = plt.plot(HR[0, :]) r, = plt.plot(RR[0, :]) plt.legend([f,s,m,d,h,r], ["flow", "sBP", "mBP", "dBP", "HR", "RR"]) plt.show(block=False)

全データ

#血流量のみプロット plt.figure(figsize = (10,6)) f, = plt.plot(flow[0, :]) plt.legend([f], ["flow"]) plt.show(block=False)

血流量

#Xは血流以外、Yが血流 X = np.concatenate([sBP,mBP,dBP,HR,RR],axis=0) X = np.transpose(X) Y = flow Y = Y.reshape(-1,1) scaler = MinMaxScaler() scaler.fit(X) X = scaler.transform(X) scaler1 = MinMaxScaler() scaler1.fit(Y) Y = scaler1.transform(Y) X = np.reshape(X,(X.shape[0],1,X.shape[1])) #前半8割からモデル作成 X_train = X[:848,:,:] X_test = X[848:,:,:] Y_train = Y[:848,:] Y_test = Y[848:,:] model = Sequential() model.add(LSTM(100,activation='tanh',input_shape=(1,5),recurrent_activation= 'hard_sigmoid')) model.add(Dense(1)) #学習 (パラメーターチューニング未) model.compile(loss='mean_squared_error',optimizer='rmsprop',metrics = [metrics.mae]) model.fit(X_train,Y_train,epochs=200,batch_size= 1,verbose= 2) #実測値と予測値をプロット Predict= model.predict(X_test,verbose =1) plt.figure(figsize=(15,10)) plt.plot(Y_test,label = 'Test') plt.plot(Predict, linestyle="dashed", label = 'Prediction') plt.legend(loc='best') plt.show()

実測値と予測値

Y_train = scaler1.inverse_transform(Y_train) Y_train = pd.DataFrame(Y_train) Y_train.index = pd.to_datetime(df.iloc[:848,0]) Y_test = scaler1.inverse_transform(Y_test) Y_test = pd.DataFrame(Y_test) Y_test.index = pd.to_datetime(df.iloc[848:,0]) Predict = model.predict(X_test) Predict = scaler1.inverse_transform(Predict) Predict = pd.DataFrame(Predict) Predict.index=pd.to_datetime(df.iloc[848:,0]) plt.figure(figsize=(10,6)) plt.plot(Y_train,label = 'Train') plt.plot(Y_test,label = 'Test') plt.plot(Predict, linestyle="dashed", label = 'Prediction') plt.legend(loc='best') plt.show()

crossvalidation結果

#誤差計算 import math from sklearn.metrics import mean_squared_error testScore_RMSE = np.sqrt(mean_squared_error(Y_test, Predict)) print('Test Score: %.5f RMSE' % (testScore_RMSE))

Test Score: 4.54193 RMSE

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

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

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

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

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

guest

回答1

0

ベストアンサー

データの前処理が、通常のリグレッションモデルの流儀になってしまっています。LSTMの流儀になっていません。今回の場合、「多変量LSTM」というキーワードでググると、参考になる記事がいろいろありますので、確認ください。

参考例: TensorFlow 2.x での多変量LSTMとデータの前処理

質問者様の前処理との相違点

  • 参考例では、データは [サンプル数, ルックバック数, 変数数] という形式にしています。試していませんが、質問者様の形式だと、ルックバック=1、すなわち1単位時刻前のデータだけから予測しようとしているようです。
  • 参考例では、目的変数(の過去情報)も、説明変数の1つとして活用しています。質問者様の形式だと、肝心の目的変数の過去情報は、一切予測に使わないことになります。

上記の2つがあわさって、参考例の方法をとれば、「少し幅を持った過去の情報から未来を予測する」「求めたい血流量(の過去データ)も予測に活用する」という動作になりますので、予測精度が高まることが期待できます。

投稿2021/08/10 13:00

編集2021/08/10 13:12
toast-uz

総合スコア3266

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

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

multinguish

2021/08/13 05:43 編集

わかりやすい回答まことにありがとうございます。 concatenateにflowを追加し、lookbackを含む前処理形式に変更しました。 lookback=25でpredictionがほぼ1期前と一致し、RMSEが0.087と向上しました。 症例を集めてこまかいパラメーターの最適化をしていこうかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問