[Deep-Learning-with-Python]基于Keras的房?jī)r(jià)預(yù)測(cè)

預(yù)測(cè)房?jī)r(jià):回歸問(wèn)題

回歸問(wèn)題預(yù)測(cè)結(jié)果為連續(xù)值,而不是離散的類別。

波士頓房?jī)r(jià)數(shù)據(jù)集

通過(guò)20世紀(jì)70年代波士頓郊區(qū)房?jī)r(jià)數(shù)據(jù)集,預(yù)測(cè)平均房?jī)r(jià);數(shù)據(jù)集的特征包括犯罪率、稅率等信息。數(shù)據(jù)集只有506條記錄,劃分成404的訓(xùn)練集和102的測(cè)試集。每個(gè)記錄的特征取值范圍各不相同。比如,有01,112以及0~100的等等。

加載數(shù)據(jù)集

from keras.datasets import boston_housing

(train_data,train_targets),(test_data,test_targets) = boston_housing.load_data()

訓(xùn)練集形狀:

>>> train_data.shape
(404, 13)

測(cè)試集形狀:

>>> test_data.shape
(102, 13)

訓(xùn)練集404條,測(cè)試集102條;每條記錄13個(gè)數(shù)值特征。
房?jī)r(jià)單位為1000美元。

>>> train_targets
[ 15.2, 42.3, 50. ...19.4,19.4,29.1]

房?jī)r(jià)范圍在10,000到50,000。

準(zhǔn)備數(shù)據(jù)

因?yàn)閿?shù)據(jù)各個(gè)特征取值范圍各不相同,不能直接送到神經(jīng)網(wǎng)絡(luò)模型中進(jìn)行處理。盡管網(wǎng)絡(luò)模型能適應(yīng)數(shù)據(jù)的多樣性,但是相應(yīng)的學(xué)習(xí)過(guò)程變得非常困難。一種常見的數(shù)據(jù)處理方法是特征歸一化normalization---減均值除以標(biāo)準(zhǔn)差;數(shù)據(jù)0中心化,方差為1.

mean = train_data.mean(axis=0)
train_data -= mean # 減去均值
std = train_data.std(axis=0) # 特征標(biāo)準(zhǔn)差
train_data /= std
test_data -= mean #測(cè)試集處理:使用訓(xùn)練集的均值和標(biāo)準(zhǔn)差;不用重新計(jì)算
test_data /= std

模型構(gòu)建

由于數(shù)據(jù)集數(shù)據(jù)量過(guò)小,模型也不能太復(fù)雜,否則容易發(fā)生過(guò)擬合。

from keras import models
from keras import layers

def build_model():
    model = models.Sequential()

    model.add(layers.Dense(64, activation='relu',input_shape=(train_data.shape[1],)))
    model.add(layers.Dense(64, activation='relu'))
    model.add(layers.Dense(1))

    model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])

    return model

模型的最后一層只有一個(gè)神經(jīng)元,沒有激活函數(shù)--相當(dāng)于一個(gè)線性層。這種處理方法常用在單標(biāo)量回歸問(wèn)題中。使用激活函數(shù)將會(huì)限制輸出結(jié)果的范圍,比如使用sigmoid激活函數(shù),輸出結(jié)果在0~1之間。這里,因?yàn)樽詈笠粚又皇且粋€(gè)線性層,模型的輸出結(jié)果可能是任意值。
模型的損失函數(shù)為mse均方誤差。監(jiān)測(cè)的指標(biāo)為mean absolute error(MAE)平均絕對(duì)誤差---兩個(gè)結(jié)果之間差的絕對(duì)值。

K折交叉驗(yàn)證

當(dāng)調(diào)整模型參數(shù)時(shí),為了評(píng)估模型,我們通常將數(shù)據(jù)集分成訓(xùn)練集和驗(yàn)證集。但是當(dāng)數(shù)據(jù)量過(guò)小時(shí),驗(yàn)證集數(shù)目也變得很小,導(dǎo)致驗(yàn)證集上的評(píng)估結(jié)果相互之間差異性很大---與訓(xùn)練集和測(cè)試集的劃分結(jié)果相關(guān)。評(píng)估結(jié)果可信度不高。
最好的評(píng)估方式是采用K折交叉驗(yàn)證--將數(shù)據(jù)集分成K份(K=4或5),實(shí)例化K個(gè)模型,每個(gè)模型在K-1份數(shù)據(jù)上進(jìn)行訓(xùn)練,在1份數(shù)據(jù)上進(jìn)行評(píng)估,最后用K次評(píng)估分?jǐn)?shù)的平均值做最后的評(píng)估結(jié)果。

image
import numpy as np

k = 4
num_val_samples = len(train_data) // k
num_epochs = 100
all_scores = []
for i in range(k):
    print('processing fold #',i)
    val_data = train_data[i*num_val_samples : (i+1)*num_val_samples] # 劃分出驗(yàn)證集部分
    val_targets = train_targets[i*num_val_samples : (i+1)*num_val_samples]

    partial_train_data = np.concatenate([train_data[:i*num_val_samples],train_data[(i+1)* num_val_samples:] ],axis=0) # 將訓(xùn)練集拼接到一起
    partial_train_targets = np.concatenate([train_targets[:i*num_val_samples],train_targets[(i+1)* num_val_samples:] ],axis=0)

    model = build_model()
    model.fit(partial_train_data,partial_train_targets,epochs=num_epochs,batch_size=16,verbose=0)#模型訓(xùn)練silent模型
    val_mse, val_mae = model.evaluate(val_data, val_targets, verbose=0) # 驗(yàn)證集上評(píng)估
    all_scores.append(val_mae)
    

模型訓(xùn)練

model = build_model()
model.fit(train_data, train_targets,epochs=80, batch_size=16, verbose=0)

test_mse_score, test_mae_score = model.evaluate(test_data, test_targets)# score 2.5532484335057877

小結(jié)

  • 回歸問(wèn)題:損失函數(shù)通常為MSE均方誤差;
  • 模型評(píng)估監(jiān)測(cè)指標(biāo)通常為MAE(mean absolute error);
  • 當(dāng)數(shù)據(jù)取值范圍不一致時(shí),需要對(duì)特征進(jìn)行預(yù)處理;
  • 數(shù)據(jù)量小時(shí),可以采用K折驗(yàn)證來(lái)衡量模型;
  • 數(shù)據(jù)量小時(shí),模型復(fù)雜度也應(yīng)該相應(yīng)的簡(jiǎn)單,可以避免模型過(guò)擬合。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 3.6 房?jī)r(jià)預(yù)測(cè):線性回歸 前面兩個(gè)例子都可以看成是分類問(wèn)題,它的目標(biāo)是預(yù)測(cè)某個(gè)輸入數(shù)據(jù)點(diǎn)的單個(gè)離散label。常...
    神機(jī)喵算閱讀 1,612評(píng)論 0 1
  • 本內(nèi)容為Udacity課程波士頓房?jī)r(jià)預(yù)測(cè)項(xiàng)目,歡迎閱讀,有錯(cuò)的地方請(qǐng)留言。僅參考不建議作為其他用途。 優(yōu)達(dá)學(xué)城畢業(yè)...
    MrMiaow閱讀 14,555評(píng)論 1 18
  • 機(jī)器學(xué)習(xí)工程師納米學(xué)位 模型評(píng)價(jià)與驗(yàn)證 項(xiàng)目 : 預(yù)測(cè)波士頓房?jī)r(jià) 第一步. 導(dǎo)入數(shù)據(jù) 在這個(gè)項(xiàng)目中,你將利用馬薩諸...
    代號(hào)027閱讀 3,947評(píng)論 0 1
  • 剛剛看著我可愛的室友在寢室練習(xí)明天朗誦課上的上下臺(tái)姿勢(shì),朗誦內(nèi)容,認(rèn)真的樣子一下子就想起大一剛剛認(rèn)識(shí)她的時(shí)候。 最...
    小益讀書閱讀 358評(píng)論 2 4
  • 剛才媽媽打電話說(shuō),老家的四舅舅去世了。就在四舅媽去世一周年忌日的那天。十月份才剛剛通過(guò)電話,不久之后就發(fā)現(xiàn)得了癌癥...
    多啦A夢(mèng)的竹蜻蜓閱讀 271評(píng)論 0 0

友情鏈接更多精彩內(nèi)容