kreas搭建神經網路預測波士頓房價(手寫K折交叉驗證)
阿新 • • 發佈:2018-11-07
1、程式說明
所有注意事項均寫入註釋
from keras.datasets import boston_housing import numpy as np from keras import models from keras import layers from keras.optimizers import RMSprop # 載入資料 (train_data, train_targets), (test_data, test_targets) = boston_housing.load_data() # 訓練集404個,測試集102個,13個屬性 # print(train_data[0]) # print(train_data.shape) # print(train_targets) # print(test_data.shape) # 資料標準化 ''' 用於測試資料標準化的均值和標準差都是在訓練資料上計算得到的。 不能使用在測試資料上計算得到的任何結果,即使是像資料標準化這麼簡單的事情也不行。 ''' mean = train_data.mean(axis=0) train_data -= mean test_data -= mean std = train_data.std(axis=0) train_data -= std test_data -= std def build_model(): model = models.Sequential() model.add(layers.Dense(units=64, activation='relu', input_shape=(13, ))) model.add(layers.Dense(units=64, activation='relu')) ''' 網路的最後一層只有一個單元,沒有啟用,是一個線性層。這是標量回歸(標量回歸是預 測單一連續值的迴歸)的典型設定。新增啟用函式將會限制輸出範圍。例如,如果向最後一層 新增 sigmoid 啟用函式,網路只能學會預測 0~1 範圍內的值。這裡最後一層是純線性的,所以 網路可以學會預測任意範圍內的值。 ''' model.add(layers.Dense(units=1)) model.compile(optimizer=RMSprop(lr=0.001), loss='mse', metrics=['mae']) return model def k_fold(k, model): num_val_samples = len(train_data) // k all_scores = [] for i in range(k): print('Processing fold #', i+1) # 準備測試集,第i塊為測試集 val_data = train_data[i*num_val_samples: (i+1)*num_val_samples] val_targets = train_targets[i*num_val_samples: (i+1)*num_val_samples] # 準備訓練集,除了第i塊都是訓練集,這裡用numpy的concatenate拼接 partial_train_data = np.concatenate([train_data[:i*num_val_samples], train_data[(i+1)*num_val_samples:]], axis=0) partial_train_targets = np.concatenate([train_targets[:i * num_val_samples], train_targets[(i + 1) * num_val_samples:]], axis=0) ''' verbose:日誌顯示 verbose = 0 為不在標準輸出流輸出日誌資訊 verbose = 1 為輸出進度條記錄 verbose = 2 為每個epoch輸出一行記錄 注意: 預設為 1 ''' model.fit(partial_train_data, partial_train_targets, epochs=100, batch_size=1, verbose=0) val_mse, val_mae = model.evaluate(val_data, val_targets) print('val_mse:', val_mae, ' val_mae:', val_mae) all_scores.append(val_mae) return all_scores if __name__ == '__main__': all_scores = k_fold(5, build_model()) print(all_scores)
2、訓練結果展示
Processing fold # 1 32/80 [===========>..................] - ETA: 0s 80/80 [==============================] - 0s 424us/step val_mse: 2.2958826065063476 val_mae: 2.2958826065063476 Processing fold # 2 32/80 [===========>..................] - ETA: 0s 80/80 [==============================] - 0s 25us/step val_mse: 2.2359493732452393 val_mae: 2.2359493732452393 Processing fold # 3 32/80 [===========>..................] - ETA: 0s 80/80 [==============================] - 0s 25us/step val_mse: 1.8176211357116698 val_mae: 1.8176211357116698 Processing fold # 4 32/80 [===========>..................] - ETA: 0s 80/80 [==============================] - 0s 25us/step val_mse: 1.8358864784240723 val_mae: 1.8358864784240723 Processing fold # 5 32/80 [===========>..................] - ETA: 0s 80/80 [==============================] - 0s 25us/step val_mse: 2.025705862045288 val_mae: 2.025705862045288 [2.2958826065063476, 2.2359493732452393, 1.8176211357116698, 1.8358864784240723, 2.025705862045288]
可見,平均mae為2.04,即平均誤差為2040美元。
3、k折交叉驗證
4、小結
- 迴歸問題使用的損失函式與分類問題不同。迴歸常用的損失函式是均方誤差(MSE),常見的迴歸指標是平均絕對誤差(MAE)。
- 如果可用的資料很少,使用 K 折驗證可以可靠地評估模型。
- 如果輸入資料的特徵具有不同的取值範圍,應該先進行預處理,對每個特徵單獨進行縮放。
- 如果可用的訓練資料很少,最好使用隱藏層較少(通常只有一到兩個)的小型網路,以避免嚴重的過擬合。