引言:
近些年来,“预测”一词在各个领域被频繁提及,所谓预测,实际上就是根据历史规律,推测未来结果。在科学技术发展有限的过去,预测主要是利用经验去推测未来,随着社会的发展,对预测的客观性和准确性提出了更高的要求,简单的经验推理已无法满足社会的需求。近几十年来,随着人工智能技术的发展,出现了新型的预测方法,人工神经网络预测技术正是其中佼佼者。人工神经网络预测技术一经面世就展现了它相比传统预测方法的优势:精度高、速度快,随着人工神经网络预测技术研究的深入,逐渐发展出性能更优的复杂网络,如 BP、CP 和 ART 网络等。
目前最常用的是 BP 神经网络,由于它结构简单、易于使用,被广泛应用于天气预报、证券投资市场等领域。但是由于 BP 神经网络不能很好的解决时间序列问题,为此发展出了循环神经网络(RNN),但是经过使用发现 RNN 容易出现“梯度消失”和“梯度爆炸”问题,为了解决这类问题,基于人脑的遗忘机制,Sepp Hochreiter 提出了 LSTM 神经网络。
LSTM 继承了大部分 RNN 的优点,同时解决了“梯度消失”和“梯度爆炸”问题,它更真实地表征或模拟了人类行为、逻辑发展和神经组织的认知过程。LSTM 非常适合处理与时间序列高度相关的问题,在长周期时间依赖问题上的潜力无穷。得益于 LSTM 的各类优点,应用 LSTM 模型对具有时序性的事物进行预测具有实际意义。
故今天我们将使用keras搭建LSTM实现多元参数进行时序数据的预测,应用于农业健康状况预测,模型200轮拟合效果如下:
01
LSTM 算法介绍
长短期记忆(LSTM)神经网络是在循环神经网络(RNN)的基础上添加各种“门”控制,实现对数据的记忆功能,以此来解决长时间依赖问题。LSTM 也被称作特殊的 RNN,现在被广泛的使用在文本生成、语音识别、时间序列预测等方面。2014 年以来,LSTM 已经成为非常热点的研究模型,得到大量的关注和研究。国内外学者利用 LSTM 模型进行预测应用研究已经取得了一系列的成果,Alahi等人提出了一种可以学习人类运动并预测未来轨迹的 LSTM 模型,将此模型应用于公共数据集上,预测结果优于当时最先进的方法;Ma等人首次将 LSTM 模型运用于交通预测中,为了验证 LSTM 神经网络的有效性,基于北京市两个微波探测器采集的数据进行试验,通过与传统的 RNN 模型比较,发现 LSTM 神经网络在预测精度和稳定性方面都达到了最好的效果;Zhang等人基于 LSTM 提出了一种改进的时间特征提取算法,简称 Read-first LSTM 或RLSTM,作者将该模型应用于空气污染物预测上,实验表明该模型预测效果良好;陈卓等人提出一种基于 LSTM 的电力负荷预测方法,使用这该方法对某地电力负荷值进行预测,将预测结果与传统模型对比,最终证明 LSTM 模型的误差更低,预测效果更好;王旭东等人针对短期家庭电力数据随机性强,数据维度低等问题,提出了一种基于 LSTM 的单变量短期家庭电力需求预测模型,实验表明该模型能够准确地预测家庭电力需求趋势,且优于传统的循环神经网络。
1.1 LSTM原理
LSTM 可以根据时间序列对输入的信息进行分析。换句话说,我们利用前馈神经网络时,它会认为当前时刻输入的信息与下一时刻输入的内容没有关系;在利用RNN 神经网络时,因为 RNN 存在着梯度消失、梯度爆炸和无法有效处理长周期数据依赖问题的特点,所以前辈们提出新的算法—LSTM 算法。使用 LSTM 可以有目的地传递和表达长时间序列中的内容并且避免引起历史信息的丢失。
与 RNN 比较,LSTM 多了三个门,它利用三个门对保留的信息进行控制,确保保留的信息是算法需要的,对于垃圾信息则拒之门外。这三个门分别是输入门、遗忘门、输出门。三个门作用不同,相互合作,达到最佳效果。
02
植物健康状况预测
农业是我国国民经济的重要支柱,传统的农业由于降雨和气候等因素的制约,会对其产量和品质造成一定的影响,减少了农业产业的经济利益。为实现经济利益最大化,提高农作物产量,发展智能化农业等问题,需从本质上解决,即对作物的生理信息的传输进行研究。而作为智能农业的未来发展,其必然需要数据预测的部分,故本项目将针对农业农作物影响参数温度、湿度等因素的历史数据进行未来状况的预测。
这里程序的设计分为以下几个步骤,分别为数据集预处理、LSTM模型训练和模型测试。
2.1 农作物历史数据预处理
这里我们将系统记录的农作物历史影响因素的数值转为csv文件,并将其转为英文,防止中文乱码的发生。
通过read_csv函数读取csv文件后,获取其中每列数据作为每个元素。然后对读取的数据进行MinmaxScaler标准化,目的是为了加速模型的收敛,同时还有可能提高模型精度。然后把数据转为监督学习数据。代码如下:
dataset = read_csv('sate.csv', header=0, index_col=0)
values = dataset.values
encoder = LabelEncoder()
values = values.astype('float32')
scaler = MinMaxScaler(feature_range=(0, 1))
scaled = scaler.fit_transform(values)
reframed = series_to_supervised(scaled, 1, 1)
print(scaled.shape)
values = reframed.values
n_train_hours = 365 * 24
train = values[:n_train_hours, :]
test = values[n_train_hours:, :]
train_X, train_y = train[:, :-1], train[:, -1]
test_X, test_y = test[:, :-1], test[:, -1]
train_X = train_X.reshape((train_X.shape[0], 1, train_X.shape[1]))
test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
n_vars = 1 if type(data) is list else data.shape[1]
df = DataFrame(data)
cols, names = list(), list()
for i in range(n_in, 0, -1):
cols.append(df.shift(i))
names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
for i in range(0, n_out):
cols.append(df.shift(-i))
if i == 0:
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)
agg.columns = names
if dropnan:
agg=agg.fillna(0)
return agg
2.2 LSTM模型训练
这里设置LSTM层神经元50,设置损失为MAE平均绝对误差,优化器为adam优化器,迭代次数为200轮,batch_size为72,随机打乱数据进行训练,并最后进行模型的保存,并将其损失图绘制。代码如下:
model = Sequential()
model.add(LSTM(50, input_shape=(train_X.shape[1], train_X.shape[2])))
model.add(Dense(1))
model.compile(los='mae', optimizer='adam')
history = model.fit(train_X, train_y, epochs=200, batch_size=72, validation_data=(train_X, train_y), verbose=2, shuffle=False)
pyplot.plot(history.history['loss'], label='train')
pyplot.plot(history.history['val_loss'], label='test')
pyplot.legend()
pyplot.show()
model.save("model.h5")
2.3 模型测试
从设置的农业系统中获取环境参数后,将参数输入模型,即可实现预测。代码如下:
while True:
elements=['health','temperature','humidity','light_intensity','soil_temperature','soil_humidity','co2','rain']
i=0
if i%1==0:
input_list=spider()
input_data = DataFrame([input_list], columns=elements)
dataset=dataset.append(input_data)
values = dataset.values
encoder = LabelEncoder()
values = values.astype('float32')
scaler = MinMaxScaler(feature_range=(0, 1))
scaled = scaler.fit_transform(values)
reframed = series_to_supervised(scaled, 1, 1)
values = reframed.values
test_X= values[:, :-1]
test_X = test_X.reshape((test_X.shape[0], 1, test_X.shape[1]))
y_predict = model.predict(np.array([test_X[-1]]))
print(input_data.values[0][1:])
print("预测污染程度为:"+str(y_predict[0][0]))
完整代码:
链接:
https://pan.baidu.com/s/1tpT0_K-csVX8fRYd-PPJCg
提取码:1rb8