Tensorflow?2.1完成對(duì)MPG回歸預(yù)測(cè)詳解
前言
本文的主要內(nèi)容是使用 cpu 版本的 tensorflor-2.1 完成對(duì) Auto MPG 數(shù)據(jù)集的回歸預(yù)測(cè)任務(wù)。
獲取 Auto MPG 數(shù)據(jù)并進(jìn)行數(shù)據(jù)的歸一化處理
(1)Auto MPG 數(shù)據(jù)集描述了汽車(chē)燃油效率的特征值和標(biāo)簽值,我們通過(guò)模型的學(xué)習(xí)可以從特征中找到規(guī)律,最后以最小的誤差來(lái)預(yù)測(cè)目標(biāo) MPG 。
(2)我們使用 keras 自帶的函數(shù)可以直接從網(wǎng)絡(luò)上下載數(shù)據(jù)保存到本地。
(3)每行都包含 MPG 、氣缸、排量、馬力、重量、加速、車(chē)型年份、原產(chǎn)地等八列數(shù)據(jù),其中 MPG 就是我們的標(biāo)簽值,其他都是特征。
dataset_path = keras.utils.get_file("auto-mpg.data", "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data") column_names = ['MPG','氣缸','排量','馬力','重量', '加速', '車(chē)型年份', '原產(chǎn)地'] raw_dataset = pd.read_csv(dataset_path, names=column_names, na_values = "?", comment='\t', sep=" ", skipinitialspace=True) dataset = raw_dataset.copy()
對(duì)數(shù)據(jù)進(jìn)行處理
(1)因?yàn)閿?shù)據(jù)中存在一些空值,會(huì)影響我們對(duì)于特征的計(jì)算和目標(biāo)的預(yù)測(cè),所以將數(shù)據(jù)中存在空數(shù)據(jù)的行刪除掉。
dataset = dataset.dropna()
(2)因?yàn)?ldquo;原產(chǎn)地”這一列總共只有 1、2、3 三種值,分別表示三個(gè)國(guó)家,所以我們將他們各自提出來(lái)單獨(dú)做成一列,這樣就相當(dāng)于給每個(gè)國(guó)家類(lèi)別轉(zhuǎn)換成了 ont-hot 。
origin = dataset.pop('原產(chǎn)地') dataset['阿美莉卡'] = (origin == 1)*1.0 dataset['毆們'] = (origin == 2)*1.0 dataset['小日本子'] = (origin == 3)*1.0
(3)按照一定的比例,取 90% 的數(shù)據(jù)為訓(xùn)練數(shù)據(jù),取 10% 的數(shù)據(jù)為測(cè)試數(shù)據(jù)。
train_datas = dataset.sample(frac=0.9, random_state=0) test_datas = dataset.drop(train_dataset.index)
(4) 這里主要是使用一些內(nèi)置的函數(shù)來(lái)查看訓(xùn)練集對(duì)每一列數(shù)據(jù)的各種常見(jiàn)的統(tǒng)計(jì)指標(biāo)情況,主要有 count、mean、std、min、25%、50%、75%、max ,這樣省去了我們后邊的計(jì)算,直接使用即可。
train_stats = train_datas.describe() train_stats.pop("MPG") train_stats = train_stats.transpose()
(5)數(shù)據(jù)中的 MPG 就是我們需要預(yù)測(cè)的回歸目標(biāo),我們將這一列從訓(xùn)練集和測(cè)試集中彈出,單獨(dú)做成標(biāo)簽。 MPG 意思就是 Miles per Gallon ,這是一個(gè)衡量一輛汽車(chē)在郵箱中只加一加侖汽油或柴油時(shí)可以行駛多少英里的中要指標(biāo)。
train_labels = train_datas.pop('MPG') test_labels = test_datas.pop('MPG')
(6)這里主要是對(duì)訓(xùn)練數(shù)據(jù)和測(cè)試數(shù)據(jù)進(jìn)行歸一化,將每個(gè)特征應(yīng)獨(dú)立縮放到相同范圍,因?yàn)楫?dāng)輸入數(shù)據(jù)特征值存在不同范圍時(shí),不利于模型訓(xùn)練的快速收斂,我在文章最后的第七節(jié)中放了一張沒(méi)有進(jìn)行數(shù)據(jù)歸一化后模型訓(xùn)練評(píng)估指標(biāo),可以看到很雜亂無(wú)章。
def norm(stats, x): return (x - stats['mean']) / stats['std'] train_datas = norm(train_stats, train_datas) test_datas = norm(train_stats, test_datas)
搭建深度學(xué)習(xí)模型
搭建深度學(xué)習(xí)模型、并完成模型的配置和編譯
這里主要是搭建深度學(xué)習(xí)模型、配置模型并編譯模型。
(1)模型主要有三層:
- 第一層主要是一個(gè)全連接層操作,將每個(gè)樣本的所有特征值輸入,通過(guò) relu 激活函數(shù)的非線(xiàn)性變化,最后輸出一個(gè) 64 維的向量。
- 第二層主要是一個(gè)全連接層操作,將上一層的 64 維的向量,通過(guò) relu 激活函數(shù)的非線(xiàn)性變化,最后輸出一個(gè) 32 維的向量。
- 第三層主要是一個(gè)全連接層操作,將上一層的 32 維的向量,最后輸出一個(gè) 1 維的結(jié)果,這其實(shí)就是輸出預(yù)測(cè)的回 MPG 。
(2)模型中優(yōu)化器這里選用 RMSprop ,學(xué)習(xí)率為 0.001 。
(3)模型中的損失值指標(biāo)是 MSE ,MSE 其實(shí)就是均方差,該統(tǒng)計(jì)參數(shù)是模型預(yù)測(cè)值和原始樣本的 MPG 值誤差的平方和的均值。
(4)模型的評(píng)估指標(biāo)選用 MAE 和 MSE ,MSE 和上面的一樣,MAE 是平均絕對(duì)誤差,該統(tǒng)計(jì)參數(shù)指的就是模型預(yù)測(cè)值與原始樣本的 MPG 之間絕對(duì)誤差的平均值。
def build_model(): model = keras.Sequential([ layers.Dense(64, activation='relu', input_shape=[len(train_datas.keys())]), layers.Dense(32, activation='relu'), layers.Dense(1) ]) optimizer = tf.keras.optimizers.RMSprop(0.001) model.compile(loss='mse', optimizer=optimizer, metrics=['mae', 'mse']) return model model = build_model()
使用 EarlyStoping 完成模型訓(xùn)練
(1)這里使用訓(xùn)練集數(shù)據(jù)和標(biāo)簽進(jìn)行模型訓(xùn)練,總共需要進(jìn)行 1000 個(gè) epoch ,并且在訓(xùn)練過(guò)程中選取訓(xùn)練數(shù)據(jù)的 20% 作為驗(yàn)證集來(lái)評(píng)估模型效果,為了避免存在過(guò)擬合的現(xiàn)象,這里我們用 EarlyStopping 技術(shù)來(lái)進(jìn)行優(yōu)化,也就是當(dāng)經(jīng)過(guò)一定數(shù)量的 epoch (我們這里定義的是 20 )后沒(méi)有改進(jìn)效果,則自動(dòng)停止訓(xùn)練。
early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=20) history = model.fit(train_datas, train_labels, epochs=1000, validation_split = 0.2, verbose=2, callbacks=[early_stop])
訓(xùn)練過(guò)程的指標(biāo)輸出如下,可以看到到了第 106 次 epoch 之后就停止了訓(xùn)練:
Train on 282 samples, validate on 71 samples Epoch 1/1000 282/282 - 0s - loss: 567.8865 - mae: 22.6320 - mse: 567.8865 - val_loss: 566.0270 - val_mae: 22.4126 - val_mse: 566.0270 Epoch 2/1000 282/282 - 0s - loss: 528.5458 - mae: 21.7937 - mse: 528.5459 - val_loss: 526.6008 - val_mae: 21.5748 - val_mse: 526.6008 ... Epoch 105/1000 282/282 - 0s - loss: 6.1971 - mae: 1.7478 - mse: 6.1971 - val_loss: 5.8991 - val_mae: 1.8962 - val_mse: 5.8991 Epoch 106/1000 282/282 - 0s - loss: 6.0749 - mae: 1.7433 - mse: 6.0749 - val_loss: 5.7558 - val_mae: 1.8938 - val_mse: 5.7558
(2)這里也展示的是模型在訓(xùn)練過(guò)程,使用訓(xùn)練集和驗(yàn)證集的 mae 、mse 繪制的兩幅圖片,我們可以看到在到達(dá) 100 多個(gè) epoch 之后,訓(xùn)練過(guò)程就終止了,避免了模型的過(guò)擬合。
使用測(cè)試數(shù)據(jù)對(duì)模型進(jìn)行評(píng)估
loss, mae, mse = model.evaluate(test_datas, test_labels, verbose=2) print("測(cè)試集的 MAE 為: {:5.2f} MPG ,MSE 為 : {:5.2f} MPG".format(mae, mse))
輸出結(jié)果為:
測(cè)試集的 MAE 為: 2.31 MPG ,MSE 為 : 9.12 MPG
使用模型進(jìn)行預(yù)測(cè)
我們選取了一條測(cè)試數(shù)據(jù),使用模型對(duì)其 MPG 進(jìn)行預(yù)測(cè)。
predictions = model.predict(test_data[:1]).flatten() predictions
結(jié)果為 :
array([15.573855], dtype=float32)
而實(shí)際的測(cè)試樣本數(shù)據(jù) MPG 為 15.0 ,可以看出與預(yù)測(cè)值有 0.573855 的誤差,其實(shí)我們還可以搭建更加復(fù)雜的模型,選擇更加多的特征來(lái)進(jìn)行模型的訓(xùn)練,理論上可以達(dá)到更小的預(yù)測(cè)誤差。
展示沒(méi)有進(jìn)行歸一化操作的訓(xùn)練過(guò)程
我們將沒(méi)有進(jìn)行歸一化的數(shù)據(jù)在訓(xùn)練過(guò)程中的指標(biāo)情況進(jìn)行展示,可以看出來(lái)訓(xùn)練的指標(biāo)雜亂無(wú)章。所以一般情況下我們推薦對(duì)數(shù)據(jù)做歸一化,有利于模型訓(xùn)練的快速收斂。
以上就是Tensorflow 2.1完成對(duì)MPG回歸預(yù)測(cè)詳解的詳細(xì)內(nèi)容,更多關(guān)于Tensorflow MPG回歸預(yù)測(cè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- TensorFlow卷積神經(jīng)網(wǎng)絡(luò)MNIST數(shù)據(jù)集實(shí)現(xiàn)示例
- TensorFlow神經(jīng)網(wǎng)絡(luò)創(chuàng)建多層感知機(jī)MNIST數(shù)據(jù)集
- TensorFlow教程Softmax邏輯回歸識(shí)別手寫(xiě)數(shù)字MNIST數(shù)據(jù)集
- Tensorflow2.1實(shí)現(xiàn)文本中情感分類(lèi)實(shí)現(xiàn)解析
- Tensorflow?2.4加載處理圖片的三種方式詳解
- Tensorflow2.1 MNIST圖像分類(lèi)實(shí)現(xiàn)思路分析
相關(guān)文章
Win7與Win10下的Tensorboard可視化問(wèn)題
這篇文章主要介紹了Win7與Win10下的Tensorboard可視化問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09Python 實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)-堆棧和隊(duì)列的操作方法
隊(duì)、棧和鏈表一樣,在數(shù)據(jù)結(jié)構(gòu)中非常基礎(chǔ)一種數(shù)據(jù)結(jié)構(gòu),同樣他們也有各種各樣、五花八門(mén)的變形和實(shí)現(xiàn)方式。這篇文章主要介紹了Python 實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)-堆棧和隊(duì)列的操作方法,需要的朋友可以參考下2019-07-07python小球落地問(wèn)題及解決(遞歸函數(shù))
這篇文章主要介紹了python小球落地問(wèn)題及解決(遞歸函數(shù)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05解決Python print輸出不換行沒(méi)空格的問(wèn)題
今天小編就為大家分享一篇解決Python print輸出不換行沒(méi)空格的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11詳解Python prometheus_client使用方式
本文主要介紹了Python prometheus_client使用方式,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Python實(shí)現(xiàn)Excel表格轉(zhuǎn)置與翻譯工具
本文主要介紹如何使用Python編寫(xiě)一個(gè)GUI程序,能夠讀取Excel文件,將第一個(gè)列的數(shù)據(jù)轉(zhuǎn)置,并將英文內(nèi)容翻譯成中文,有需要的小伙伴可以參考一下2024-10-10