事前 :
kaggle地址:
我的git地址:
當然作為新手,我也是參考的其他大神的。參考的過多,我就不一一放地址了,在這里謝過各位大佬。如果和我一樣的新手,調試代碼看張量流動絕對是一個好用的方法。
作業介紹: 說的是啊 這個美國,好像是有40個州, 這四十個州呢 ,統計了連續三天的新冠陽性人數,和每天的一些社會特征,比如帶口罩情況, 居家辦公情況等等。現在有一群人比較壞,把第三天的數據遮住了,我們就要用前兩天的情況以及第三天的特征,來預測第三天的陽性人數。但幸好的是,我們還是有一些數據可以作為參考的,就是我們的訓練集。
一: 數據讀取。
(第一步引用的包:)
先從kaggle上把數據下下來看看。點那個data就找到下載的地方了。下載好數據第一步先觀察train的數據是什么樣子的。如下圖,可以看到有很多列,每一列都是一類特征,每一行都是一個樣本。黃紅藍是第1,2,3天的測試陽性數據。藍色的就是我們要預測的值啦。
我們再細看數據: 可以看到第一行是沒有用的,他只是標簽的名稱。然后第一列也是沒有用處的,因為他只是標注樣本是第幾個樣本。等會處理數據時都要處理掉。 然后我們可以注意到前40列的數據和后面五十多列是不一樣的,一般是一列全1 其他列全0 ,表示的是1所在的那個州,地點標識而已。
看清楚數據的結構,下面我們開始讀入數據。csv數據和其他數據的讀法差不多。比如你可以選擇下面的文件式讀法。
也可以選擇csv的專門讀取excel表格的函數
然后這里要介紹一個取最相關列的操作。 上面的數據我們知道有95列,可是,這90多列,每一列都與結果是相關的嗎? 恐怕不一定,肯定有些特征卵用沒有。所以我們這里可以找到那些相關的列,用這些特征來預測結果。找特征有很多方法,大家可以百度特征選擇,有很多介紹。這里用的是SelectKBest 函數。順便定義了一個挑特征的函數。column是第一行的特征名稱,我傳入是為了打印看看是哪些特征重要,要不然他挑了半天我也不知道啊 。k是挑多少個特征。
找好特征后。我們還需要進行訓練集和驗證集的划分。 我們知道,kaggle下下來只有訓練集和測試集,所以我們需要從訓練集里分出來一個驗證集來作為模型評價。 方法可以是直接截一段,也可以是逢幾個挑一個,也可以是隨機的。我這里是逢5挑1
取完數據后,一般還要有一個歸一化的步驟,防止各個特征的數量級相差過於大。這里用的是Z-score標准化方法。減均值除以標准差
綜上所述,我們可以寫出我們的dataset函數了。基本上大部分神經網絡都是需要讀數據這部分的,過程就是把數據從本地文件,讀入dataset中去。dataset中一般有三個函數,第一個是初始化__init__: 一般負責把數據從文件取出來。第二個獲取數據__getitem__, 負責讀第幾個數據。第三個獲取長度__len__: 負責返回數據集的長度。
一個完整的從csv到可以用的dataset的 代碼如下圖所示。 這一部分被我放在model——utils的data模塊里。
完整代碼:
二 模型設計。
數據都讀完了,接下來肯定是模型了 。當然這里是一個簡單的回歸模型我用兩個全連接實現的,中間加了一個relu。inDim是傳入的參數 ,就是上面我們挑選的重要特征的數量啦。這部分比較簡單,一般模型都是包括這兩個部分 __init__和forward 也就是初始化和前向傳播。初始化中會定義前向傳播里需要的模型模塊。前向傳播里就是輸入到輸出的流動了 。x是輸入的張量,最后輸出模型計算結果。 模型也非常簡單。
注意網絡一般都是按batch大小計算的。我舉個例子。 假如我挑了4個特征,那么模型輸入長度就是4,輸出長度就是1(回歸值) 。假如我16個數據1批次, 輸入大小就是(16,4) 輸出就是(16,1) 這都是自動的 不用我們擔心。這一部分被我放在model_utils的model模塊里。
完整代碼:
三 訓練步驟。
訓練函數推薦大家自己定義一個的,這樣以后面對大部分問題都可以通用。
這個是訓練的過程 都是很常規的步驟。
每一個epoch里還有驗證步驟。參照訓練可以看到每一步的作用。多了一個保存模型的步驟。保存loss最低時的那個模型。
還有繪圖: 畫出loss的變化情況。
完整的訓練代碼:這一部分被我放在model_utils的train模塊里。
四:測試和保存步驟 。
測試和驗證時很相似的。 少的是預測值和真值的比較,因為沒有真值 ,多的是預測值得保存。按照kaggle要求保存在csv里 。這一部分被我放在model_utils的evaluate模塊里。
完整代碼:
五 : 主函數。
萬事俱備,只欠東風。就像人的四肢腦袋都齊了,就差個body把他們連起來了,起這個作用的 就是main函數。
調包第一步 除了系統包 還有自己寫的
路徑和設備 以及一些超參。 在這里 我嘗試將一些超參放入字典中。
定義loss 這里采用了mseloss 然后還加上了正則化
定義model和優化器 以及數據傳入loader 前面說過這是為了批量處理
訓練和測試
完整代碼:
事后:
運行主函數 我們將得到 pred.csv。這就是我們得預測結果啦。打開kaggle網址項目所在頁, 注冊,點擊late submission 提交你的pred.csv文件吧。 這也是我第一次用kaggle。 好像我的得分也很低。大家如果想得一個比較高得分,可以多調調超參和模型。fighting!!!
李宏毅老師前年課程的第一個作業也是回歸,不過不是新冠。當時我啥都不會寫,把網上得copy下來,一步一步調試才慢慢懂一點點。 這次第二次做回歸,只能說比第一次熟練了很多,雖然還是不能全部一個人寫下來。 寫這個文章,與大家共勉。