赞
踩
采用爬虫爬取了北京这个城市的空气质量指数日历史数据(爬取时间段为2018年1月1日至今天的前一天2020年4月19日),采用两年的历史数据作为训练集,2020年的数据作为测试集,最后采用2020年4月6日-4月19日的14天数据作为历史数据,去预测2020年4月20-27日的空气质量指数AQI。
输出结果已经打印出来,大家可以自行去查阅未来几天的AQI值进行比对。如果不准求不要骂我,不能怪我,我只是合理对模型进行了输入输出,不参与预测。
目录
AQI(Air Quality Index,空气质量指数)是报告每日空气质量的参数。
AQI是环境空气质量指数的缩写,是2012年3月国家发布的新空气质量评价标准,污染物监测为6项:二氧化硫、二氧化氮、PM10、PM2.5、一氧化碳和臭氧,数据每小时更新一次。AQI将这6项污染物用统一的评价标准呈现。
获取的数据为2018年1月1日至2020年4月19日,数据结构如图所示:
输入特征维度为:grade,PM25,PM10,SO2,CO,NO2,O3_8h;输出标签特征为:AQI;但是其中grade列为char形式的描述,因此,对其中的四个等级进行替换为数值特征。然后,对所有数据进行标准化(或者说归一化)处理,其中2018年-2019年的历史数据作为训练集,2020年数据作为测试集。(其中2018年12月3日,5月5日,5月26日,28日等数据为无,我们删除了)
开始模型训练之前,无外乎要对LSTM模型构建时间序列的输入,本次尝试采用滑动窗口进行构建输入,核心代码如下:
- def mult_data(dataset, target, start_index, end_index, history_size,target_size, step):
- data = []
- labels = []
- start_index = start_index + history_size
- if end_index is None:
- end_index = len(dataset) - target_size
- for i in range(start_index, end_index):
- indices = range(i-history_size, i, step)
- data.append(dataset[indices])
- labels.append(target[i:i+target_size])
- return np.array(data), np.array(labels)#返回输入数据特征和标签
LSTM模型核心代码如下:
- multi_model = tf.keras.models.Sequential()
- multi_model.add(tf.keras.layers.LSTM(32,return_sequences=True,input_shape=x_train_multi.shape[-2:]))
- multi_model.add(tf.keras.layers.LSTM(16, activation='relu'))
- multi_model.add(tf.keras.layers.Dense(output, activation='linear'))
- multi_model.compile(optimizer=tf.keras.optimizers.RMSprop(clipvalue=1.0), loss='mae')
通过迭代训练20次左右,观察损失函数图像如下图所示,大约在10次左右loss在测试集上已经降低最优了。于是改动了迭代次数及增加dropout防止过拟合,经过一系列调整之后,便可测试该模型的预测能力。
按理说对预测结果值不能进行标准化(或者说归一化处理,因为均值和标准差只能使用训练数据来计算,但是为了能够显示输出,在这里不必那么纠结于细节)。对模型的输入为最近14天的数据(2020年4月6日-4月19日),输出为未来7天的预测结果。下图左边为输入数据展示,右边为模型输出展示,其中负号代表输入历史AQI数据值,输出的蓝色点为未来7天的AQI值;
为了方便大家看清,我在pycharm的输出面板打出了预测值,大家可以查阅。因为神经网络输出值不稳定,我找了几组比较好的结果展示出来,大家可以自行根据未来7天的北京AQI情况进行对比检验这个已经训练的LSTM模型的预测能力。查阅北京AQI数据的网站为:https://www.aqistudy.cn/historydata/daydata.php?city=北京
迭代10次的输出:
迭代15次的输出:
通过预测出的结果发现,训练好的神经网络做线性预测还是很不稳定的,当然原因有很多,最明显的就是我对预测值结果进行了反归一化进行输出。但是,这个程序确实实现了未来7天AQI值的预测问题。在未来几天里,我将根据真实值与预测值之间的误差再次完善该方法。以求能够预测个大概趋势。如果大家有更好的解决思路,可以加Q525894654进行交流讨论。
接下来的几天便是等待验证结果的几天了。心情复杂且激动.....
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。