【RNN】IOT數據分析與使用RNN模型預測入門教學

Harden
9 min readMay 31, 2022

--

使用IOT Senser 所量測的數據,進行RNN模型訓練後預測,其中數據並不為都是正相關比率,此專案過程中會進行簡單的資料分析與視覺化,並且建立RNN模型,由於資料數量不多,純以入門教學與測試。

一 、 查看資料

分別讀取兩個csv資料,df1 中的 Voltage 為本專案最後要預測的變數欄位,df2 為環境變數也是要預測的 Features,為了達到良好預測的標準,其中進行資料處理。

二、資料處理

1.兩個檔案先做合併,並且刪除其他欄位

for i in range(df2.shape[1]):
x = df2.columns[i]
df1[x]=df2[x]
df1.drop(["Current","Power","ObsTime","Precp","UVI","Cloud Amount"],axis=1,inplace=True)

2. 數值處理,因為本身要做為 Feature 與 label 都是為數值型態,以邏輯來說,如果檔案中的某項數值為非數值,表示此項是錯誤的,必須從中刪除或者使用 numpy.nan 空值來補齊,才不會造成邏輯上的錯誤。

for k in range(df1.shape[1]):df1[df1.columns[k]] = pd.to_numeric(df1[df1.columns[k]],errors='coerce')

並且查看資料是否有空值存在,如果存在空值可以考慮使用 mean 替代或是刪除此row,對於資料較少時建議以 mean 替代。

df1.isnull().any()

觀看資料之後,敏感的你可以發現 hour 這個欄位,是與世界時間的小時一樣,以數值來說就是從 0–23 ,且可以考慮 hour 成為新的 index,將會對於資料的統計比較容易,所以在這邊可以先看每一筆 hour 所對應的資料出現頻率,此頻率可以知道資料偏多於哪一小時,進而考慮刪除資料比較少的部分,資料的差距才不會太大而影響整體資料的擬和。

from collections import Countercount_list = Counter(df1['hour'])

每一個小 0–23 所對應的計數,可以看到14,15 資料最多數量為7,而數量最小為 4 的其他 hour比較多,但從差距來看資料筆數 4 與 7 並不差太多,所以目前可以判定不用刪除多於離散太高的資料。

再利用相關係數看看,每一個欄位對應的相關性,主要從我們想知道的 Voltage 來比較,從上圖中可以知道對於 hour 和 RH 為負相關,在 Temperature 為正相關,可以知道從 Temperature 與 Voltage 比較有影響。

df_hmean =df1.groupby(['hour']).mean() #以 hour 組合做平均

有了平均之後可以視覺化,劃出每小時平均數值出來。

三、 RNN 模型建立

# 引入套件
from tensorflow.keras.layers import LSTM,SimpleRNN
from tensorflow.keras.models import Sequentialfrom tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D, ZeroPadding2D,BatchNormalization

RNN 最重要的資料處理步驟是使用先前的連續資料筆數去預測下一筆,例如step=4, 那將會從資料拿出第1,2,3,4筆資料進行預測,而預測出的值是第4筆的輸出,所以我們要創立 step 創造新的資料維度,以連續時間序列儲存於另一項陣列中。

import numpy# convert an array of values into a dataset matrixdef create_dataset(dataset, time_step):dataX1, dataX2,dataX3,dataY =[], [], [],[]for i in range(len(dataset)-time_step-1):a = dataset[i:(i+time_step), 0]   ###i=0, 0,1,2,3-----9b = dataset[i:(i+time_step), 2]c = dataset[i:(i+time_step), 3]#c = dataset[i:(i+time_step), 0]dataX1.append(a)dataX2.append(b)dataX3.append(c)dataY.append(dataset[i + time_step, 1])dataX=list(zip(dataX1,dataX2,dataX3))#,dataX3return numpy.array(dataX), numpy.array(dataY)

上個片段程式碼請依照資料的欄位做為參考。其中X是訓練資料 Y是答案。

# reshape into X=t,t+1,t+2,t+3 and Y=t+4time_step = 4X_train, y_train = create_dataset(train_data, time_step)#print(X_test.shape)X_test, y_test = create_dataset(test_data, time_step)#X_train =X_train.reshape(X_train.shape[0],X_train.shape[1])#X_test = X_test.reshape(X_test.shape[0],X_test.shape[1])# reshape input to be [samples, time steps, features] which is required for LSTMX_train =X_train.reshape(X_train.shape[0],X_train.shape[1] ,time_step)X_test = X_test.reshape(X_test.shape[0],X_test.shape[1] ,time_step)print(X_train.shape), print(y_train.shape)print(X_test.shape), print(y_test.shape)

這樣一來RNN模型將要輸入的資料已經完成了。可以建立RNN網路

# 固定亂數種子,使每次執行產生的亂數都一樣np.random.seed(1337)'''x=np.array(x)y=np.array(y)x=x.reshape(x.shape[0],x.shape[1],1)X_train,X_test,Y_train,Y_test = train_test_split(x,y,train_size=0.8)X_train -= X_train.mean(axis=0)X_train /= X_train.std(axis=0)X_test -= X_test.mean(axis=0)X_test /= X_test.std(axis=0)'''# 建立簡單的線性執行的模型model = Sequential()model.add(SimpleRNN(batch_input_shape=(None,3,4),input_shape=(3,4),units= 32,unroll=True,))model.add(Dropout(0.2))model.add(Dense(units=10))model.add(Dropout(0.2))model.add(Dense(units=10 ))model.add(Dense(units=1))model.compile(loss='mean_squared_error',optimizer='adam',metrics=['acc'])model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=1000,batch_size=8,verbose=1)

進行預測

# 預測(prediction)X = X_test#[0:10,:]predictions = model.predict(X)# get prediction result#print(predictions.T)#print(Y_test)#[0:10])for h in range(len(predictions)):print("pre: %s lab: %s"%(predictions[h],y_test[h]))

視覺化看預測結果

import matplotlib.pyplot as pltplt.plot(range(len(predictions)),predictions,color='red')plt.plot(range(len(predictions)),y_test[:len(predictions)],color='blue')

結論:由於資料筆數太過少,所以在RNN網路中沒辦法達到更好的預測結果,但此入門帶給大家一個觀念,先從資料分析來簡單的看過,在選擇特徵值之後考慮重要程度,在建立RNN模型預測。

--

--

Harden
Harden

Written by Harden

I am Harden. A university student. major:EE Study: AI and IOT and soft engineering

No responses yet