一.項目背景
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 np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
sns.set(style="darkgrid", font_scale=1.2)
plt.rcParams["font.family"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
warnings.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 LinearRegression
from 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] < lower] = lower
X_train[col][X_train[col] > upper] = upper
X_test[col][X_test[col] < lower] = lower
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)
#轉換為Series
s = 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"]
#訓練集數據轉換為DataFrame
X_train_eli=pd.DataFrame(data=X_train_eli, columns=X.columns[rfecv.support_])
#測試集數據轉換為DataFrame
X_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))
結論:離散化后模型效果進一步提升
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
環境
+關注
關注
0文章
125瀏覽量
16230 -
空氣質量
+關注
關注
0文章
37瀏覽量
8315
發布評論請先 登錄
相關推薦
零售數據分析之銷售預測一:我們圖的到底是什么?
一個目標,定一個參考,當實際與預測差異較大時,我們可以去尋找并分析原因;2、作為標準,結合庫存,作為補貨的參考。在剛才的實踐中,我們會發現預測的偏差率還是比較大的,那為什么呢?因為我們
發表于 09-08 14:23
微型空氣質量監測儀【恒美儀器HM-AQI】解決方案
微型空氣質量監測儀【恒美儀器HM-AQI】是根據十三五及各地大氣污染監測治理政策生產的新型空氣質量在線多參數監測系統,微型空氣質量監測儀【恒美儀器HM-AQI】嚴格按照國家標準對四氣(CO、SO2、NO
發表于 05-19 10:20
?715次閱讀
MAX6921AQI+ PMIC - 顯示驅動器
電子發燒友網為你提供Maxim(Maxim)MAX6921AQI+相關產品參數、數據手冊,更有MAX6921AQI+的引腳圖、接線圖、封裝手冊、中文資料、英文資料,MAX6921AQI+真值表,MAX6921
發表于 02-10 20:04
MAX6921AQI+T PMIC - 顯示驅動器
電子發燒友網為你提供Maxim(Maxim)MAX6921AQI+T相關產品參數、數據手冊,更有MAX6921AQI+T的引腳圖、接線圖、封裝手冊、中文資料、英文資料,MAX6921AQI+T真值表,MAX6921
發表于 02-10 20:14
如何改善AQI空氣質量監測站的狀況-歐森杰
隨著大氣污染的日益嚴重,AQI空氣質量監測站的狀況也日趨惡化。本文將從硬件、軟件、人員等多個角度,給出具體的建議,改善AQI空氣質量監測站的狀況。 一、硬件方面 1.1、AQI空氣質量監測站的設備
預測分析介紹及行業應用案例
汽車制造商 1、預測需求和預測供應商績效 問題:一家汽車制造商希望預測需求、優化庫存水平并預測供應商績效。 目標:提高效率并改進供應鏈管理。 解決方案:通過
AQI空氣質量監測站的重要性-歐森杰
隨著交通工具的發展,工業化的進步,空氣污染問題日益突出,因此,AQI空氣質量監測站的重要性也不容忽視。 一、AQI空氣質量監測站的定義 AQI空氣質量監測站是指建立在城市或者大中城市等地區,用于定期
AQI空氣質量監測站——保護空氣質量的重要一環
空氣污染,是當今社會最嚴重的環境問題之一,也是人們最關心的環境問題。為了保護空氣質量,AQI空氣質量監測站至關重要。 一、AQI空氣質量監測站的定義 AQI(Air Quality Index
電磁軌跡預測分析系統
智慧華盛恒輝電磁軌跡預測分析系統是一個專門用于預測和分析電磁運動軌跡的系統。該系統結合了電磁學、運動學、數據分析以及可能的人工智能或機器學習
電磁軌跡預測分析系統設計方案
智慧華盛恒輝電磁軌跡預測分析系統的設計方案是一個綜合性的項目,它結合了電磁學、運動學、數據分析以及可能的人工智能或機器學習技術,以實現對電磁運動軌跡的精確預測和深入
評論