作業(yè)背景
Covid-19病例預(yù)測(cè)。
數(shù)據(jù)格式為40個(gè)州(one-hot形式)+前三天的其他數(shù)據(jù)(每天18個(gè))档泽,總計(jì)93個(gè)feature匆篓。預(yù)測(cè)的目標(biāo)是第三天的病例數(shù)據(jù)。
作業(yè)來(lái)源:作業(yè)Slide
目標(biāo):
1. 初步學(xué)習(xí)運(yùn)用深度神經(jīng)網(wǎng)絡(luò)解決回歸問(wèn)題字支。
2. 了解深度神經(jīng)網(wǎng)絡(luò)的步驟。
3. 了解Pytorch的使用方法奸忽。
Simple Baseline
運(yùn)行給定的代碼就能夠達(dá)到Simple Baseline堕伪。
核心的步驟包括:
1. 加載numpy,torch栗菜,matplotlib等庫(kù)欠雌。注意需要指定模型的隨機(jī)種子來(lái)保證模型的可恢復(fù)性。
2. 數(shù)據(jù)預(yù)處理類(lèi)Covid19Dataset疙筹。根據(jù)不同的模式加載不同的數(shù)據(jù)富俄。例如訓(xùn)練模式下需要將數(shù)據(jù)按照k折交叉驗(yàn)證法分成訓(xùn)練數(shù)據(jù)和驗(yàn)證數(shù)據(jù)禁炒。在測(cè)試模式下,加載特定的測(cè)試數(shù)據(jù)霍比。之后需要用統(tǒng)一的Pytorch加載器包裝待處理數(shù)據(jù)幕袱。
3. 深度神經(jīng)網(wǎng)絡(luò)的構(gòu)造。構(gòu)造包含兩層全連接層的神經(jīng)網(wǎng)絡(luò)模型悠瞬。使用MSE作為回歸問(wèn)題的損失函數(shù)凹蜂。
4. 訓(xùn)練階段創(chuàng)建模型的實(shí)例并進(jìn)行迭代時(shí)訓(xùn)練。注意每次迭代都需要保存模型阁危。訓(xùn)練結(jié)束后玛痊,對(duì)模型Loss隨迭代次數(shù)的變化進(jìn)行可視化,用于選取更合適的迭代次數(shù)狂打。
5. 在驗(yàn)證集上進(jìn)行模型準(zhǔn)確率的分析驗(yàn)證擂煞。
6. 輸出保存測(cè)試集的結(jié)果,并在Kaggle上查看模型得分趴乡。
Medium Baseline
Medium Baseline要求選取更加有效的特征对省。具體為選擇40個(gè)州以及前兩天的陽(yáng)性病例特征用于訓(xùn)練。
class COVID19Dataset(Dataset):
''' Dataset for loading and preprocessing the COVID19 dataset '''
if not target_only:
feats = list(range(93))
else:
# Using 40 states & 2 tested_positive features (indices = 57 & 75)
feats = list(range(40)) + [57, 75]
pass
Strong Baseline
- 特征選擇
這里選擇與Covid-19關(guān)系密切的幾個(gè)特征晾捏。也可以嘗試使用斯皮爾曼系數(shù)計(jì)算不同特征與預(yù)測(cè)目標(biāo)的相關(guān)性蒿涎,選取相關(guān)性大的那些特征。
特征 | 含義 | 是否選取 |
---|---|---|
0-39 | 州 | ? |
cli | 類(lèi)Covid-19病例 | ? |
ili | 類(lèi)Covid-19病例 | ? |
hh_cmnty_cli | 類(lèi)Covid-19病例 | ? |
nohh_cmnty_cli | 類(lèi)Covid-19病例 | ? |
wearing_mask | Covid-19相關(guān)行為 | |
travel_outside_state | Covid-19相關(guān)行為 | |
work_outside_home | Covid-19相關(guān)行為 | |
shop | Covid-19相關(guān)行為 | |
restaurant | Covid-19相關(guān)行為 | |
spent_time | Covid-19相關(guān)行為 | |
large_event | Covid-19相關(guān)行為 | |
public_transit | Covid-19相關(guān)行為 | |
anxious | 調(diào)查者情緒狀況 | |
public_transit | 調(diào)查者情緒狀況 | |
depressed | 調(diào)查者情緒狀況 | |
felt_isolated | 調(diào)查者情緒狀況 | |
worried_become_ill | 調(diào)查者情緒狀況 | |
worried_finances | 調(diào)查者情緒狀況 | |
tested_positive | 預(yù)測(cè)目標(biāo) | ? |
- 模型參數(shù)的選取
激活函數(shù)以及損失函數(shù)的選取建議:
問(wèn)題類(lèi)型 | 最后一層激活函數(shù) | 損失函數(shù) |
---|---|---|
二分類(lèi)問(wèn)題 | sigmoid | binary_crossentropy |
多分類(lèi)惦辛、單標(biāo)簽問(wèn)題 | softmax | categorical_crossentropy |
多分類(lèi)劳秋、多標(biāo)簽問(wèn)題 | sigmoid | binary_crossentropy |
回歸到任意值 | 無(wú) | MSE/RMSE |
回歸到 0~1 范圍內(nèi)的值 | sigmoid | mse 或 binary_crossentropy |
這里選擇RMSE作為損失函數(shù),因?yàn)樽罱KKaggle上的分?jǐn)?shù)就是通過(guò)RMSE計(jì)算得出胖齐。模型最終的參數(shù)為:
class NeuralNet(nn.Module):
''' A simple fully-connected deep neural network '''
def __init__(self, input_dim):
super(NeuralNet, self).__init__()
self.net = nn.Sequential(
nn.Linear(input_dim, 256),
nn.ReLU(),
nn.Linear(256, 128),
nn.LeakyReLU(),
nn.Linear(128, 1)
)
# Mean squared error loss
self.criterion = nn.MSELoss(reduction='mean')
def forward(self, x):
return self.net(x).squeeze(1)
# L2正則項(xiàng)
def regularization(self, C):
regular = 0
for param in self.net.parameters():
regular += torch.norm(param, 2)
return C * regular
def cal_loss(self, pred, target):
# RMSE + L1/L2 regularization
return torch.sqrt(self.criterion(pred, target)) + self.regularization(0.15)
-
L1/L2 Regularization
L1/L2正則化都是防止過(guò)擬合的方式玻淑。正則化通過(guò)給損失增加模型懲罰項(xiàng)使模型的結(jié)構(gòu)化風(fēng)險(xiǎn)最小。這里以回歸問(wèn)題為例子呀伙,其中C為正則項(xiàng)系數(shù)(一般可以選擇-
):
- 正常的MSE
- L1正則化
- L2正則化
在Optimizer中补履,參數(shù)weight_decay表示使用L2正則化的系數(shù)C。
總結(jié)剿另,L1正則化就是在loss function后邊所加正則項(xiàng)為L(zhǎng)1范數(shù)箫锤,加上L1范數(shù)容易得到稀疏解(0比較多)。L2正則化就是loss function后邊所加正則項(xiàng)為L(zhǎng)2范數(shù)的平方雨女,加上L2正則相比于L1正則來(lái)說(shuō)谚攒,得到的解比較平滑(不是稀疏),但是同樣能夠保證解中接近于0(但不是等于0戚篙,所以相對(duì)平滑)的維度比較多五鲫,降低模型的復(fù)雜度溺职。
- 正常的MSE
-
Dropout
目的: Dropout可以比較有效的緩解過(guò)擬合的發(fā)生岔擂,在一定程度上達(dá)到正則化的效果位喂。
操作:在前向傳播的時(shí)候,Dropout讓某個(gè)神經(jīng)元的激活值以一定的概率p停止工作乱灵,這樣可以使模型泛化性更強(qiáng)塑崖,因?yàn)樗粫?huì)太依賴(lài)某些局部的特征。
具體流程:
- 訓(xùn)練階段:
讓某個(gè)神經(jīng)元以概率p停止工作痛倚,換句話(huà)說(shuō)是讓它的激活函數(shù)值以概率p變?yōu)?规婆。實(shí)現(xiàn)上就是以概率p的方式生成長(zhǎng)度與權(quán)重?cái)?shù)量相同的01數(shù)組從而隱藏部分權(quán)重。 - 猜測(cè)階段:
預(yù)測(cè)模型的時(shí)候蝉稳,每一個(gè)神經(jīng)單元的權(quán)重參數(shù)要乘以概率p抒蚜。目的是保持訓(xùn)練和測(cè)試數(shù)據(jù)的一致性。
當(dāng)前Dropout被大量利用于全連接網(wǎng)絡(luò)耘戚,而且一般認(rèn)為設(shè)置為0.5或者0.3嗡髓,而在卷積網(wǎng)絡(luò)隱藏層中由于卷積自身的稀疏化以及稀疏化的ReLu函數(shù)的大量使用等原因,Dropout策略在卷積網(wǎng)絡(luò)隱藏層中使用較少收津《稣猓總體而言,Dropout是一個(gè)超參撞秋,需要根據(jù)具體的網(wǎng)絡(luò)长捧、具體的應(yīng)用領(lǐng)域進(jìn)行嘗試。
- 訓(xùn)練階段:
-
數(shù)據(jù)歸一化問(wèn)題
進(jìn)行數(shù)據(jù)歸一化的原因:
原則:樣本的所有特征吻贿,在特征空間中串结,對(duì)樣本的距離產(chǎn)生的影響是同級(jí)的;
問(wèn)題:特征數(shù)字化后舅列,由于取值大小不同奉芦,造成特征空間中樣本點(diǎn)的距離會(huì)被個(gè)別特征值所主導(dǎo),而受其它特征的影響比較芯珲濉声功;歸一化的方法:
- 最值歸一化
- 標(biāo)準(zhǔn)化
這里需要注意的是對(duì)于測(cè)試集的標(biāo)準(zhǔn)化應(yīng)當(dāng)選取訓(xùn)練集的平均數(shù)與方差,原因是測(cè)試集可能很小宠叼,平均值和方差不能反映大量數(shù)據(jù)的特征先巴。這也是代碼示例中提到的問(wèn)題:
- 最值歸一化
# Normalize features (you may remove this part to see what will happen)
self.data[:, 40:] = (self.data[:, 40:] - self.data[:, 40:].\
mean(dim=0, keepdim=True)) / self.data[:, 40:].std(dim=0, keepdim=True)
# 正確的處理方法為,train_mean和train_std為全局變量
if mode == 'train':
train_mean = self.data[:, 40:].mean(dim=0, keepdim=True)
train_std = self.data[:, 40:].std(dim=0, keepdim=True)
self.data[:, 40:] = (self.data[:, 40:] - train_mean) / train_std
-
mini-batch
mini-batch主要解決的問(wèn)題是:實(shí)際應(yīng)用時(shí)的訓(xùn)練數(shù)據(jù)往往都太大了冒冬,一次加載到電腦里可能內(nèi)存不夠伸蚯,其次運(yùn)行速度也很慢。mini-batch的思想就是將數(shù)據(jù)分批輸入神經(jīng)網(wǎng)絡(luò)中简烤,降低網(wǎng)絡(luò)的負(fù)載量剂邮,也能加快網(wǎng)絡(luò)的收斂速度。
具體來(lái)說(shuō)横侦,將所有輸入數(shù)據(jù)分成固定大小的小批數(shù)據(jù)挥萌,每次訓(xùn)練只輸入小批數(shù)據(jù)绰姻。同時(shí),數(shù)據(jù)可以進(jìn)行打亂操作增加數(shù)據(jù)的隨機(jī)性提升網(wǎng)絡(luò)的學(xué)習(xí)能力引瀑。
-
Optimizer
優(yōu)化器是優(yōu)化梯度下降的特定算法狂芋,這邊簡(jiǎn)單介紹一下主流的優(yōu)化器算法。
優(yōu)化器 | 作用 |
---|---|
BGD | 原始的梯度下降算法憨栽,直接根據(jù)Loss更新權(quán)重帜矾。缺點(diǎn)是容易受到局部最優(yōu)點(diǎn)的影響 |
SGD | 采用隨機(jī)的小樣本更新權(quán)重,增加更新次數(shù)屑柔,加快收斂速度屡萤。帶動(dòng)量的SGD考慮了上一次更新的權(quán)重,保證了每一次更新的梯度不為0從而逃離鞍點(diǎn) |
AdaGrad | 每次迭代不斷減小更新幅度 |
RMSprop | 與AdaGrad不同掸宛,使用了衰減率更新的梯度 |
Adam | Adam使用momentum和Bias correction更新梯度灭衷,涉及的參數(shù)包括alpha和beta。Adam的下降速度比較快旁涤,應(yīng)用廣泛 |
- 最終實(shí)現(xiàn)
模型配置信息:
config = {
'n_epochs': 3000,
'batch_size': 100,
'optimizer': 'SGD',
'optim_hparas': {
'lr': 0.001,
'momentum': 0.9
},
'early_stop': 200,
'save_path': 'models/model.pth'
}
Kaggle上最終結(jié)果:
Private 數(shù)據(jù)集沒(méi)有達(dá)到Strong baseline翔曲,模型方面可以繼續(xù)調(diào)優(yōu)。
參考文章