数据介绍
? ? ? ? 数据是是一个单列数据,只保留六个数据作为测试集,采用单步预测,一个预测一个,数据集部分如下所示
data1=pd.read_csv('Dinghang.csv', usecols=[1]) #读取第二列数据
dataset = data1.values
dataset = dataset.astype('float32')
?LSTM模型介绍
LSTM的介绍
#数据标准化
scaler=sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)) #将数据缩放至(0,1),以供使用
scaler_data=scaler.fit_transform(dataset)
?比较拉跨的分隔数据
#划分数据集,多少作为训练集,所少作为测试集
train=scaler_data[0:138] #训练集
test=scaler_data[138:144] #测试集
print(len(train),len(test))
分隔好数据后要对数据进行构造,使其能够在模型中使用
f creat_data(data): #将数据构造成两列
dataX=[]
dataY=[]
for i in range(len(data)-2): #这里的look_step是1,预测一步,再减一是为了避免出现bug
a=data[i:i+1,0]
dataX.append(a)
dataY.append(data[i+1,0])
return np.array(dataX),np.array(dataY)
trainX,trainY=creat_data(train)
testX,testY=creat_data(test)
trainX,testX是大矩阵中套了好多小矩阵?
一般情况下构造的数据为[测试样本,时间步长,预测],[sample,times_step,features]
即训练的样本,look_steps,滑动窗口的大小,要预测的数据个数
trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1]))
testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1]))
model=Sequential()
model.add(LSTM(4, input_shape=(1, 1))) #input_shape(time_step,预测个数)
model.add(Dense(1))
model.compile(loss='MAE', optimizer='adam') #使用MAE评价,优化算法
model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=0) #batch_size定义每次训练的批量数(整数型),verbose=2为每个epoch输出一行记录
#对数据预测
trainPredict = model.predict(trainX)
testPredict = model.predict(testX)
?对数据进行反向归一化处理,并以mae作为评价指标,评估预测模型。
#反转预测
trainPredict = scaler.inverse_transform(trainPredict) #将标准化的数据转换为原始的数据
#trainY = scaler.inverse_transform([trainY])
testPredict = scaler.inverse_transform(testPredict)
testY = scaler.inverse_transform([testY])
testScore=mean_absolute_error(testY[0], testPredict[:,0])
# mae_test=np.sum(np.absolute(testPredict-testY))/4
print(testScore)
?
|