Basé sur le cas de combat réel de TensorFlow : prédiction de la température (avec code Python complet et ensemble de données)


Bonjour à tous, aujourd'hui, je voudrais partager avec vous un petit cas d'apprentissage en profondeur TensorFlow2.0.

Contenu du cas : il existe 348 échantillons de données de température, chaque échantillon a 8 valeurs propres et 1 valeur cible, et une prédiction de régression est effectuée pour construire un modèle de réseau de neurones. Le code complet et les données peuvent être obtenus à la fin de l'article.Si vous l'aimez, n'oubliez pas de le mettre en signet et de l'aimer.

1. Acquisition de données

Importez les fichiers de bibliothèque requis pour obtenir les données de température

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 représente la température la plus élevée d'avant-hier, temp_1 représente la température la plus élevée d'hier et la valeur cible prévue est réelle

2. Visualisation des données

Pour dessiner une courbe date-température , nous devons d'abord combiner les caractéristiques année, mois et jour dans une chaîne, puis la convertir en données de type date/heure.

# 处理时间数据,将年月日组合在一起
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]

Après avoir traité les données de l'axe des x, dessinons maintenant une courbe pour plusieurs entités

# 可视化,对各个特征绘图
# 指定绘图风格
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. Traitement des fonctionnalités

Nous devons d'abord diviser les valeurs propres et les valeurs cibles. Extrayez les valeurs propres et les valeurs cibles des données d'origine, et la « réelle » stocke la température la plus élevée de la journée.

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

Puisqu'il y a des données de type chaîne dans les valeurs propres, la colonne 'week' contient toutes les chaînes , nous devons donc effectuer un encodage à chaud sur les valeurs propres pour convertir le type chaîne en un type numérique .

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

Après le traitement des données de chaîne, toutes les données deviennent numériques. Afin d'éviter le problème de faible précision du modèle dû à des unités de données différentes et à de grandes portées, les données numériques sont normalisées.

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

À ce stade, le traitement des données d'origine est terminé, puis le modèle de réseau neuronal est construit.

4. Construire un modèle de réseau

Nous utilisons la méthode de modélisation Keras, et les paramètres couramment utilisés sont les suivants :

activation: fonction d'activation, choisissez généralement relu

kernel_initializer, bias_initializer : La méthode d'initialisation des paramètres de poids et de biais , il est parfois préférable de changer la méthode d'initialisation si elle ne converge pas

kernel_regularizer, bias_regularizer : régularisation des poids et des biais

entrées : entrée

unités : le nombre de neurones

Référence pour toutes les méthodes de paramétrage : Module : tf | TensorFlow Core v2.7.0 (google.cn)

(1) Construction du réseau

Tout d'abord, nous importons le modèle de séquence keras , tf.keras.Sequential() , et ajoutons des couches réseau couche par couche en séquence. les couches représentent différents niveaux de mise en œuvre.

Le nombre de neurones dans chaque couche cachée peut être modifié à volonté. Vous pouvez l'essayer vous-même. Nous devons prédire la température la plus élevée ici, donc un seul neurone est nécessaire dans la couche de valeur de sortie. Les méthodes d'initialisation du poids sont différentes, vous pouvez trouver celle qui convient dans le document ci-dessus.

# 构建层次
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) Optimiseur et fonction de perte

Ensuite, vous devez spécifier l' optimiseur et la fonction de perte model.compile() , où l'optimiseur utilise la descente de gradient et la fonction de perte utilise l'erreur quadratique moyenne MSE. Chacun doit choisir en fonction de ses propres tâches, et le choix de la fonction de perte a un grand impact sur les résultats du réseau.

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

(3) Formation réseau

Une fois la formulation terminée, la formation peut être démarrée, la fonction de formation réseau model.fit() . Valeur de caractéristique d'entrée input_features, cibles de valeur cible, validation_split=0,25 signifie que l'ensemble de test est extrait des données d'entrée avec 0,25 pour le test, epochs signifie que le nombre d'itérations est de 100 et chaque itération a 128 échantillons.

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

En retournant la perte d'apprentissage et la perte de test, on constate qu'après 100 itérations, la perte de l'ensemble d'apprentissage de 24,675 et la perte de l'ensemble de test de 29,01 ne sont pas très différentes, ce qui prouve qu'il n'y a pas de phénomène de sur-ajustement . Si la perte de l'ensemble d'apprentissage est faible et que la perte de l'ensemble de test est très importante, cela signifie qu'il y a sur-ajustement et que les paramètres doivent être ajustés.

(4) Structure du modèle de réseau

Nous pouvons également regarder la structure du modèle de réseau que nous avons construit, model.summary() , la couche cachée 1 a 240 paramètres, comment est-elle calculée ? La forme de la couche d'entrée est [348, 14], avec 14 caractéristiques ; la forme de la première couche entièrement connectée W est [14, 16], 16 représente le nombre de caractéristiques de la couche cachée 1, et la forme du le paramètre de biais b est [ 1,16], y=Wx+b. Par conséquent, le nombre de paramètres est 14*16+16=240.

(5) Résultats de prédiction

Fonction de prédiction du modèle de réseau model.predict()

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

Nous faisons ici des prédictions pour tous les échantillons afin de comparer la différence entre les résultats prédits et les résultats réels

5. Affichage des résultats

Dessinez simplement un nuage de points pour voir, vous pouvez voir que les résultats prédits et les résultats réels sont à peu près les mêmes, avec un léger écart. Les étudiants intéressés peuvent poursuivre l'ingénierie des fonctionnalités et ajuster les paramètres pour obtenir de meilleurs résultats.

# 真实值,蓝色实现
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()

Code complet et données

Le code complet et les données ont été placés en arrière-plan, il suffit de répondre par mot-clé

Si vous souhaitez rejoindre l'échange technique, la meilleure façon de faire une remarque lors de l'ajout est : source + direction d'intérêt, ce qui est pratique pour trouver des amis partageant les mêmes idées

Méthode ①, Ajouter l'ID WeChat : dkl88191, Remarques : de CSDN + Température
Méthode ②, Numéro public de recherche WeChat : Apprentissage Python et exploration de données, réponse en arrière-plan : température

Je suppose que tu aimes

Origine blog.csdn.net/m0_59596937/article/details/127193340
conseillé
Classement