【神经网络】(1) 简单网络,实例:气温预测,附python完整代码和数据集
各位同學(xué)好,今天和大家分享一下TensorFlow2.0深度學(xué)習(xí)中的一個(gè)小案例。案例內(nèi)容:現(xiàn)有348個(gè)氣溫樣本數(shù)據(jù),每個(gè)樣本有8項(xiàng)特征值和1項(xiàng)目標(biāo)值,進(jìn)行回歸預(yù)測(cè),構(gòu)建神經(jīng)網(wǎng)絡(luò)模型。
數(shù)據(jù)集免費(fèi):神經(jīng)網(wǎng)絡(luò)回歸預(yù)測(cè)--氣溫?cái)?shù)據(jù)集-機(jī)器學(xué)習(xí)文檔類(lèi)資源-CSDN文庫(kù)https://download.csdn.net/download/dgvv4/49801464
1. 數(shù)據(jù)獲取
導(dǎo)入所需要的庫(kù)文件,獲取氣溫?cái)?shù)據(jù)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
# 使用keras建模方法
from tensorflow.keras import layers
import warnings
warnings.filterwarnings('ignore')#(1)數(shù)據(jù)獲取
filepath = 'C:\\...\\temps.csv'
features = pd.read_csv(filepath)
temp_2代表前天的最高溫度,temp_1代表昨天的最高溫度,預(yù)測(cè)目標(biāo)值為actual
2. 數(shù)據(jù)可視化
我們繪制日期-溫度曲線(xiàn),首先需要將特征year、month、day組合在一起,拼接成一個(gè)字符串,再轉(zhuǎn)變成一個(gè)datetime類(lèi)型的數(shù)據(jù)。
# 處理時(shí)間數(shù)據(jù),將年月日組合在一起
import datetime
# 獲取年月日數(shù)據(jù)
years = features['year']
months = features['month']
days = features['day']# 將年月日拼接在一起--字符串類(lèi)型
dates = [] # 用于存放組合后的日期
for year,month,day in zip(years,months,days):date = str(year)+'-'+str(month)+'-'+str(day) #年月日之間用'-'向連接dates.append(date)# 轉(zhuǎn)變成datetime格式
times = []
for date in dates:time = datetime.datetime.strptime(date,'%Y-%m-%d')times.append(time)
# 看一下前5行
times[:5]
處理好了x軸的數(shù)據(jù),我們現(xiàn)在來(lái)對(duì)幾個(gè)特征繪制曲線(xiàn)
# 可視化,對(duì)各個(gè)特征繪圖
# 指定繪圖風(fēng)格
plt.style.use('fivethirtyeight')
# 設(shè)置畫(huà)布,2行2列的畫(huà)圖窗口,第一行畫(huà)ax1和ax2,第二行畫(huà)ax3和ax4
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(20,10))# ==1== actual特征列
ax1.plot(times,features['actual'])
# 設(shè)置x軸y軸標(biāo)簽和title標(biāo)題
ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('actual temp')
# ==2== 前一天的溫度
ax2.plot(times,features['temp_1'])
# 設(shè)置x軸y軸標(biāo)簽和title標(biāo)題
ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('temp_1')
# ==3== 前2天的溫度
ax3.plot(times,features['temp_2'])
# 設(shè)置x軸y軸標(biāo)簽和title標(biāo)題
ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('temp_2')
# ==4== friend
ax4.plot(times,features['friend'])
# 設(shè)置x軸y軸標(biāo)簽和title標(biāo)題
ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4.set_title('friend')
# 輕量化布局調(diào)整繪圖
plt.tight_layout(pad=2)
3. 特征處理
首先我們需要?jiǎng)澐痔卣髦岛湍繕?biāo)值。在原數(shù)據(jù)中提取特征值和目標(biāo)值,'actual'存放的是當(dāng)日最高溫度。
# 獲取目標(biāo)值y,從Series類(lèi)型變成數(shù)組類(lèi)型
targets = np.array(features['actual'])
# 獲取特征值x,即在原數(shù)據(jù)中去掉目標(biāo)值列,默認(rèn)刪除行,需要指定軸axis=1指向列
features = features.drop('axtual',axis=1)
# 把features從DateFrame變成數(shù)組類(lèi)型
features = np.array(features)
由于特征值中存在字符串類(lèi)型的數(shù)據(jù),'week'列都是字符串,因此我們需要對(duì)特征值進(jìn)行one-hot編碼,將字符串類(lèi)型轉(zhuǎn)變成數(shù)值類(lèi)型。
# week列是字符串,重新編碼,變成數(shù)值型
features = pd.get_dummies(features)
處理完字符串?dāng)?shù)據(jù)以后,所有數(shù)據(jù)變成數(shù)值型。為防止由于數(shù)據(jù)單位不一,跨度大等問(wèn)題導(dǎo)致的模型準(zhǔn)確度不高的問(wèn)題,對(duì)數(shù)值型數(shù)據(jù)進(jìn)行標(biāo)準(zhǔn)化處理?
# 導(dǎo)入標(biāo)準(zhǔn)化方法庫(kù)
from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)
到此,對(duì)原始數(shù)據(jù)的處理結(jié)束,接下來(lái)構(gòu)建神經(jīng)網(wǎng)絡(luò)模型。
4. 構(gòu)建網(wǎng)絡(luò)模型
我們使用keras建模方法,常用參數(shù)如下:
activation:?激活函數(shù),一般選relu
kernel_initializer, bias_initializer:?權(quán)重與偏置參數(shù)的初始化方法,有時(shí)候不收斂換個(gè)初始化方法就好了
kernel_regularizer, bias_regularizer:權(quán)重與偏置的正則化
inputs:輸入
units:神經(jīng)元個(gè)數(shù)
所有參數(shù)設(shè)置方法的參考:Module: tf ?|? TensorFlow Core v2.7.0 (google.cn)
(1)網(wǎng)絡(luò)搭建
首先我們導(dǎo)入keras序列模型,tf.keras.Sequential(),按順序一層一層添加網(wǎng)絡(luò)層。layers代表不同層次的實(shí)現(xiàn)。
每個(gè)隱含層的神經(jīng)元個(gè)數(shù)是隨意改變的,大家可以自己去試,我們這里需要預(yù)測(cè)最高溫度,因此輸出值層只需要一個(gè)神經(jīng)元。權(quán)重初始化方法各不相同,大家可以在上面那個(gè)文檔中尋找合適的。
# 構(gòu)建層次
model = tf.keras.Sequential()
# 隱含層1設(shè)置16層,權(quán)重初始化方法設(shè)置為隨機(jī)高斯分布,加入正則化懲罰項(xiàng)
model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# 隱含層2設(shè)置32層
model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# 輸出層設(shè)置為1,即輸出一個(gè)預(yù)測(cè)結(jié)果
model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
(2)優(yōu)化器和損失函數(shù)
接下來(lái)需要指定優(yōu)化器和損失函數(shù)?model.compile(),在這里優(yōu)化器使用梯度下降法,損失函數(shù)使用MSE均方誤差。大家要根據(jù)自己的任務(wù)來(lái)選擇,損失函數(shù)的選擇對(duì)網(wǎng)絡(luò)的結(jié)果影響很大。
# 優(yōu)化器和損失函數(shù)
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')
(3)網(wǎng)絡(luò)訓(xùn)練
制定完成后就可以開(kāi)始訓(xùn)練了,網(wǎng)絡(luò)訓(xùn)練函數(shù)?model.fit()。輸入特征值input_features,目標(biāo)值targets,validation_split=0.25指測(cè)試集在輸入數(shù)據(jù)中抽取0.25用于測(cè)試,epochs指迭代次數(shù)100次,每一次迭代128個(gè)樣本。
# ==3== 網(wǎng)絡(luò)訓(xùn)練
model.fit(input_features,targets,validation_split=0.25,epochs=100,batch_size=128)
返回訓(xùn)練損失和測(cè)試損失,可看到迭代100次后,訓(xùn)練集的損失24.675和測(cè)試集的損失29.01相差不大,證明沒(méi)有出現(xiàn)過(guò)擬合現(xiàn)象。如果出現(xiàn)訓(xùn)練集的損失很小,測(cè)試集的損失很大,說(shuō)明存在過(guò)擬合,需要調(diào)整參數(shù)。
(4)網(wǎng)絡(luò)模型結(jié)構(gòu)
我們也可以看一下我們構(gòu)建的網(wǎng)絡(luò)模型結(jié)構(gòu),model.summary(),隱含層1有240個(gè)參數(shù),它是怎么計(jì)算的呢?輸入層的shape為[348,14],14個(gè)特征;第一個(gè)全連接層W的shape為[14,16],16代表隱含層1的特征個(gè)數(shù),偏置參數(shù)b的shape為[1,16],y=Wx+b。因此參數(shù)個(gè)數(shù)為14*16+16=240。
(5)預(yù)測(cè)結(jié)果
網(wǎng)絡(luò)模型預(yù)測(cè)函數(shù) model.predict()
# ==5== 預(yù)測(cè)模型結(jié)果
predict = model.predict(input_features)
我們這里對(duì)有所的樣本都預(yù)測(cè)一下,來(lái)比較預(yù)測(cè)結(jié)果和實(shí)際結(jié)果的差異
5. 結(jié)果展示
簡(jiǎn)單繪制一個(gè)散點(diǎn)圖來(lái)看一下,可以看出預(yù)測(cè)結(jié)果和實(shí)際結(jié)果大體保持相同,稍微存在偏差。感興趣的同學(xué)可以進(jìn)一步進(jìn)行特征工程、調(diào)節(jié)參數(shù),來(lái)達(dá)到更好的效果。
# 真實(shí)值,藍(lán)色實(shí)現(xiàn)
fig = plt.figure(figsize=(10,5))
axes = fig.add_subplot(111)
axes.plot(dates,targets,'bo',label='actual')
# 預(yù)測(cè)值,紅色散點(diǎn)
axes.plot(dates,predict,'ro',label='predict')
axes.set_xticks(dates[::50])
axes.set_xticklabels(dates[::50],rotation=45)plt.legend()
plt.show()
完整代碼
# 回歸預(yù)測(cè)溫度
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
# 使用keras建模方法
from tensorflow.keras import layers
import warnings
warnings.filterwarnings('ignore')#(1)數(shù)據(jù)獲取
filepath = 'C:\\..\\temps.csv'
features = pd.read_csv(filepath)
# tenmp2代表前兩天的溫度,temp1代表前一天的溫度,目標(biāo)值為actual#(2)數(shù)據(jù)預(yù)處理
# ==1== 處理時(shí)間數(shù)據(jù),將年月日組合在一起
import datetime
# 獲取年月日數(shù)據(jù)
years = features['year']
months = features['month']
days = features['day']
# 將年月日拼接在一起--字符串類(lèi)型
dates = []
for year,month,day in zip(years,months,days):date = str(year)+'-'+str(month)+'-'+str(day)dates.append(date)
# 轉(zhuǎn)變成datetime格式
times = []
for date in dates:time = datetime.datetime.strptime(date,'%Y-%m-%d')times.append(time)
# 看一下前5行
times[:5]#(3)可視化,對(duì)各個(gè)特征繪圖
# 指定繪圖風(fēng)格
plt.style.use('fivethirtyeight')
# 設(shè)置畫(huà)布,2行2列的畫(huà)圖窗口,第一行畫(huà)ax1和ax2
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(20,10))# ==1== actual特征列
ax1.plot(times,features['actual'])
# 設(shè)置x軸y軸標(biāo)簽和title標(biāo)題
ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('actual temp')
# ==2== 前一天的溫度
ax2.plot(times,features['temp_1'])
# 設(shè)置x軸y軸標(biāo)簽和title標(biāo)題
ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('temp_1')
# ==3== 前2天的溫度
ax3.plot(times,features['temp_2'])
# 設(shè)置x軸y軸標(biāo)簽和title標(biāo)題
ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('temp_2')
# ==4== friend
ax4.plot(times,features['friend'])
# 設(shè)置x軸y軸標(biāo)簽和title標(biāo)題
ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4.set_title('friend')
# 輕量化布局調(diào)整繪圖
plt.tight_layout(pad=2)#(4)對(duì)字符型數(shù)據(jù)one-hot編碼
# week列是字符串,重新編碼,變成數(shù)值型
features = pd.get_dummies(features)#(5)劃分特征值和目標(biāo)值
# 獲取目標(biāo)值y,從Series類(lèi)型變成數(shù)值類(lèi)型
targets = np.array(features['actual'])
# 獲取特征值x,即在原數(shù)據(jù)中去掉目標(biāo)值列,默認(rèn)刪除行,需要指定軸axis=1指向列
features = features.drop('actual',axis=1)
# 把features從DateFrame變成數(shù)組
features = np.array(features)#(6)標(biāo)準(zhǔn)化處理
from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)#(7)keras構(gòu)建網(wǎng)絡(luò)模型
# ==1== 構(gòu)建層次
model = tf.keras.Sequential()
# 隱含層1設(shè)置16層,權(quán)重初始化方法設(shè)置為隨機(jī)高斯分布
# 加入正則化懲罰項(xiàng)
model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# ==2== 指定優(yōu)化器
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')
# ==3== 網(wǎng)絡(luò)訓(xùn)練
model.fit(input_features,targets,validation_split=0.25,epochs=100,batch_size=128)
# ==4== 網(wǎng)絡(luò)模型結(jié)構(gòu)
model.summary()
# ==5== 預(yù)測(cè)模型結(jié)果
predict = model.predict(input_features)#(7)展示預(yù)測(cè)結(jié)果
# 真實(shí)值,藍(lán)色實(shí)現(xiàn)
fig = plt.figure(figsize=(10,5))
axes = fig.add_subplot(111)
axes.plot(dates,targets,'bo',label='actual')
# 預(yù)測(cè)值,紅色散點(diǎn)
axes.plot(dates,predict,'ro',label='predict')
axes.set_xticks(dates[::50])
axes.set_xticklabels(dates[::50],rotation=45)plt.legend()
plt.show()
總結(jié)
以上是生活随笔為你收集整理的【神经网络】(1) 简单网络,实例:气温预测,附python完整代码和数据集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【TensorFlow2.0】(7) 张
- 下一篇: 【opencv】(1) 基础操作:图像视