AQI分析与预测-2

一.项目背景
aqi(air quality index)指空气质量指数,用来衡量空气清洁或者污染程度。值越小,表示空气质量越好。近年来因为环境问题,空气质量越来越受到人们重视。上篇文章[aqi分析与预测(一)](http://mp.weixin.qq.com/s?__biz=mzizodi4odm2ma==&mid=2247486525&idx=1&sn=a92d40e0d715f9ab63563b4e8b054a0d&chksm=e93ae0bade4d69ac57407216484cdbb6d7a8a812baef1c0e4ab0d5aeae0c7f0aff9fd274127b&scene=21#wechat_redirect)我们进行了初步分析,主要分析了空气质量最好/差城市和临海城市是否空气质量优于内陆城市这两个问题,本篇我们在之前基础上继续研究如下问题。1.空气质量受那些因素影响2.关于空气质量验证3.构建空气质量预测模型二.实现过程
1.空气质量受那些因素影响 》》指标:协方差和相关系数 》》图形:热力图import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snsimport warningssns.set(style=darkgrid, font_scale=1.2)plt.rcparams[font.family] = simheiplt.rcparams[axes.unicode_minus] = falsewarnings.filterwarnings(ignore)#读取文件data = pd.read_csv(data.csv)#查看数据data.head()
#kind:绘制图像的类型。可选值:#scatter:散点图(默认值)。#reg:带有回归线的散点图。#vars:显示哪些变量之间的两两关系,默认为显示所有变量。sns.pairplot(data, vars=[aqi, populationdensity, greencoveragerate])
#计算相关数据x = data[aqi]y = data[precipitation]#计算aqi与precipitation的协方差。a = (x - x.mean()) * (y - y.mean())#计算协方差cov = np.sum(a) / (len(a) - 1)print(协方差:, cov)
#计算aqi与precipitation的相关系数。corr = cov / np.sqrt(x.var() * y.var())print(相关系数:, corr)
#pandas封装了相关方法print(协方差:, x.cov(y))print(相关系数:, x.corr(y))
#初始化画布plt.figure(figsize=(15, 10))#绘制热力图ax = sns.heatmap(data.corr(), cmap=plt.cm.rdylgn, annot=true, fmt=.2f) 结论:降雨量越多,空气质量越好;维度越低,空气质量越好
2.关于空气质量验证 》》问题:全国所有城市的空气质量指数均值在71左右,请问此结论准确吗? 》》方法:假设检验该需求是验证样本均值是否等于总体均值,根据条件,我们可以使用单样本t检验,置信度为95%。#进行单样本t检验r = stats.ttest_1samp(data[aqi], 71)#输出检验统计量print(t值:, r.statistic)#输出p值print(p值:, r.pvalue)结论:我们可以看到p值是大于0.05的,y因此我们无法拒绝原假设,因此接受原假设
#计算均值mean = data[aqi].mean()#计算标准差std = data[aqi].std()#计算置信区间stats.t.interval(0.95, df=len(data) - 1, loc=mean, scale=std / np.sqrt(len(data)))结论:我们就计算出全国城市平均空气质量指数,95%的可能大致在70.63~80.04之间
3.构建空气质量预测模型 》》对于一些城市,如果能够已知降雨量,温度,经纬度等指标,我们是否能够预测该城市的空气质量指数呢?因此我们需要构建模型,预测新的数据。 》》过程:基模型构建,异常值处理后构建模型和特征选择后构建模型,将结果与基模型进行对比,看看是否进行优化。#进行类别转换data[coastal] = data[coastal].map({是: 1, 否: 0})#统计类别数目data[coastal].value_counts()
from sklearn.linear_model import linearregressionfrom sklearn.model_selection import train_test_split#city(城市名称)对预测毫无用处,删掉。x = data.drop([city,aqi], axis=1)#目标值y = data[aqi]#分离测试集和训练集x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)#构建基础线性回归模型lr = linearregression()#训练模型lr.fit(x_train, y_train)#输出训练集模型评分print(lr.score(x_train, y_train))#输出测试集模型评分print(lr.score(x_test, y_test))
#绘制图形观察#预测y值y_hat = lr.predict(x_test)#初始化画布plt.figure(figsize=(15, 5))#绘制真实值折线图plt.plot(y_test.values, -r, label=真实值, marker=o)#绘制预测值折线图plt.plot(y_hat, -g, label=预测值, marker=d)#设置图例plt.legend(loc=upper left)#设置标题plt.title(线性回归预测结果, fontsize=20)
# coastal是类别变量,映射为离散变量,不会有异常值。#遍历列for col in x.columns.drop(coastal): #对数值型数据进行判断 if pd.api.types.is_numeric_dtype(x_train[col]): #获取分位数 quartile = np.quantile(x_train[col], [0.25, 0.75]) #计算iqr iqr = quartile[1] - quartile[0] #计算正常数值下限 lower = quartile[0] - 1.5 * iqr #计算正常数值上限 upper = quartile[1] + 1.5 * iqr #用边界值进行填充异常值 x_train[col][x_train[col] upper] = upper x_test[col][x_test[col] upper] = upper#训练模型lr.fit(x_train, y_train)#去除异常值后评估模型效果print(lr.score(x_train, y_train))print(lr.score(x_test, y_test))结论:去除异常值后所构建模型效果相比之前有所改进
#对数据进行标准化处理,from sklearn.preprocessing import standardscaler#数据标准化s = standardscaler()#对训练集进行标准化x_train_scale = s.fit_transform(x_train)#对测试集进行标准化x_test_scale = s.transform(x_test)#对数据进行特征选择,目的是提高模型准确率和训练速度refcv方法 》》rfe(recursive feature elimination):递归特征消除,用来对特征进行重要性评级 》》cv(cross validation):交叉验证,通过交叉验证,选择最佳数量特征具体过程如下:rfe阶段: 1.初始特征集为所有可用特征 2.使用当前特征集进行建模,然后计算每个特征的重要性 3.删除最不重要的一个或者多个特征,更新特征集 4.跳到步骤2,直到完成所有特征集重要性评级cv阶段 1.根据ref阶段确定的特征重要性,依次选择不同数量特征 2.对选定的特征集进行交叉验证 3.确定平均分最高的特征数量,完成特征选择。from sklearn.feature_selection import rfecv#estimator:要操作的模型。#step:每次删除的变量数。#cv:使用的交叉验证折数。#n_jobs:并发的数量。#scoring: 评估的方式。rfecv = rfecv(estimator=lr, step=1, cv=5, n_jobs=-1, scoring=r2)rfecv.fit(x_train_scale, y_train)#返回经过选择之后,剩余的特征数量。print(rfecv.n_features_)#返回经过特征选择后,使用缩减特征训练后的模型。print(rfecv.estimator_)#返回每个特征的等级,数值越小,特征越重要。print(rfecv.ranking_)#返回布尔数组,用来表示特征是否被选择。print(rfecv.support_)#返回对应数量特征时,模型交叉验证的评分。print(rfecv.grid_scores_)
#绘制图形plt.plot(range(1, len(rfecv.grid_scores_) + 1), rfecv.grid_scores_, marker=o)#设置x轴标签plt.xlabel(特征数量)#设置y轴标签plt.ylabel(交叉验证$r^2$值)
print(剔除的变量:, x.columns.values[~rfecv.support_])#应用到训练集x_train_eli = rfecv.transform(x_train_scale)#应用到测试集x_test_eli = rfecv.transform(x_test_scale)#输出模型评分print(rfecv.estimator_.score(x_train_eli, y_train))print(rfecv.estimator_.score(x_test_eli, y_test))
#获取列名与对应的权重,构成一个元组,作为列表的元素。li = list(zip(x.columns.values[rfecv.support_], rfecv.estimator_.coef_))#根据权重的绝对值,对列表进行降序排列。li.sort(key=lambda x: abs(x[1]), reverse=true)#转换为seriess = pd.series(dict(li))#初始化画布plt.figure(figsize=(15, 5))#绘制柱状图ax = sns.barplot(y=s.index, x=s.values)for y, x in enumerate(s): #绘制标注 t = ax.text(x / 2, y, round(x, 3)) #设置居中对齐 t.set_ha(center)#显示图形plt.show()
from sklearn.preprocessing import kbinsdiscretizer#kbinsdiscretizer k个分箱的离散器。用于将数值(通常是连续变量)变量进行区间离散化操作。#n_bins:分箱(区间)的个数。#encode:离散化编码方式。分为:onehot,onehot-dense与ordinal。# onehot:使用独热编码,返回稀疏矩阵。# onehot-dense:使用独热编码,返回稠密矩阵。# ordinal:使用序数编码(0,1,2……)。#strategy:分箱的方式。分为:uniform,quantile,kmeans。#uniform:每个区间的长度范围大致相同。#quantile:每个区间包含的元素个数大致相同。#kmeans:使用一维kmeans方式进行分箱。#对数据进行分箱操作k=kbinsdiscretizer(n_bins=[4, 5, 10, 6], encode=onehot-dense, strategy=uniform)#定义离散化的特征。discretize=[longitude, temperature, precipitation, latitude]#训练集数据转换为dataframex_train_eli=pd.dataframe(data=x_train_eli, columns=x.columns[rfecv.support_])#测试集数据转换为dataframex_test_eli=pd.dataframe(data=x_test_eli, columns=x.columns[rfecv.support_])#应用到训练集r=k.fit_transform(x_train_eli[discretize])r=pd.dataframe(r, index=x_train_eli.index)#获取除离散化特征之外的其他特征。x_train_dis=x_train_eli.drop(discretize, axis=1)#将离散化后的特征与其他特征进行重新组合。x_train_dis=pd.concat([x_train_dis, r], axis=1)#对测试集进行同样的离散化操作。r=pd.dataframe(k.transform(x_test_eli[discretize]), index=x_test_eli.index)x_test_dis=x_test_eli.drop(discretize, axis=1)x_test_dis=pd.concat([x_test_dis, r], axis=1)#查看转换之后的格式。display(x_train_dis.head()
#训练模型lr.fit(x_train_dis, y_train)#去除异常值后评估模型效果print(lr.score(x_train_dis, y_train))print(lr.score(x_test_dis, y_test))结论:离散化后模型效果进一步提升

鱼缸水泵自动开停控制电路
恒温恒湿试验机设备特点_可程序恒温恒湿试验机设备特点
信实计划与vivo合作在印度推出700元的4G手机
苹果博通欲推翻11亿美元的WIFI专利案
日本科学家利用太赫兹等离子体技术,开发出对生物组织可视化装置
AQI分析与预测-2
压力变送器常用输出信号选择
Tina Linux Display开发指南
Intel 12代酷睿处理器亮点汇总
漫途房屋结构安全监测方案,守护城市建筑的安全底线
英特尔正与台积电和三星洽谈,将部分芯片生产外包
苹果可能采用联发科为主、英特尔为辅的基带方案
用CPLD实现FIR数字滤波器的设计
电池钢壳生产工艺流程
华为完成5G技术第三阶段SA基站功能测试
跑步机音乐播放语音芯片方案,WTV890-32N
热像仪成为了单兵高技术装备的首选
中小企业数字化模式创新研究报告
可穿戴设备中防水气压传感器的作用无处不在
Silicon Labs发布两款全新的Sub-GHz无线SoC