Basierend auf dem tatsächlichen Kampffall von TensorFlow: Temperaturvorhersage (mit vollständigem Python-Code und Datensatz)


Hallo zusammen, heute möchte ich mit Ihnen einen kleinen Fall von TensorFlow2.0 Deep Learning teilen.

Fallinhalt: Es gibt 348 Temperaturprobendaten, jede Probe hat 8 Eigenwerte und 1 Zielwert, und es wird eine Regressionsvorhersage durchgeführt, um ein neuronales Netzwerkmodell zu erstellen. Den vollständigen Code und die Daten erhalten Sie am Ende des Artikels. Wenn es Ihnen gefällt, denken Sie daran, ein Lesezeichen zu setzen und es zu mögen.

1. Datenerfassung

Importieren Sie die erforderlichen Bibliotheksdateien, um Temperaturdaten zu erhalten

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)数据获取
filepath = 'C:\\...\\temps.csv'
features = pd.read_csv(filepath)

temp_2 stellt die höchste Temperatur vorgestern dar, temp_1 stellt die höchste Temperatur gestern dar und der vorhergesagte Zielwert ist tatsächlich

2. Datenvisualisierung

Um eine Datum-Temperatur-Kurve zu zeichnen , müssen wir zuerst die Merkmale Jahr, Monat und Tag zu einer Zeichenfolge kombinieren und sie dann in Daten vom Typ Datum /Uhrzeit konvertieren.

# 处理时间数据,将年月日组合在一起
import datetime
# 获取年月日数据
years = features['year']
months = features['month']
days = features['day']

# 将年月日拼接在一起--字符串类型
dates = []  # 用于存放组合后的日期
for year,month,day in zip(years,months,days):
    date = str(year)+'-'+str(month)+'-'+str(day)  #年月日之间用'-'向连接
    dates.append(date)

# 转变成datetime格式
times = []
for date in dates:
    time = datetime.datetime.strptime(date,'%Y-%m-%d')
    times.append(time)
# 看一下前5行
times[:5]

Nachdem wir die Daten der x-Achse verarbeitet haben, zeichnen wir nun eine Kurve für mehrere Merkmale

# 可视化,对各个特征绘图
# 指定绘图风格
plt.style.use('fivethirtyeight')
# 设置画布,2行2列的画图窗口,第一行画ax1和ax2,第二行画ax3和ax4
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(20,10))

# ==1== actual特征列
ax1.plot(times,features['actual'])
# 设置x轴y轴标签和title标题
ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('actual temp')
# ==2== 前一天的温度
ax2.plot(times,features['temp_1'])
# 设置x轴y轴标签和title标题
ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('temp_1')
# ==3== 前2天的温度
ax3.plot(times,features['temp_2'])
# 设置x轴y轴标签和title标题
ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('temp_2')
# ==4== friend
ax4.plot(times,features['friend'])
# 设置x轴y轴标签和title标题
ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4.set_title('friend')
# 轻量化布局调整绘图
plt.tight_layout(pad=2)

3. Merkmalsverarbeitung

Zuerst müssen wir Eigenwerte und Zielwerte dividieren. Extrahieren Sie Eigenwerte und Sollwerte aus den Originaldaten, und „Ist“ speichert die höchste Temperatur des Tages.

# 获取目标值y,从Series类型变成数组类型
targets = np.array(features['actual'])
# 获取特征值x,即在原数据中去掉目标值列,默认删除行,需要指定轴axis=1指向列
features = features.drop('axtual',axis=1)
# 把features从DateFrame变成数组类型
features = np.array(features)

Da die Eigenwerte Zeichenfolgendaten enthalten, enthält die Spalte „Woche“ nur Zeichenfolgen , sodass wir eine One-Hot-Codierung für die Eigenwerte durchführen müssen, um den Zeichenfolgentyp in einen numerischen Typ umzuwandeln .

# week列是字符串,重新编码,变成数值型
features = pd.get_dummies(features)

Nach der Verarbeitung der Zeichenfolgendaten werden alle Daten numerisch. Um dem Problem der geringen Modellgenauigkeit aufgrund unterschiedlicher Dateneinheiten und großer Spannweiten vorzubeugen, werden die numerischen Daten standardisiert.

# 导入标准化方法库
from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)

An diesem Punkt ist die Verarbeitung der Originaldaten beendet, und dann wird das neuronale Netzwerkmodell konstruiert.

4. Erstellen Sie ein Netzwerkmodell

Wir verwenden die Keras-Modellierungsmethode und die häufig verwendeten Parameter sind wie folgt:

Aktivierung: Aktivierungsfunktion, wählen Sie im Allgemeinen relu

kernel_initializer, bias_initializer: Die Initialisierungsmethode von Gewichtungs- und Bias-Parametern , manchmal ist es besser, die Initialisierungsmethode zu ändern, wenn sie nicht konvergiert

kernel_regularizer, bias_regularizer: Regularisierung von Gewichtungen und Bias

Eingänge: Eingang

Einheiten: die Anzahl der Neuronen

Referenz für alle Parametereinstellungsmethoden: Modul: tf | TensorFlow Core v2.7.0 (google.cn)

(1) Netzwerkaufbau

Zuerst importieren wir das Keras -Sequenzmodell tf.keras.Sequential() und fügen nacheinander Schicht für Schicht Netzwerkschichten hinzu. Schichten stellen verschiedene Ebenen der Implementierung dar.

Die Anzahl der Neuronen in jeder verborgenen Schicht kann beliebig verändert werden, Sie können es selbst ausprobieren.Wir müssen hier die höchste Temperatur vorhersagen, daher wird nur ein Neuron in der Ausgabewertschicht benötigt. Die Gewichtungsinitialisierungsmethoden sind unterschiedlich, Sie können die entsprechende im obigen Dokument finden.

# 构建层次
model = tf.keras.Sequential()
# 隐含层1设置16层,权重初始化方法设置为随机高斯分布,加入正则化惩罚项
model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# 隐含层2设置32层
model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# 输出层设置为1,即输出一个预测结果
model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))

(2) Optimierer und Verlustfunktion

Als Nächstes müssen Sie den Optimierer und die Verlustfunktion model.compile() angeben , wobei der Optimierer Gradientenabstieg und die Verlustfunktion MSE Mean Squared Error verwendet. Jeder muss entsprechend seiner eigenen Aufgaben auswählen, und die Wahl der Verlustfunktion hat einen großen Einfluss auf die Ergebnisse des Netzwerks.

# 优化器和损失函数
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')

(3) Netzwerkschulung

Nachdem die Formulierung abgeschlossen ist, kann das Training gestartet werden, die Netzwerktrainingsfunktion model.fit () . Eingabefunktionswert input_features, Zielwertziele, validation_split=0,25 bedeutet, dass die Testmenge aus den Eingabedaten mit 0,25 zum Testen extrahiert wird, Epochen bedeutet, dass die Anzahl der Iterationen 100 beträgt und jede Iteration 128 Stichproben hat.

# ==3== 网络训练
model.fit(input_features,targets,validation_split=0.25,epochs=100,batch_size=128)

Wenn man den Trainingsverlust und den Testverlust zurückgibt, ist ersichtlich, dass nach 100 Iterationen der Verlust des Trainingssatzes von 24,675 und der Verlust des Testsatzes von 29,01 nicht viel anders sind, was beweist, dass es kein Phänomen der Überanpassung gibt . Wenn der Verlust des Trainingssatzes gering und der Verlust des Testsatzes sehr groß ist, bedeutet dies, dass eine Überanpassung vorliegt und die Parameter angepasst werden müssen.

(4) Struktur des Netzwerkmodells

Wir können uns auch die von uns erstellte Netzwerkmodellstruktur ansehen, model.summary() , die verborgene Schicht 1 hat 240 Parameter, wie wird sie berechnet? Die Form der Eingabeschicht ist [348, 14] mit 14 Merkmalen; die Form der ersten vollständig verbundenen Schicht W ist [14, 16], 16 repräsentiert die Anzahl von Merkmalen der verborgenen Schicht 1 und die Form der Bias-Parameter b ist [ 1,16], y=Wx+b. Daher beträgt die Anzahl der Parameter 14*16+16=240.

(5) Vorhersageergebnisse

Vorhersagefunktion für Netzwerkmodelle model.predict()

# ==5== 预测模型结果
predict = model.predict(input_features)

Wir machen hier Vorhersagen für alle Proben, um die Differenz zwischen den vorhergesagten Ergebnissen und den tatsächlichen Ergebnissen zu vergleichen

5. Ergebnisanzeige

Zeichnen Sie einfach ein Streudiagramm, um zu sehen, dass die vorhergesagten Ergebnisse und die tatsächlichen Ergebnisse mit einer leichten Abweichung ungefähr gleich sind. Interessierte Studenten können das Feature Engineering weiter durchführen und Parameter anpassen, um bessere Ergebnisse zu erzielen.

# 真实值,蓝色实现
fig = plt.figure(figsize=(10,5))
axes = fig.add_subplot(111)
axes.plot(dates,targets,'bo',label='actual')
# 预测值,红色散点
axes.plot(dates,predict,'ro',label='predict')
axes.set_xticks(dates[::50])
axes.set_xticklabels(dates[::50],rotation=45)

plt.legend()
plt.show()

Vollständiger Code und Daten

Der komplette Code und die Daten wurden in den Hintergrund gestellt, antworten Sie einfach mit einem Stichwort

Wenn Sie am technischen Austausch teilnehmen möchten, geben Sie beim Hinzufügen am besten Folgendes an: Quelle + Interessenrichtung, was praktisch ist, um gleichgesinnte Freunde zu finden

Methode ①, WeChat-ID hinzufügen: dkl88191, Bemerkungen: von CSDN+ Temperatur
Methode ②, WeChat-Suche öffentliche Nummer: Python-Lernen und Data Mining, Hintergrundantwort: Temperatur

おすすめ

転載: blog.csdn.net/m0_59596937/article/details/127193340