用keras實現基本的回歸問題


數據集介紹

共有506個樣本,拆分為404個訓練樣本和102個測試樣本

該數據集包含 13 個不同的特征:

  1. 人均犯罪率。
  2. 占地面積超過 25000 平方英尺的住宅用地所占的比例。
  3. 非零售商業用地所占的比例(英畝/城鎮)。
  4. 查爾斯河虛擬變量(如果大片土地都臨近查爾斯河,則為 1;否則為 0)。
  5. 一氧化氮濃度(以千萬分之一為單位)。
  6. 每棟住宅的平均房間數。
  7. 1940 年以前建造的自住房所占比例。
  8. 到 5 個波士頓就業中心的加權距離。
  9. 輻射式高速公路的可達性系數。
  10. 每 10000 美元的全額房產稅率。
  11. 生師比(按城鎮統計)。
  12. 1000 * (Bk - 0.63) ** 2,其中 Bk 是黑人所占的比例(按城鎮統計)。
  13. 較低經濟階層人口所占百分比。

技巧

  • 均方誤差 (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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM