這里記錄學習《李宏毅2020機器學習深度學習》課程中作業(yè)部分的一些整理,初次編寫DL代碼,記錄思考過程,以供自己回顧。
在助教給的參考代碼基礎上進行修改。跟著李沐大神的《動手學深度學習V2》學了pytorch框架的linear regression模型的實現(xiàn)。【初學,有錯歡迎告知】
資料鏈接【視頻、書、作業(yè)等】:
李宏毅老師課程主頁:http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML20.html
李沐大神課程主頁:https://courses.d2l.ai/zh-v2/
導入庫:


橫著的0-23是一天的24小時,縱著的是測試的指標每天測試18個features,有12個月,每個月記錄20天。
目標:由前9個小時的數(shù)據(jù)(包括PM2.5)預測第十個小時的PM2.5
1、數(shù)據(jù)預處理
因為數(shù)據(jù)輸入格式不是簡單的某一行或者某一列的數(shù)據(jù),所以需要根據(jù)要求進行需處理。
1-首先觀察到"RAINFALL"這個指標含有”NA“,將NA改成0。data[data == 'NR'] = 0
2-分割feature和label:
紅色大框為第一個輸入data,小框第一個output,藍色的為第二個。然后把數(shù)據(jù)攤平,一個輸入有162個特征:9h*18=162,train date中有12個月,每個月20天,每天24小時【每個月內部時間是連續(xù)的】,所以有12個月*20天*24h=12個月*480h。把這些時間分成每9h一個out,那么有12*(480-9)這樣多個輸入輸出對【12*471】

將數(shù)據(jù)切成x, y配對格式。

3-為了之后求梯度下降梯度能沿著global minimum方向下降,需要對數(shù)據(jù)標準化【不標準化它的loss function的等高線可能不是正圓,梯度下降會比較慢】


4-劃分訓練集和驗證集:
data要分成三份,在train和test的基礎上,train還要分出一部分作為validation set,val_set用于調參,test上的結果可以作為未知data上的結果。如果只分兩類根據(jù)test上的結果調參數(shù)會造成在未知數(shù)據(jù)上效果可能會不好。
可以使用train_test_split劃分,但有時候不方便劃分,需要自己寫函數(shù)。也可以像下面一樣直接前段為train,后段為val。

使用torch需要轉換數(shù)據(jù)類型,以batch(批次) = 12,在train_set中一共有12*471份,分成train和val,可以train:12*2*157=3768,val:12*1*157
【需要將np轉換成float32,不然后面調用模型的時候會報錯數(shù)據(jù)類型不一致;然后轉換成torch,需要確保維度一致,保證特征18*9=162列,行數(shù)-1自動填充。如果需要更改或者多次運行,類型轉換后可以換個名字,比如x1。】

分批,因為可以同時訓練,速度會比較快。batch的大小需要嘗試,batch, learning_rate, epoch都屬于超參數(shù),之后可以通過一些方法進行調整。
而且batch如果不夠分,有多出的部分也有一些處理方法。

2、模型構建
1-定義模型
這里只用到線性模型,nn.Linear(input, output),括號中輸入feature維度和輸出維度。loss選擇MSE均方差,使用隨機梯度下降SGD,學習率lr可自主設置。

2-迭代更新參數(shù)
因為發(fā)現(xiàn)基本30epoch就沒啥變化了,所以設置30,大循環(huán)是迭代周期,小循環(huán)通過每個batch計算loss,反向傳播更新參數(shù)【小循環(huán)將整組數(shù)據(jù)都訓練了一遍】,最后在每次迭代中打印loss。loss計算的是整個train數(shù)據(jù)(包括train_set和val)。
訓練集在34左右,驗證集在25左右,all train data30左右。但是助教給的代碼loss可以達到15.8。之后再試試自己手動搭建的,看看啥原因。

3-同樣處理test數(shù)據(jù)
在torch中w和b是分開的,維度不用+1

得到test_set對應的y,保存進csv文件可以把torch轉換成numpy。這個文件是為了提交上kaggle,等我之后學的更多了,能得到更好的結果的時候再上交。

完整代碼見:此。