前提・実現したいこと
非エンジニア、独学の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()
#誤差計算 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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/08/13 05:43 編集