多變量LSTM預測模型(2)
前置教程:
LSTM數據預處理
# coding=utf-8
from pandas import read_csv
from pandas import DataFrame
from sklearn.preprocessing import MinMaxScaler
from pandas import concat
from sklearn.preprocessing import LabelEncoder
#轉換成有監督數據
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):#n_in,n_out相當於lag
n_vars = 1 if type(data) is list else data.shape[1]#變量個數
df = DataFrame(data)
print '帶轉換數據'
print df.head()
cols, names = list(), list()
#輸入序列(t-n. ... , t-1)
for i in range(n_in, 0, -1):
cols.append(df.shift(i))
print 'shift數據'
print cols[0][0:5]
names+=[('var%d(t-%d)'%(j+1,i)) for j in range(n_vars)]
print 'names數據'
print names[0:5]
#預測序列(t, t+1, ... , t+n)
for i in range(0, n_out):
cols.append(df.shift(-i))
if i==0:#t時刻
names+=[('var%d(t)'%(j+1)) for j in range(n_vars)]
else:
names+=[('var%d(t+%d)'%(j+1,i)) for j in range(n_vars)]
#拼接
agg = concat(cols, axis=1)
print '拼接'
print agg[0:5]
agg.columns = names;
#將空值NaN行刪除
if dropnan:
agg.dropna(inplace=True)
return agg
dataset = read_csv('data_set/air_pollution_new.csv', header=0, index_col=0)
values = dataset.values
print '原始數據'
print values[0:5]
#由於4列的風向是標籤,編碼成整數
encoder = LabelEncoder()#簡單來說 LabelEncoder 是對不連續的數字或者文本進行編號
values[:,4] = encoder.fit_transform(values[:,4])
print '標籤編碼'
print values[0:5]
#使所有數據是float類型
values = values.astype('float32')
#數據歸一化
scaler = MinMaxScaler(feature_range=(0,1))
scaled = scaler.fit_transform(values)
print '縮放'
print scaled[0:5]
#變成有監督
reframed = series_to_supervised(scaled, 1, 1)
print '有監督'
print reframed[0:5]
#刪除不預測的列
reframed.drop(reframed.columns[9:16], axis=1, inplace=True)
print '刪除不預測的列'
print(reframed.head())