1. 程式人生 > >kreas搭建神經網路預測波士頓房價(手寫K折交叉驗證)

kreas搭建神經網路預測波士頓房價(手寫K折交叉驗證)

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 折驗證可以可靠地評估模型。
  • 如果輸入資料的特徵具有不同的取值範圍,應該先進行預處理,對每個特徵單獨進行縮放。
  • 如果可用的訓練資料很少,最好使用隱藏層較少(通常只有一到兩個)的小型網路,以避免嚴重的過擬合。