@Author: fishfield
@email: [email protected]
如果你有任何疑问,请与我联系
大气空气质量日趋成为社会生产的关注重点,良好的空气质量更加有益于当下的社会生产活动。据相关调查研究表明,大气污染对人体的危害不仅仅在于通过呼吸空气直接危害人体,还对器官、皮肤的表面与其直接接触而造成附加危害,主要表现在呼吸道疾病与生理机能障,以及眼鼻等粘膜组织受到刺激而引起的其他疾病。此外大气污染物中扬尘PM2.5、落尘PM10等污染物的危害同样是多方面的,扬尘是导致雾霭的主要原因,会诱发人们疾病的发生,如癌症、肺病等。大气污染的治理与研究,长久以来一直是人类正常生存与发展的所需正视与不可避免的难题。
本文则记录了通过python爬虫爬取空气质量数据,并制作空气质量数据集。采用keras框架实验了LSTM和GRU对空气质量进行预测的实验步骤。
话不多说,上源码:https://gitee.com/fishfield/air-quality-predict.git
本文将采用python的爬虫技术,通过从天气后报网站(http://www.tianqihoubao.com)目前而言这个网站基本没反爬策略,数据准确度未知。
上代码:
# 导入爬虫需要的库
import requests
from bs4 import BeautifulSoup
import csv
# 设置头部信息,伪装为浏览器
headers = {"User-Agent":"Mozilla/5.0 (Linux; Android 4.1.1; Nexus 7 Build/JRO03D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19"}
city = ['shanghai','chongqing','beijing','hangzhou','chengdu','shenzhen']
years= ['2014','2015','2016','2017','2018','2019','2020','2021']
months= ['01','02','03','04','05','06','07','08','09','10','11','12']
prefix = "http://www.tianqihoubao.com/aqi/"
# 使用函数生成数百个个url链接,无需进行冗余的列举工作
def get_url(city_name):
url = []
url.append(prefix + city_name + '-201311.html')
url.append(prefix + city_name + '-201312.html')
for i in range(len(years)):
temp = prefix + city_name + '-' + years[i]
for j in range(len(months)):
url.append(temp + months[j] + '.html')
url.pop()
return url
url_cq = get_url('chongqing')
# 爬取数据,并储存为.csv文件
def crawler(urls,city):
header = 0
print(city)
for i in range(len(urls)):
print(urls[i])
print("month count:",i)
response = requests.get( urls[i] , headers=headers )
print("response status code:",response.status_code)
index = 0
soup = BeautifulSoup(response.content, 'lxml')
datas = soup.find('div', class_ = "api_month_list")
file_name = 'datas_'+city+'.csv'
csv_file = open(file_name, 'a', encoding="utf-8", newline='')
if header == 0:
csv.writer(csv_file).writerow(["date","AQI_index","AQI_rank","PM2.5","PM10","SO2","NO2","CO","O3"])
header +=1
for data in datas.find_all("tr"):
index += 1
if index == 1:
continue
all_td = data.find_all('td')
csv.writer(csv_file).writerow([all_td[0].text,all_td[2].text,all_td[3].text,all_td[4].text,all_td[5].text,all_td[6].text,all_td[7].text,all_td[8].text,all_td[9].text])
index += 1
#关闭
csv_file.close()
crawler(url_cq,'chongqing')
通过python爬虫获取来自于重庆2016年1月1日至2022年2月共计2000条日均空气质量AQI和六类大气主要污染物的浓度信息,如下图所示。
由于数据往往可能会出现某些现象,导致数据丢失和数据脏乱。同时会导致数据集部分数据值出现缺失和异常,若数据集数据过于混乱或异常,将会极大程度上影响模型的拟合及预测性能。
这里采用了标准分数归一化Z-Score方法来处理原始数据,通过将原始数据正态化处理来得到归一化数据。标准分数归一化Z-Score可以将原数据通过其均值和标准差处理为一个标准正太分布:
大气空气质量六类主要污染物以其来源复杂、形成影响因素杂乱等原因,不适宜采用Pearson相关系数与Kendall相关系数。故本次研究中采用Spearman相关系数来探寻空气质量指数AQI、综合污染相对系数CPRC同六类主要污染物因子的相关性,其结果如图所示。
从上图所呈现的相关系数来看,空气质量指数AQI与综合污染相对系数CPRC同污染因子PM2.5、PM10的高度正相关。同污染因子O3都表现出低或负相关性,其是因为O3在重庆本地空气质量分指数一般表现较好,在近地面浓度较低,故对空气质量影响较小。整体而言空气质量指数和综合污染相对系数同各污染物之间的相关度是相似的。综合污染相对系数对六类主要污染物的相关度比空气质量指数略高,且同各污染物之间相关度更为相近。
在本次研究中,为研究模型的性能优劣并对其对预测能力的拟合程度有良好的反映能力,我们采用平均绝对百分比误差(MAPE)、一致性指数(IA)及R2指数来作为模型评价标准,以上三种指标的计算公式如式所示。
如式中,N代表整个数据集中数据个数,代表第i天空气质量评价指标的真实数值,而代表第i天空气质量评价指标的预测数值。其中式4.2-4.3中代表该整个数据集中空气质量评价指标的平均值。式4.1-4.2中平均绝对百分比误差MAPE主要是用于评价模型预测值同实际值之间的偏差度,其值越小代表预测误差越小,而一致性指数IA同R2指数用于评价模型预测值同实际值之间的拟合程度,一致性指数和R2指数最高为1,其值趋于1越近,代表模型预测值和实际值之间的拟合程度越高。
空气质量数据集往往采用的为具有时间相关性的时间序列数据,所以需可以通过滑动窗口处理将该数据信息处理为深度学习所需要的监督学习样本[29]。首先确定单个样本时间序列周期为T,提供时间τ与时间周期T之间的关系式为R(τ)。在R(τ)中包含了由[τ-T,τ]范围内的数据信息,具体划分方式如图所示。
如图所示,将每个时间周期长度T的数据作为一个样本,以该样本中最后一天的空气质量指数或综合污染相对系数作为该样本的标签,以此类推构建整个样本集。
本次研究中采用交叉验证以期提高模型的泛化能力并降低模型过拟合的风险。故将经滑动窗口处理的整体数据集中80%作为模型训练集,10%作为模型验证集及10%作为模型的测试集。空气质量指数、综合污染系数及六类主要大气污染物浓度部分时间序列数据如图所示
合理的模型超参数选择可以更好的反映模型的效果,但随着深度学习领域模型越发复杂,其训练的难度也随之提高且超参数的搜索空间也随之不断扩大,因此超参数的选择又是十分困难的。超参数的选择以其经验性、偶然性在大多情况下没有明显的规律[30],目前最常用的启发式超参数调优方法有网格搜索(Grid Search,GS)、基于贝叶斯优化、人工经验设置及随机搜索等。
其中,网格搜索通过对每个超参数选取具有典型特征的区间及值,将其组合划分为网格,再对网格遍历初步选择若干较优参数。再基于该较优参数网格点附近,进一步进行更加精细的超参数选择二次遍历。通过进行二次网格搜索方法在一定程度上避免了所存在的局部最优问题,通过逐步选取理想的超参数,最终使模型避免较大误差并呈现出更优的性能。本次研究中,基于网格搜索对模型超参数在一定范围内进行选择,并通过模型在测试集上评价指标的优劣,确定了部分模型超参数如表所示。
LSTM长短期记忆模型的训练过程中(这里单单以r2指标为例,其他结果见源码)
最终在测试集上的评价结果为
可视化预测结果——拟合效果图
GRU门控循环单元结果展示
最终在测试集上的评价结果为
可视化预测结果——拟合效果图
上述代码整体为三重指标的网格搜索调参,中间采用了早停的策略来避免模型过拟合。设置如下:
本文基于重庆市整体的空气质量数据进行模型构建与预测。但部分依旧存在一些值得改善及研究之处。首先,数据的抓取可以从日均浓度信息细分至时均浓度信息,采用更短时间的数据信息,更有利于研究大气污染物浓度短期变化的相关依赖性。其次,数据的选取依旧可以采取多站点的空气质量数据信息,通过多站点多源数据信息,采用图卷积及多尺度卷积网络研究多站点间对城市整体空气质量的影响。
如果你有任何疑问,欢迎咨询。本人能力有限,欢迎各位指正。随手点赞,祝你学途一帆风顺。