最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python基于Tensorflow2.X實現(xiàn)汽車油耗預(yù)測

 更新時間:2023年02月08日 09:26:03   作者:嘟粥yyds  
這篇文章主要為大家詳細介紹了Python基于Tensorflow2.X實現(xiàn)汽車油耗預(yù)測的相關(guān)方法,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下

一、開發(fā)環(huán)境

集成開發(fā)工具:jupyter notebook 6.5.2

集成開發(fā)環(huán)境:Python 3.10.6

第三方庫:tensorflow-gpu、numpy、matplotlib.pyplot、pandas

二 、代碼實現(xiàn)

2.1 準備操作

2.1.1 導入所需模塊

tensorflow若非GPU版本也可

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers, datasets, losses
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

2.1.2 matplotlib無法正常顯示中文的解決方案(若無此情況可跳過)

博主由于已在matplotlib的配置文件中做了一系列修改,故可以正常顯示中文,若出現(xiàn)無法正常顯示中文的情況有以下兩種解決方案:

1、在導入模塊后加上下列兩行代碼(每次需要正常顯示中文時都需要加):

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用來正常顯示中文標簽
plt.rcParams['axes.unicode_minus'] = False  # 用來正常顯示負號

2、在matplotlib的源文件中做了一系列修改(一勞永逸)

運行下列代碼

import matplotlib
print(matplotlib.matplotlib_fname())

會輸出配置文件路徑,如:(進入python配置目錄因人而異,只需從\LocalCache之后開始關(guān)注)

C:\Users\31600\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\matplotlib\mpl-data\matplotlibrc

打開此文件,找到#font.family:和#font.sans-serif:開頭的這兩行,將兩行的注釋#去掉,并在font.sans-serif:后添加自己想加入的中文字體名,如:(博主選用的打開方式為visual studio2017,不同的打開方式顯示可能略有不同另博主打開演示前已完成去注釋操作)

最后保存文件,重新運行python環(huán)境即可,不必在代碼中做出任何修改。

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

# 在線下載汽車效能數(shù)據(jù)集
dataset_path = keras.utils.get_file("auto-mpg.data", 
"http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data")
# 字段有效能(公里數(shù)每加侖) 氣缸數(shù) 排量 馬力 重量 加速度 型號年份 產(chǎn)地
column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
 'Acceleration', 'Model Year', 'Origin']
raw_dataset = pd.read_csv(dataset_path, names=column_names,
 na_values = "?", comment='\t',
 sep=" ", skipinitialspace=True)

各字段含義

dataset = raw_dataset.copy()
# 查看部分數(shù)據(jù)
dataset.head(8)

2.3 數(shù)據(jù)處理

2.3.1 數(shù)據(jù)清洗

原始數(shù)據(jù)可能含有空字段(缺失值)的數(shù)據(jù)項

isna()會返回為包含無效值的表單,再追加一個sum()實現(xiàn)計算無效值的和;其次,對無效數(shù)據(jù)進行處理;dropna()清除無效數(shù)據(jù)后返回一個新數(shù)據(jù)表單;

begin = dataset.isna().sum()  # 統(tǒng)計空白數(shù)據(jù)
dataset = dataset.dropna()  # 刪除空白數(shù)據(jù)項
end = dataset.isna().sum()  # 再次統(tǒng)計空白數(shù)據(jù)
print(f'========統(tǒng)計前:========\n{begin}\n========統(tǒng)計后:========\n{end}')
# 輸出結(jié)果:
========統(tǒng)計前:========
MPG             0
Cylinders       0
Displacement    0
Horsepower      6
Weight          0
Acceleration    0
Model Year      0
Origin          0
dtype: int64
========統(tǒng)計后:========
MPG             0
Cylinders       0
Displacement    0
Horsepower      0
Weight          0
Acceleration    0
Model Year      0
Origin          0
dtype: int64

2.3.2 數(shù)據(jù)轉(zhuǎn)換

由于Origin字段為類型數(shù)據(jù),我們將其移除,并轉(zhuǎn)換為新的3個字段:USA、Europe和Japan。(原數(shù)據(jù)里分別對應(yīng)1、2、3)

將需要的產(chǎn)源地分類序號從表中提取出來,使用pop(‘Origin’)提取Origin列的數(shù)據(jù),將Origin進行one-hot轉(zhuǎn)換——即Origin不同的值僅對應(yīng)一個數(shù)據(jù)有效;

# 先彈出(刪除并返回)Origin這一列
origin = dataset.pop('Origin')
# 根據(jù)origin列的數(shù)據(jù)來寫入新的3個列
dataset['USA'] = (origin == 1) * 1.0
dataset['Europe'] = (origin == 2) * 1.0
dataset['Japan'] = (origin == 3) * 1.0
dataset.tail()

轉(zhuǎn)換后的數(shù)據(jù)為:

2.3.3 數(shù)據(jù)集劃分

利用sample()函數(shù)將數(shù)據(jù)集拆分為0.8的數(shù)據(jù)集和0.2的測試集,并且移除已經(jīng)取出的數(shù)據(jù)下標包含的數(shù)據(jù)并返回作為測試集

# 切分為訓練集和測試集
train_dataset = dataset.sample(frac=0.8, random_state=0)
test_dataset = dataset.drop(train_dataset.index)

describe()用于觀察一系列數(shù)據(jù)的范圍,統(tǒng)計訓練集的各個字段數(shù)值的均值和標準差,大小、波動趨勢等。從獲得的數(shù)據(jù)中獲得訓練數(shù)據(jù)的標簽,即移除的MPG列數(shù)據(jù) 

# 查看訓練集的輸入x的統(tǒng)計數(shù)據(jù)
train_stats = train_dataset.describe()
train_stats = train_stats.transpose()  # 轉(zhuǎn)置
train_stats

2.3.4 真實值設(shè)定

將MPG字段移除為標簽數(shù)據(jù)

# 移動MPG油耗效能這一列為真實標簽Y
train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')

2.3.5 標準化數(shù)據(jù)

統(tǒng)計訓練集的各個字段數(shù)值的均值和標準差,并完成數(shù)據(jù)的標準化

# 標準化數(shù)據(jù)
def norm(x):
    # 減去每個字段的均值并除以標準差
    return (x - train_stats['mean']) / train_stats['std']
 
normed_train_data = norm(train_dataset)  # 標準化訓練集
normed_test_data = norm(test_dataset)  # 標準化測試集
print(f'訓練集大小:{normed_train_data.shape}  {train_labels.shape}')
print(f"測試集大小:{normed_test_data.shape}  {test_labels.shape}")
normed_train_data  # 查看數(shù)據(jù)處理后的訓練集
# 利用切分的訓練集構(gòu)建數(shù)據(jù)集對象
train_db = tf.data.Dataset.from_tensor_slices((normed_train_data.values, train_labels.values))  # 構(gòu)建Dataset對象
# 為防止數(shù)據(jù)標準化后出現(xiàn)梯度彌散,切分訓練集,分為幾個batch,加速計算
train_db = train_db.shuffle(100).batch(32)  # 隨機打散,批量化
 
# 輸出結(jié)果:
訓練集大小:(314, 9)  (314,)
測試集大小:(78, 9)  (78,)

2.3.6 查看各字段對MPG的影響

# 創(chuàng)建同y軸的上下三聯(lián)圖,需要plt.subplots()
fig, axes = plt.subplots(nrows=1,ncols=3,sharey=True,figsize=(20,6)) 
fig.suptitle('各個字段對MPG的影響', fontsize=16)
#subplot1
axes[0].scatter(train_dataset['Cylinders'].to_numpy(), train_labels.to_numpy(), color='b',s=20)
axes[0].set_xlabel('Cylinders', fontsize=13)
axes[0].set_ylabel('MPG', fontsize=14)
#subplot2
axes[1].scatter(train_dataset['Displacement'].to_numpy(), train_labels.to_numpy(), color='b',s=20)
axes[1].set_xlabel('Displacement', fontsize=13)
#subplot3
axes[2].scatter(train_dataset['Weight'].to_numpy(), train_labels.to_numpy(), color='b',s=20)
axes[2].set_xlabel('Weight', fontsize=13)
 
#展示圖片
plt.show()

2.4 創(chuàng)建網(wǎng)絡(luò)

因為該數(shù)據(jù)集比較小,我們只創(chuàng)建一個3層的全連接網(wǎng)絡(luò)來完成MPG值的預(yù)測任務(wù)。 我們將網(wǎng)絡(luò)實現(xiàn)為一個自定義網(wǎng)絡(luò)類,只需要在初始化函數(shù)中創(chuàng)建各個子網(wǎng)絡(luò)層,并在前向計算函數(shù) call 中實現(xiàn)自定義網(wǎng)絡(luò)類的計算邏輯即可。自定義網(wǎng)絡(luò)類繼承自 keras.Model 基類,這也是自定義網(wǎng)絡(luò)類的標準寫法,以方便地利用 keras.Model 基類提供 的 trainable_variables、save_weights 等各種便捷功能。 

class Network(keras.Model):
    # 回歸網(wǎng)絡(luò)模型
    def __init__(self):
        super(Network, self).__init__()
        # 創(chuàng)建3個全連接層
        self.fc1 = layers.Dense(64, activation='relu', name='Layer1')
        self.fc2 = layers.Dense(64, activation='relu', name='Layer2')
        self.fc3 = layers.Dense(1, name='OutputLayer')
        
    def call(self, inputs, training=None, mask=None):
        # 依次通過3個全連接層
        x = self.fc1(inputs)
        x = self.fc2(x)
        x = self.fc3(x)
        return x

2.5 訓練與測試

在訓練網(wǎng)絡(luò)時,一般的流程是通過前向計算獲得網(wǎng)絡(luò)的輸出值, 再通過損失函數(shù)計算網(wǎng)絡(luò)誤差,然后通過自動求導工具計算梯度并更新,同時間隔性地測試網(wǎng)絡(luò)的性能。

所以,在完成網(wǎng)絡(luò)模型的搭建后,需要指定網(wǎng)絡(luò)使用的優(yōu)化器對象、 損失函數(shù)類型, 評價指標等設(shè)定,這一步稱為裝配。這里只指定網(wǎng)絡(luò)使用的優(yōu)化器對象,損失函數(shù)在梯度求導時在指定

# 創(chuàng)建網(wǎng)絡(luò)類實例
model = Network()
# 通過build函數(shù)完成內(nèi)部張量的創(chuàng)建(其中4為任意設(shè)置的batch量,9為輸入特征長度)
model.build(input_shape=(4, 9))
# 打印網(wǎng)絡(luò)信息
model.summary()
# 創(chuàng)建優(yōu)化器,指定學習率為0.001
optimizers = tf.keras.optimizers.RMSprop(0.001)

# 接下來實現(xiàn)網(wǎng)絡(luò)訓練部分。通過 Epoch 和 Step 組成的雙層循環(huán)訓練網(wǎng)絡(luò),共訓練 200 個 Epoch
Epoch =  np.arange(0, 200)
train_MAE = np.zeros(200)
test_MAE = np.zeros(200)
 
for epoch in range(200):
    for step, (x, y) in enumerate(train_db):  # 遍歷依次訓練集
        # 梯度記錄器
        with tf.GradientTape() as tape:
            out = model(x)  # 通過網(wǎng)絡(luò)獲得輸出
            loss = tf.reduce_mean(losses.MSE(y, out))
            mae_loss = tf.reduce_mean(losses.MAE(y, out)) # 計算 MAE
            # 計算梯度并更新
            grads = tape.gradient(loss, model.trainable_variables)
            Optimizers.apply_gradients(zip(grads, model.trainable_variables))
    train_MAE[epoch] = float(mae_loss)
    out = model(tf.constant(normed_test_data.values))
    test_MAE[epoch] = tf.reduce_mean(losses.MAE(test_labels, out))

2.6 誤差結(jié)果可視化

對于回歸問題,除了 MSE 均方差可以用來模型的測試性能,還可以用平均絕對誤差(Mean Absolute Error,簡稱 MAE)來衡量模型的性能,程序運算時記錄每個 Epoch 結(jié)束時的訓練和測試 MAE 數(shù)據(jù),并繪制變化曲線

plt.xlabel('Epoch')
plt.ylabel('MAE')
plt.plot(Epoch, train_MAE, label="Train")
plt.plot(Epoch, test_MAE, label="Test")
plt.title('汽車油耗實戰(zhàn)')
plt.legend(['Train', 'Test'])  # 設(shè)置折線名稱
plt.show()

三 、結(jié)果分析

可以觀察到,在訓練到約第 25 個 Epoch 時, MAE 的下降變得較緩慢,其中訓練集的 MAE

還在繼續(xù)不斷波動,但是測試集 MAE 幾乎保持不變,因此可以在約第 25 個 epoch 時提前結(jié)束訓練,并利用此時的網(wǎng)絡(luò)參數(shù)來預(yù)測新的輸入樣本即可。

以上就是Python基于Tensorflow2.X實現(xiàn)汽車油耗預(yù)測的詳細內(nèi)容,更多關(guān)于Python汽車油耗預(yù)測的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • python操作MySQL的詳細教程

    python操作MySQL的詳細教程

    PyMySQL 是一個純 Python 的庫,用于連接 MySQL 數(shù)據(jù)庫,并執(zhí)行 SQL 語句,該庫的主要用途是通過 Python 代碼與 MySQL 數(shù)據(jù)庫進行交互,比如執(zhí)行查詢、插入數(shù)據(jù)、更新數(shù)據(jù)、刪除數(shù)據(jù)等操作,本文介紹了python操作MySQL的詳細教程,需要的朋友可以參考下
    2024-10-10
  • Python?pluggy框架使用示例代碼

    Python?pluggy框架使用示例代碼

    這篇文章主要介紹了Python?pluggy框架基礎(chǔ)用法總結(jié),本文通過三個例子結(jié)合代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • 利用Python查看微信共同好友功能的實現(xiàn)代碼

    利用Python查看微信共同好友功能的實現(xiàn)代碼

    這篇文章主要介紹了利用Python查看微信共同好友功能的實現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2019-04-04
  • python調(diào)用支付寶支付接口流程

    python調(diào)用支付寶支付接口流程

    這篇文章主要介紹了python調(diào)用支付寶支付接口流程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Python實現(xiàn)繪制3D條形圖的示例詳解

    Python實現(xiàn)繪制3D條形圖的示例詳解

    這篇文章主要為大家學習介紹了如何利用Python實現(xiàn)繪制3D條形圖,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-07-07
  • python 創(chuàng)建一維的0向量實例

    python 創(chuàng)建一維的0向量實例

    今天小編就為大家分享一篇python 創(chuàng)建一維的0向量實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • 用Python一鍵搭建Http服務(wù)器的方法

    用Python一鍵搭建Http服務(wù)器的方法

    今天小編就為大家分享一篇用Python一鍵搭建Http服務(wù)器的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • CNN的Pytorch實現(xiàn)(LeNet)

    CNN的Pytorch實現(xiàn)(LeNet)

    本文主要從CNN的Pytorch實現(xiàn)庫導入,模型定義,數(shù)據(jù)加載、處理,模型訓練,代碼匯總等方面入手介紹,運用代碼講解相關(guān)內(nèi)容非常的詳細,大家如果有需要了解相關(guān)知識的可以參考這篇文章
    2021-09-09
  • Django靜態(tài)文件配置request對象方法ORM操作講解

    Django靜態(tài)文件配置request對象方法ORM操作講解

    這篇文章主要為大家介紹了Django靜態(tài)文件配置request對象方法ORM操作,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • python3連接kafka模塊pykafka生產(chǎn)者簡單封裝代碼

    python3連接kafka模塊pykafka生產(chǎn)者簡單封裝代碼

    今天小編就為大家分享一篇python3連接kafka模塊pykafka生產(chǎn)者簡單封裝代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12

最新評論

凤阳县| 旬阳县| 通化县| 洪洞县| 会泽县| 兴隆县| 惠安县| 自治县| 乐安县| 七台河市| 辽阳市| 铅山县| 济南市| 双鸭山市| 永吉县| 昔阳县| 泊头市| 温泉县| 镇雄县| 青岛市| 玛沁县| 沙湾县| 明光市| 通州区| 平南县| 隆尧县| 衡东县| 太谷县| 平江县| 澄城县| 平和县| 普宁市| 民乐县| 青冈县| 廉江市| 德阳市| 陇川县| 邯郸市| 淮北市| 道真| 类乌齐县|