驗證前將引入以下套件:
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%的準確度。
你的解法,看來是可行的!! Good Job!!!
回覆刪除Thank you teacher.
刪除