1.標準化
首先標準化可以解決不同範圍數據的情況,解決其中一種特徵受制於scale而導致的弱影響問題。
此時不同特徵同屬於接近的scale,梯度下降的速度是最快的。
代碼如下:
mean = train_data.mean(axis=0)
std = train_data.std(axis=0)
train_data -= mean
train_data /= std
test_data -= mean
test_data /= std
可以注意到,這裏的平均和標準差是沿着樣本軸方向進行的,並且,測試資料在進行標準化時,也只能使用訓練資料的均值和標準差。
2.K折交叉驗證
K折交叉驗證常用在數據集較小的情況下,此時由於分割出的訓練集分佈可能無法代表原來整體的分佈,就需要進一步使用可信度較高的方法劃分驗證集。
具體來說K折交叉驗證會將訓練集分成n份,以5份舉例,每次會選取其中一份作爲訓練集,其他幾份連接起來作爲訓練集,訓練集訓練出的模型拿給當下驗證集進行預測,最後將幾次預測的結果取平均(分類任務還有投票制等)。
k折交叉驗證有些類似於多模型的集成學習,因爲實際上我們是產生了多個模型並對結果進行集成。
代碼如下:
import numpy as np
k = 5
num_val_datas = len(train_datas)//k # 確定每折的數據量
all_scores = [] # 存儲每個模型的結果
for i in range(k):
val_x_trains = train_datas[i*num_val_datas:(i+1)*num_val_datas]
val_y_trains = train_targets[i*num_val_datas:(i+1)*num_val_datas]
partitial_x_train = np.concatenate([train_datas[:i*num_val_datas],
train_datas[(i+1)*num_val_datas:]],axis=0)
partitial_y_train = np.concatenate([train_targets[:i*num_val_datas],
train_targets[(i+1)*num_val_datas:]],axis=0)
model = build_model()
model.fit(partitial_x_train,partitial_y_train,epochs=5,batch_size=1,verbose=2)
loss,e = model.evaluate(val_x_trains,val_y_trains,verbose=2)
all_scores.append(e)