李宏毅 線性迴歸預測PM2.5

 

做業說明

  給定訓練集train.csv,要求根據前9個小時的空氣監測狀況預測第10個小時的PM2.5含量。git

訓練集介紹:github

  (1):CSV文件,包含臺灣豐原地區240天的氣象觀測資料(取每月前20天的數據作訓練集,12月X20天=240天,每個月後10天數據用於測試,對學生不可見);數組

  (2):天天的監測時間點爲0時,1時......到23時,共24個時間節點;數據結構

  (3):天天的檢測指標包括CO、NO、PM2.五、PM10等氣體濃度,是否降雨、颳風等氣象信息,共計18項;dom

       (4):數據集https://github.com/datawhalechina/leeml-notes/blob/master/docs/Homework/HW_1/Dataset函數

 

數據處理測試

【下文中提到的「數據幀」並不是指pandas庫中的數據結構DataFrame,而是指一個二維的數據包】字體

根據做業要求可知,須要用到連續9個時間點的氣象觀測數據,來預測第10個時間點的PM2.5含量。針對每一天來講,其包含的信息維度爲(18,24)(18項指標,24個時間節點)。能夠將0到8時的數據截大數據

取出來,造成一個維度爲(18,9)的數據幀,做爲訓練數據,將9時的PM2.5含量取出來,做爲該訓練數據對應的label;同理可取1到9時的數據做爲訓練用的數據幀,10時的PM2.5含量做爲label......以此spa

分割,可將天天的信息分割爲15個shape爲(18,9)的數據幀和與之對應的15個label。

 

好像是說用excel是打不開數據文件的  而後親測是能夠打開的,下面是數據標註分析。

 

 

# 數據讀取與預處理
train_data = pd.read_csv("leeml-notes-docs-Homework-HW_1./Dataset/train.csv") train_data.drop(['Date', 'stations'], axis=1, inplace=True) column = train_data['observation'].unique() # print(column)
new_train_data = pd.DataFrame(np.zeros([24*240, 18]), columns=column) for i in column: train_data1 = train_data[train_data['observation'] == i] # Be careful with the inplace, as it destroys any data that is dropped!
    train_data1.drop(['observation'], axis=1, inplace=True) train_data1 = np.array(train_data1) train_data1[train_data1 == 'NR'] = '0' train_data1 = train_data1.astype('float') train_data1 = train_data1.reshape(1, 5760) train_data1 = train_data1.T new_train_data[i] = train_data1 label = np.array(new_train_data['PM2.5'][9:], dtype='float32')

 

探索性數據分析EDA 。最簡但粗暴的方式就是根據HeatMap熱力圖分析各個指標之間的關聯性。

【探索性數據分析(Exploratory Data Analysis,簡稱EDA)】

摘抄網上的一箇中文解釋,是指對已有的數據(特別是調查或觀察得來的原始數據)在儘可能少的先驗假定下進行探索,經過做圖、製表、方程擬合、計算特徵量等手段探索數據的結構和規律的一種數據分析方法。特別是當咱們對面對大數據時代到來的時候,各類雜亂的「髒數據」,每每不知所措,不知道從哪裏開始瞭解目前拿到手上的數據時候,探索性數據分析就很是有效。探索性數據分析是上世紀六十年代提出,其方法有美國統計學家John Tukey提出的。

附上:Howard Seltman 探索數據分析的英語文檔http://www.stat.cmu.edu/~hseltman/309/Book/chapter4.pdf

 

熱力圖 heatmap

seaborn.heatmap(data, vmin=None, vmax=None,cmap=None, center=None, robust=False, annot=None, fmt=’.2g’, annot_kws=None,linewidths=0, linecolor=’white’, cbar=True, cbar_kws=None, cbar_ax=None,square=False, xticklabels=’auto’, yticklabels=’auto’, mask=None, ax=None,**kwargs)

參數共有20個,其中除了data的參數之外,其餘的都有默認值。利用熱力圖能夠看數據表中多個特徵涼涼的類似度。

(1)熱力圖輸入數據參數

data:data是熱力圖輸入的數據參數,矩陣數據集,能夠是numpy的數組(array),也能夠是pandas的DataFrame。若是是DataFrame,則df的index/column信息會分別對應到heatmapcolumnsrows,即pt.index是熱力圖的行標,pt.columns是熱力圖的列標。

 

(2)熱力圖矩陣塊顏色參數:

vmax,vmin:分別是熱力圖的顏色取值最大和最小範圍,默認是根據data數據表裏的取值肯定 

cmap:從數字到色彩空間的映射,取值是matplotlib包裏的colormap名稱或顏色對象,或者表示顏色的列表;改參數默認值:根據center參數設定 

center:數據表取值有差別時,設置熱力圖的色彩中心對齊值;經過設置center值,能夠調整生成的圖像顏色的總體深淺;設置center數據時,若是有數據溢出,則手動設置的vmax、vmin會自動改變 

robust:默認取值False;若是是False,且沒設定vmin和vmax的值,熱力圖的顏色映射範圍根據具備魯棒性的分位數設定,而不是用極值設定

 

(3)熱力圖矩陣塊註釋參數:

 

annot(annotate的縮寫):默認取值False;若是是True,在熱力圖每一個方格寫入數據;若是是矩陣,在熱力圖每一個方格寫入該矩陣對應位置數據 

 

fmt:字符串格式代碼,矩陣上標識數字的數據格式,好比保留小數點後幾位數字 

 

annot_kws:默認取值False;若是是True,設置熱力圖矩陣上數字的大小顏色字體,matplotlib包text類下的字體設置

 

(4)熱力圖矩陣塊之間間隔及間隔線參數:

 

linewidths:定義熱力圖裏「表示兩兩特徵關係的矩陣小塊」之間的間隔大小 

 

linecolor:切分熱力圖上每一個矩陣小塊的線的顏色,默認值是’white’

 

(5)熱力圖顏色刻度條參數:

cbar:是否在熱力圖側邊繪製顏色刻度條,默認值是True 

cbar_kws:熱力圖側邊繪製顏色刻度條時,相關字體設置,默認值是None 

cbar_ax:熱力圖側邊繪製顏色刻度條時,刻度條位置設置,默認值是None

 

 

(6)square:設置熱力圖矩陣小塊形狀,默認值是False

 

預測pm2.5所使用的熱力圖分析   //  代碼以下

 

f, ax = plt.subplots(figsize=(9, 6)) sns.heatmap(new_train_data.corr(), fmt="d", linewidths=0.5, ax=ax) plt.show()

 

模型選擇線性迴歸模型   //  代碼以下

# a.數據歸一化 # 使用前九個小時的 PM2.5 來預測第十個小時的 PM2.5,使用線性迴歸模型
PM = new_train_data['PM2.5'] PM_mean = int(PM.mean()) PM_theta = int(PM.var()**0.5) PM = (PM - PM_mean) / PM_theta w = np.random.rand(1, 10) theta = 0.1 m = len(label) for i in range(100): loss = 0 i += 1 gradient = 0 for j in range(m): x = np.array(PM[j : j + 9]) x = np.insert(x, 0, 1) error = label[j] - np.matmul(w, x) loss += error**2 gradient += error * x loss = loss/(2*m) print(loss) w = w+theta*gradient/m

 

源代碼: 

#pm2.5 prediction
import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 數據讀取與預處理
train_data = pd.read_csv("leeml-notes-docs-Homework-HW_1./Dataset/train.csv") train_data.drop(['Date', 'stations'], axis=1, inplace=True) column = train_data['observation'].unique() # print(column)
new_train_data = pd.DataFrame(np.zeros([24*240, 18]), columns=column) for i in column: train_data1 = train_data[train_data['observation'] == i] # Be careful with the inplace, as it destroys any data that is dropped!
    train_data1.drop(['observation'], axis=1, inplace=True) train_data1 = np.array(train_data1) train_data1[train_data1 == 'NR'] = '0' train_data1 = train_data1.astype('float') train_data1 = train_data1.reshape(1, 5760) train_data1 = train_data1.T new_train_data[i] = train_data1 label = np.array(new_train_data['PM2.5'][9:], dtype='float32') # 探索性數據分析 EDA # 最簡單粗暴的方式就是根據 HeatMap 熱力圖分析各個指標之間的關聯性
f, ax = plt.subplots(figsize=(9, 6)) sns.heatmap(new_train_data.corr(), fmt="d", linewidths=0.5, ax=ax) plt.show() # 模型選擇 # a.數據歸一化 # 使用前九個小時的 PM2.5 來預測第十個小時的 PM2.5,使用線性迴歸模型
PM = new_train_data['PM2.5'] PM_mean = int(PM.mean()) PM_theta = int(PM.var()**0.5) PM = (PM - PM_mean) / PM_theta w = np.random.rand(1, 10) theta = 0.1 m = len(label) for i in range(100): loss = 0 i += 1 gradient = 0 for j in range(m): x = np.array(PM[j : j + 9]) x = np.insert(x, 0, 1) error = label[j] - np.matmul(w, x) loss += error**2 gradient += error * x loss = loss/(2*m) print(loss) w = w+theta*gradient/m

 

熱力圖展現:

 

 經過熱力圖分析,能夠直接看出來,與PM2.5相關性較高的指標有PM十、NO二、SO二、NOX、O三、THC。

打印損失函數

[292.68906502] [223.74087258] [185.8738045] [156.51287584] [132.85031907] [113.69306898] [98.15763341] [85.54014962] [75.27576792] [66.910614] [60.07971] [54.48935648] [49.90304759] [46.13020108] [43.01713361] [40.43982902] [38.29813911] [36.51113006] [35.01334584] [33.75180584] [32.68359109] [31.77390253] [30.99449797] [30.32243337] [29.73904841] [29.22914866] [28.78034581] [28.38252508] [28.0274152] [27.70824084] [27.41944165] [27.15644499] [26.91548195] [26.69343832] [26.48773386] [26.29622436] [26.11712216] [25.94893161] [25.7903966] [25.64045789] [25.49821832] [25.36291455] [25.2338939] [25.11059546] [24.99253468] [24.8792907] [24.77049598] [24.66582775] [24.56500099] [24.46776268] [24.37388695] [24.28317114] [24.1954325] [24.11050546] [24.0282393] [23.94849625] [23.87114985] [23.79608363] [23.72318988] [23.65236874] [23.58352731] [23.51657893] [23.45144258] [23.38804235] [23.32630692] [23.2661692] [23.20756596] [23.1504375] [23.09472737] [23.04038215] [22.98735118] [22.9355864] [22.88504216] [22.83567503] [22.7874437] [22.74030881] [22.69423284] [22.64917999] [22.60511608] [22.56200847] [22.51982595] [22.47853867] [22.43811807] [22.39853679] [22.35976863] [22.32178847] [22.28457222] [22.24809678] [22.21233996] [22.17728047] [22.14289784] [22.10917243] [22.07608531] [22.04361832] [22.01175395] [21.98047539] [21.9497664] [21.9196114] [21.88999532] [21.86090369]
相關文章
相關標籤/搜索