2020年6月9日 星期二

[tf.keras]利用LSTM預測泵傳感器剩餘壽命(四)—驗證

在上一章節我們訓練完成了模型檔,並儲存為LSTM_result.h5的檔案,現在,我們在資料檔的同一個資料夾建立名為lstm_verification.py的檔案,並使用程式碼編輯器開啟它。

驗證前將引入以下套件:
import pandas as pd
import numpy as np
from tensorflow.keras.models import load_model

import copy

利用pandas讀取上一章節建立的正規化前資料。
valueList= pd.read_csv('./ValueList.csv')

利用pandas讀取一開始建立的訓練檔資料。
df2 = pd.read_csv('./test_sensor.csv')

利用drop移除不需要的欄位,並利用fillna將空白資料填滿0。
df2 = df2.drop(['timestamp','sensor_15','sensor_50','Unnamed: 0','machine_status'],axis=1)
df2 =df2.fillna(value=0)

建立正規化的函數,使用訓練時儲存的參數。
def normalize(train2):
    for i in train2:
        max11=valueList[i][0]
        min11=valueList[i][1]
        mean11=valueList[i][2]
        train2[i]= train2[i].apply(lambda x: (x - mean11) / (max11 - min11))
        train2[i][train2[i]>(max11 - mean11) / (max11 - min11)]=(max11 - mean11) / (max11 - min11)
        train2[i][train2[i]<(min11 - mean11) / (max11 - min11)]=(min11 - mean11) / (max11 - min11)

    return train2

建立反正規化函數,依然是使用訓練時儲存的參數。
def unnormalize(train):
  train2 = copy.deepcopy(train) 
  for i in range(len(train)):
      train2[i]=train[i]*(valueList['time_left'][0]-valueList['time_left'][1])+valueList['time_left'][2]

  return train2

資料的X刪除剩餘時間,而Y則是只保留剩餘時間。
def buildTrain(train):
  X_train, Y_train = [], []
  train2=train.drop(['time_left'],axis=1)
  #for i in range(train.shape[0]):
  X_train=np.array(train2.iloc[:][:]).tolist()
  Y_train=np.array(train.iloc[:]["time_left"]).tolist()
  return np.array(X_train), np.array(Y_train)

工具函數都訂好了之後,將資料除60再除24,能夠將分鐘換算成天,我們就以天為單位做驗證。
df2["time_left"]=df2["time_left"]/60/24

替驗證資料做正規化及上一章節提到過的動作。
test_norm =normalize(df2)
X_val, Y_val = buildTrain(test_norm)

X_val = X_val[:,np.newaxis]

載入訓練完成的模型。
model=load_model("LSTM_result.h5")

進行預測
prediction=model.predict(X_val)
count=0
prediction1=prediction
for i in range(prediction1.shape[0]):
    prediction1[i]=unnormalize(prediction[i])
Y_val1=unnormalize(Y_val)
for i in range(len(Y_val)):
    if prediction1[i][0][0]<=Y_val1[i]+0.5 and prediction1[i][0][0]>=Y_val1[i]-0.5:
        count=count+1
print(count/len(Y_val1))

最後驗證的準確度為:0.9955842595373986
意謂著,若以天為單位(正負誤差12小時),訓練集跟驗證集的準確度差不多,都有99%的準確度。

2 則留言:

有興趣或有疑問的歡迎提問與交流喔!!!