用keras實現基本的迴歸問題
阿新 • • 發佈:2018-12-06
資料集介紹
共有506個樣本,拆分為404個訓練樣本和102個測試樣本
該資料集包含 13 個不同的特徵:
- 人均犯罪率。
- 佔地面積超過 25000 平方英尺的住宅用地所佔的比例。
- 非零售商業用地所佔的比例(英畝/城鎮)。
- 查爾斯河虛擬變數(如果大片土地都臨近查爾斯河,則為 1;否則為 0)。
- 一氧化氮濃度(以千萬分之一為單位)。
- 每棟住宅的平均房間數。
- 1940 年以前建造的自住房所佔比例。
- 到 5 個波士頓就業中心的加權距離。
- 輻射式高速公路的可達性係數。
- 每 10000 美元的全額房產稅率。
- 生師比(按城鎮統計)。
- 1000 * (Bk - 0.63) ** 2,其中 Bk 是黑人所佔的比例(按城鎮統計)。
- 較低經濟階層人口所佔百分比。
技巧
- 均方誤差 (MSE) 是用於迴歸問題的常見損失函式(與分類問題不同)。
- 同樣,用於迴歸問題的評估指標也與分類問題不同。常見迴歸指標是平均絕對誤差 (MAE)。
- 如果輸入資料特徵的值具有不同的範圍,則應分別縮放每個特徵。
- 如果訓練資料不多,則選擇隱藏層較少的小型網路,以避免出現過擬合。
- 早停法是防止出現過擬合的實用技術。
注意事項
如果資料集下載失敗,可以在我的Github上下載:https://github.com/MartinLwx/ML-DL
程式碼
from __future__ import absolute_import, division, print_function import tensorflow as tf from tensorflow import keras import numpy as np boston_housing = keras.datasets.boston_housing (train_data, train_labels), (test_data, test_labels) = boston_housing.load_data() # 打亂訓練集 order = np.argsort(np.random.random(train_labels.shape)) train_data = train_data[order] train_labels = train_labels[order] #計算平均值和方差的時候不用測試集的資料 mean = train_data.mean(axis=0) std = train_data.std(axis=0) train_data = (train_data - mean) / std test_data = (test_data - mean) / std #因為後文要用earlystop技術所以寫了一個函式 def build_model(): model = keras.Sequential([ keras.layers.Dense(64, activation=tf.nn.relu, input_shape=(train_data.shape[1],)), keras.layers.Dense(64, activation=tf.nn.relu), keras.layers.Dense(1) ]) optimizer = tf.train.RMSPropOptimizer(0.001) model.compile(loss='mse', optimizer=optimizer, metrics=['mae']) return model model = build_model() history = model.fit(train_data, train_labels, epochs=EPOCHS, validation_split=0.2, verbose=0) #返回的是loss和mae(平均絕對誤差) model.evaluate(test_data, test_labels) #輸出[16.7056874293907, 2.5310279341305004] model = build_model() # The patience parameter is the amount of epochs to check for improvement early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=20) history = model.fit(train_data, train_labels, epochs=EPOCHS, validation_split=0.2, verbose=0, callbacks=[early_stop]) model.evaluate(test_data, test_labels) #輸出了[21.388992309570313, 2.9450648532194248]
參考
https://www.tensorflow.org/tutorials/keras/basic_regression?hl=zh-cn