MINISTERE DE L’ENSEIGNEMENT REPUBLIQUE TOGOLAISE
Travail-Liberté-Patrie
SUPERIEUR ET DE LA RECHERCHE
………………
UNIVERSITE DE LOME (UL)
ECOLE POLYTECHNIQUE DE LOME
DEPARTEMENT DE GENIE ELECTRIQUE
PARCOURS : LP-GE-S4
Introduction à l’algorithme, à la programmation et aux bases de
donnéés :
( INF1426 )
PREDICTION DE LA PUISSANCE ACTIVE PAR RNA RELU BASEE SUR
QUATRE PARAMETRES METEROLOGIQUES
Présenté par : Responsable de l’UE :
ADONKOR Koudjovi Emmanuel Mr. APALOO BARA
ANNEE : 2024-2025
Sommaire
Introduction ...............................................................................................................................................2
1. Contexte du projet .................................................................................................................................2
2. Objectifs du projet ................................................................................................................................. 3
I. Présentation du Projet ...................................................................................................................4
2.1. Description Générale ........................................................................................................ 4
2.2. Objectifs Fonctionnels ...................................................................................................... 4
2.3. Fonctionnalités Principales ............................................................................................... 4
II. Développement & Implémentation ...................................................................................................... 5
3.1. Étapes de développement ................................................................................................ 5
Chargement et nettoyage des données .................................................................................................... 5
Prétraitement des données .......................................................................................................................5
Séparation des ensembles .........................................................................................................................5
Définition du modèle .................................................................................................................................5
Entraînement du modèle .......................................................................................................................... 5
Évaluation du modèle ................................................................................................................................6
Visualisation automatique .........................................................................................................................6
3.2. Outils et technologies utilisés ........................................................................................... 6
III. Visualisation & Graphiques ..........................................................................................................7
5.1. Courbe d’apprentissage (Loss et MAE) .............................................................................7
5.2. Valeurs Réelles vs Prédictions ...........................................................................................7
5.3. Courbe des Résidus ...........................................................................................................8
5.4. Histogramme des Résidus .................................................................................................9
5.5. Histogramme des Erreurs Absolues ..................................................................................9
5.6. Boxplot Réel vs Prédiction ................................................................................................ 9
5.7. Scatter Prédictions vs Variable A .................................................................................... 10
5.8. Résidus vs Prédictions .....................................................................................................11
5.9. Matrice de Corrélation ....................................................................................................11
6. Détail du Code .............................................................................................................................17
6.1. Chargement et Prétraitement des Données ...................................................................17
Conclusion ............................................................................................................................................... 20
ANNEE : 2024-2025 1
Introduction
Dans un monde où les technologies numériques occupent une place de plus en plus
centrale, le traitement des données et la prédiction de variables complexes sont
devenus des enjeux clés dans de nombreux domaines, notamment l’énergie, la
météorologie, l’éducation ou encore la santé. C’est dans ce contexte que s’inscrit le
projet modèle neuronal pour l’estimation de grandeurs continues à partir de
données tabulaires .
Ce projet a pour objectif de développer un modèle intelligent capable de prédire une
variable continue (la Puissance) à partir de plusieurs facteurs environnementaux.
Pour cela, nous avons utilisé des outils modernes d’intelligence artificielle, en
particulier un réseau de neurones artificiels implémenté avec PyTorch, une
bibliothèque puissante et flexible pour le machine learning.
Au-delà de la simple prédiction, le projet vise également à :
Comprendre les relations entre les différentes variables d’entrée (pluie, vent,
humidité, etc.)
Fournir des visualisations graphiques interprétables des performances du
modèle
Mettre en place une chaîne de traitement complète, depuis les données brutes
jusqu'à l'analyse des résultats
Grâce à une approche basée sur la science des données et l’apprentissage
automatique, modèle neuronal pour l’estimation de grandeurs continues à partir de
données tabulaires illustre la capacité des réseaux de neurones à modéliser des
systèmes complexes de manière autonome, évolutive et performante.
1. Contexte du projet
La prévision de variables continues telles que la puissance énergétique (électrique ou
thermique) est un enjeu majeur dans plusieurs domaines : gestion des réseaux,
optimisation de la production, monitoring environnemental ou encore pilotage
intelligent des équipements.
Face à la complexité et la variabilité des facteurs influençant ces mesures (pluie,
humidité, vent, couverture nuageuse, etc.), les méthodes traditionnelles atteignent
leurs limites. D’où l’intérêt d’utiliser des modèles d’apprentissage automatique,
capables d’apprendre automatiquement les relations non linéaires entre ces
variables.
ANNEE : 2024-2025 2
Le projet modèle neuronal pour l’estimation de grandeurs continues à partir de
données tabulaires s’inscrit dans cette dynamique en proposant une approche basée
sur les réseaux de neurones, grâce à la bibliothèque PyTorch, pour offrir un modèle
prédictif moderne, efficace et visuellement interprétable.
2. Objectifs du projet
Les objectifs du projet sont à la fois techniques, analytique et pédagogiques :
✅ Objectifs techniques
Développer un réseau de neurones (multi-couches) pour la régression
Automatiser le traitement des données : nettoyage, normalisation, conversion
Implémenter un pipeline complet d’apprentissage supervisé
✅ Objectifs analytiques
Évaluer la qualité du modèle via des métriques (R², MAE, RMSE)
Générer et interpréter 10 courbes graphiques pour analyser les erreurs, les
résidus, les corrélations, etc.
Identifier les variables les plus pertinentes dans la prédiction
✅ Objectifs pédagogiques / démonstratifs
Montrer l’utilité du deep learning dans un cas réel de régression
Créer une base réutilisable pour d’autres projets similaires
Favoriser l’analyse visuelle pour une meilleure compréhension des résultats
ANNEE : 2024-2025 3
I. Présentation du Projet
2.1. Description Générale
Le projet modèle neuronal pour l’estimation de grandeurs continues à partir de
données tabulaires consiste à développer un système de prédiction basé sur
l’intelligence artificielle, capable d’estimer une valeur de puissance à partir de
données environnementales mesurées. Le nom du projet reflète l’idée d’un outil
ouvert, accessible, basé sur des prédictions fiables, précises, et compréhensibles.
Le cœur du système repose sur un réseau de neurones artificiels conçu avec PyTorch,
une bibliothèque open-source spécialisée dans le deep learning. Ce réseau apprend
à modéliser la relation entre plusieurs variables explicatives et une variable cible
continue, en l’occurrence la puissance (électrique, thermique ou autre, selon le cas
d’usage).
2.2. Objectifs Fonctionnels
Le projet vise à :
Prédire avec précision une valeur continue à partir de données tabulaires
Visualiser et analyser les performances du modèle à travers 10 courbes
spécifiques
Créer un flux de traitement automatisé, de la lecture du fichier Excel à l’export
des graphiques
Proposer une solution réutilisable et adaptable à d’autres jeux de données
2.3. Fonctionnalités Principales
Chargement automatique des données depuis un fichier Excel (ADK7.xlsx)
Prétraitement : remplacement des valeurs manquantes, normalisation
Entraînement d’un modèle de régression basé sur un réseau de neurones
Génération automatique de 10 graphiques :
Courbe d’apprentissage (MSE, MAE)
Prédictions vs Réel
Résidus (erreurs)
Matrice de corrélation, etc.
Sauvegarde automatique des graphiques dans un dossier prédéfini
ANNEE : 2024-2025 4
II. Développement & Implémentation
3.1. Étapes de développement
Le développement du projet modèle neuronal pour l’estimation de grandeurs
continues à partir de données tabulaires a suivi une approche progressive en
plusieurs étapes clés :
Chargement et nettoyage des données
Lecture du fichier Excel contenant les données d’entrée (variables
météorologiques) et la variable cible (puissance).
Remplacement des valeurs manquantes par la moyenne de chaque colonne.
Prétraitement des données
Séparation des variables d’entrée (X) et de sortie (y).
Normalisation via StandardScaler (de Scikit-learn) pour faciliter l’apprentissage
du modèle.
Conversion des données en tenseurs PyTorch.
Séparation des ensembles
Répartition des données en ensemble d’entraînement (80%) et de test (20%)
avec train_test_split.
L'ensemble de test est utilisé uniquement pour l’évaluation finale.
Définition du modèle
Construction d’un réseau de neurones à 3 couches :
Entrée → 16 neurones → ReLU
16 neurones → 8 neurones → ReLU
8 neurones → sortie (1 valeur continue)
Entraînement du modèle
Utilisation de l'algorithme Adam pour l’optimisation.
Fonction de perte : erreur quadratique moyenne (MSE)
Boucle d’apprentissage sur 100 époques, avec suivi de la perte (loss) et de
l’erreur absolue moyenne (MAE).
ANNEE : 2024-2025 5
Évaluation du modèle
Calcul des performances sur les données de test :
R² (coefficient de détermination)
RMSE (root mean squared error)
MAE (mean absolute error)
Inverse transformation des données pour revenir aux unités d’origine avant
l’évaluation.
Visualisation automatique
Génération de 10 graphiques permettant de visualiser l'apprentissage, les
erreurs, les prédictions, les corrélations, etc.
Sauvegarde automatique de chaque graphique dans un dossier spécifique
(Downloads/graphs_pytorch/).
3.2. Outils et technologies utilisés
Outils/Bibliothèques Rôle dans le projet
Python3 Langage principal
PyTorch Construction et entraînement du
réseau
Pandas Chargement et traitement des
données Excel
NumPy Opérations numériques
Normalisation, découpage des données,
Scikit-learn métriques
Matplotlib Visualisation graphique
Seaborn Heatmap de corrélation
ANNEE : 2024-2025 6
III. Visualisation & Graphiques
Pour une meilleure compréhension et analyse des performances du modèle, dix
graphiques ont été générés automatiquement à différentes étapes du projet. Ces
visualisations apportent un éclairage complet sur la qualité de la prédiction et le
comportement du modèle.
5.1. Courbe d’apprentissage (Loss et MAE)
La courbe d’apprentissage montre l’évolution de la fonction de perte (MSE) et de
l’erreur absolue moyenne (MAE) pendant les 100 époques d’entraînement. Une
baisse régulière de ces métriques indique un apprentissage efficace du modèle.
5.2. Valeurs Réelles vs Prédictions
ANNEE : 2024-2025 7
Ce graphique en dispersion compare les valeurs réelles aux valeurs prédites par le
modèle sur l’ensemble de test. L’idéal est que les points soient alignés le long de la
diagonale, ce qui confirme la précision des prédictions.
5.3. Courbe des Résidus
La courbe des résidus représente la différence entre les valeurs réelles et prédites.
L’analyse de cette courbe permet de détecter des biais, des erreurs systématiques
ou la présence d’outliers.
ANNEE : 2024-2025 8
5.4. Histogramme des Résidus
L’histogramme des résidus visualise la distribution des erreurs. Une distribution
centrée autour de zéro et symétrique est signe d’un bon ajustement du modèle.
5.5. Histogramme des Erreurs Absolues
Cette représentation met en évidence la fréquence des erreurs en valeur absolue,
utile pour identifier la dispersion et la concentration des erreurs.
5.6. Boxplot Réel vs Prédiction
ANNEE : 2024-2025 9
Le boxplot permet de comparer visuellement la distribution statistique (médiane,
quartiles, valeurs extrêmes) des valeurs réelles et prédites.
5.7. Scatter Prédictions vs Variable A
Ce graphique compare les prédictions et les valeurs réelles en fonction de la variable
explicative ‘A’ (normalisée), afin d’observer la relation entre la variable d’entrée et la
sortie.
ANNEE : 2024-2025 10
5.8. Résidus vs Prédictions
Cette représentation permet d’observer si les erreurs sont distribuées aléatoirement
ou s’il existe un biais en fonction des valeurs prédites.
5.9. Matrice de Corrélation
La heatmap de corrélation des variables originales met en évidence les relations
linéaires entre les différentes variables du dataset avant normalisation.
ANNEE : 2024-2025 11
Code source
import os
import pandas as pd
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error,
mean_absolute_error, r2_score
import matplotlib.pyplot as plt
import seaborn as sns
# Création du dossier de destination
download_dir = os.path.join(os.path.expanduser("~"),
"Downloads", "graphs_pytorch")
os.makedirs(download_dir, exist_ok=True)
# Chargement des données
file_path = r"ADK7.xlsx"
data = pd.read_excel(file_path)
data.columns = ['A', 'B', 'C', 'D', 'E']
# Remplacement des valeurs manquantes par la moyenne
data = data.apply(lambda col: col.fillna(col.mean()) if
col.isna().sum() > 0 else col)
# Séparation des données
X = data[['A', 'B', 'C', 'D', 'E']].values
y = data['E'].values
# Normalisation
scaler_X = StandardScaler()
scaler_y = StandardScaler()
X = scaler_X.fit_transform(X)
y = scaler_y.fit_transform(y.reshape(-1, 1)).flatten()
# Conversion en tenseurs PyTorch
X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.float32).view(-1, 1)
ANNEE : 2024-2025 12
# Train/test split
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2, random_state=42)
# Modèle PyTorch
class RegressionNet(nn.Module):
def __init__(self):
super(RegressionNet, self).__init__()
self.fc1 = nn.Linear(5, 16)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(16, 8)
self.output = nn.Linear(8, 1)
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.output(x)
return x
model = RegressionNet()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
# Entraînement
epochs = 100
losses = []
maes = []
for epoch in range(epochs):
model.train()
optimizer.zero_grad()
outputs = model(X_train)
loss = criterion(outputs, y_train)
loss.backward()
optimizer.step()
# Calcul MAE train
mae_epoch = torch.mean(torch.abs(outputs -
y_train)).item()
maes.append(mae_epoch)
losses.append(loss.item())
ANNEE : 2024-2025 13
if (epoch + 1) % 10 == 0:
print(f" Époque {epoch + 1}/{epochs}, Perte:
{loss.item():.4f}, MAE: {mae_epoch:.4f}")
# Évaluation
model.eval()
with torch.no_grad():
predictions = model(X_test).numpy()
y_test_np = y_test.numpy()
predictions_rescaled =
scaler_y.inverse_transform(predictions)
y_test_rescaled =
scaler_y.inverse_transform(y_test_np.reshape(-1, 1))
mse = mean_squared_error(y_test_rescaled,
predictions_rescaled)
mae = mean_absolute_error(y_test_rescaled,
predictions_rescaled)
r2 = r2_score(y_test_rescaled, predictions_rescaled)
print(f"\n Résultats du modèle PyTorch:")
print(f"R² : {r2:.4f}")
print(f"RMSE : {np.sqrt(mse):.4f}")
print(f"MAE : {mae:.4f}")
# 1. Courbe de la loss
plt.figure(figsize=(10, 4))
plt.plot(range(1, epochs + 1), losses, label='Loss (MSE)')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.title("Courbe d'apprentissage")
plt.grid(True)
plt.legend()
plt.savefig(os.path.join(download_dir,
"1_loss_curve.png"))
plt.close()
# 2. Courbe d'évolution du MAE
plt.figure(figsize=(10, 4))
plt.plot(range(1, epochs + 1), maes, label='MAE (train)',
color='orange')
plt.xlabel('Epoch')
plt.ylabel('MAE')
plt.title("Évolution du MAE")
ANNEE : 2024-2025 14
plt.grid(True)
plt.legend()
plt.savefig(os.path.join(download_dir, "2_mae_curve.png"))
plt.close()
# 3. Réel vs Prédictions
plt.figure(figsize=(8, 6))
plt.scatter(y_test_rescaled, predictions_rescaled,
color='blue', alpha=0.6)
plt.plot([y_test_rescaled.min(), y_test_rescaled.max()],
[y_test_rescaled.min(), y_test_rescaled.max()],
'r--')
plt.xlabel('Valeurs réelles')
plt.ylabel('Prédictions')
plt.title('Valeurs réelles vs Prédictions')
plt.grid(True)
plt.savefig(os.path.join(download_dir,
"3_reel_vs_prediction.png"))
plt.close()
# 4. Courbe des résidus
residus = y_test_rescaled.flatten() -
predictions_rescaled.flatten()
plt.figure(figsize=(10, 4))
plt.plot(residus, marker='o', linestyle='', alpha=0.6)
plt.axhline(0, color='red', linestyle='--')
plt.title("Courbe des résidus")
plt.xlabel("Index")
plt.ylabel("Erreur")
plt.grid(True)
plt.savefig(os.path.join(download_dir,
"4_residus_curve.png"))
plt.close()
# 5. Histogramme des résidus
plt.figure(figsize=(8, 4))
plt.hist(residus, bins=30, color='purple',
edgecolor='black', alpha=0.7)
plt.title("Histogramme des résidus")
plt.xlabel("Erreur")
plt.ylabel("Fréquence")
plt.grid(True)
plt.savefig(os.path.join(download_dir,
"5_residus_histogram.png"))
ANNEE : 2024-2025 15
plt.close()
# 6. Histogramme des erreurs absolues
erreurs_absolues = np.abs(residus)
plt.figure(figsize=(8, 4))
plt.hist(erreurs_absolues, bins=30, color='green',
edgecolor='black', alpha=0.7)
plt.title("Histogramme des erreurs absolues")
plt.xlabel("Erreur absolue")
plt.ylabel("Fréquence")
plt.grid(True)
plt.savefig(os.path.join(download_dir,
"6_abs_errors_histogram.png"))
plt.close()
# 7. Boxplot Réel vs Prédiction
plt.figure(figsize=(8, 4))
plt.boxplot([y_test_rescaled.flatten(),
predictions_rescaled.flatten()],
labels=['Réel', 'Prédiction'])
plt.title("Boxplot Réel vs Prédiction")
plt.grid(True)
plt.savefig(os.path.join(download_dir,
"7_boxplot_reel_vs_pred.png"))
plt.close()
# 8. Scatter Prédictions vs Variable A
plt.figure(figsize=(8, 6))
plt.scatter(X_test[:, 0].numpy(), predictions_rescaled,
alpha=0.6, label='Prédictions', color='orange')
plt.scatter(X_test[:, 0].numpy(), y_test_rescaled,
alpha=0.6, label='Réel', color='blue')
plt.xlabel('Variable A (normalisée)')
plt.ylabel('Valeurs')
plt.title("Prédictions vs Réel - Variable A")
plt.legend()
plt.grid(True)
plt.savefig(os.path.join(download_dir,
"8_scatter_variable_A.png"))
plt.close()
# 9. Résidus vs Prédictions
plt.figure(figsize=(8, 6))
plt.scatter(predictions_rescaled, residus, alpha=0.6)
ANNEE : 2024-2025 16
plt.axhline(0, color='red', linestyle='--')
plt.xlabel("Valeurs prédites")
plt.ylabel("Résidus")
plt.title("Résidus vs Prédictions")
plt.grid(True)
plt.savefig(os.path.join(download_dir,
"9_residus_vs_prediction.png"))
plt.close()
# 10. Matrice de corrélation
plt.figure(figsize=(8, 6))
sns.heatmap(data.corr(), annot=True, cmap='coolwarm',
fmt=".2f")
plt.title("Matrice de corrélation des variables")
plt.savefig(os.path.join(download_dir,
"10_correlation_heatmap.png"))
plt.close()
print(f"\n Toutes les courbes ont été enregistrées dans :
{download_dir}")
6. Détail du Code
6.1. Chargement et Prétraitement des Données
file_path = r"ADK7.xlsx"
data = pd.read_excel(file_path)
data.columns = ['A', 'B', 'C', 'D', 'E']
# Remplacement des valeurs manquantes par la moyenne
data = data.apply(lambda col: col.fillna(col.mean()) if
col.isna().sum() > 0 else col)
Le fichier Excel est chargé via pandas.
Les colonnes sont renommées pour une meilleure lisibilité.
Les valeurs manquantes sont remplacées par la moyenne de leur colonne
respective afin d’éviter des erreurs pendant l’entraînement.
6.2. Préparation des Variables
ANNEE : 2024-2025 17
X = data[['A', 'B', 'C', 'D', 'E']].values
y = data['E'].values
# Normalisation
scaler_X = StandardScaler()
scaler_y = StandardScaler()
X = scaler_X.fit_transform(X)
y = scaler_y.fit_transform(y.reshape(-1, 1)).flatten()
Les variables explicatives X et la cible y sont extraites.
Une normalisation standard (moyenne 0, écart-type 1) est appliquée sur les
deux pour optimiser la convergence du modèle.
6.3. Conversion en Tenseurs PyTorch et Split
X = torch.tensor(X, dtype=torch.float32)
y = torch.tensor(y, dtype=torch.float32).view(-1, 1)
# Train/test split
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2, random_state=42)
Conversion des données normalisées en tenseurs PyTorch pour le traitement par
le réseau.
Séparation des données en ensembles d’entraînement et de test (80%/20%).
6.4. Définition du Modèle de Réseau de Neurones
class RegressionNet(nn.Module):
def __init__(self):
super(RegressionNet, self).__init__()
self.fc1 = nn.Linear(5, 16)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(16, 8)
self.output = nn.Linear(8, 1)
def forward(self, x):
x = self.relu(self.fc1(x))
x = self.relu(self.fc2(x))
x = self.output(x)
return x
Le modèle est une régression multi-couches avec deux couches cachées
utilisant la fonction d’activation ReLU.
La couche de sortie produit une valeur continue unique, adaptée à la prédiction.
ANNEE : 2024-2025 18
6.5. Entraînement du Modèle
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
# Entraînement
epochs = 100
losses = []
maes = []
for epoch in range(epochs):
model.train()
optimizer.zero_grad()
outputs = model(X_train)
loss = criterion(outputs, y_train)
loss.backward()
optimizer.step()
Utilisation de la fonction de perte MSE pour mesurer l’erreur quadratique.
Optimisation via l’algorithme Adam, adapté aux réseaux profonds.
Pour chaque époque, le modèle fait une passe avant, calcule la perte, puis
ajuste les poids via rétropropagation.
6.6. Évaluation et Visualisation
model.eval()
with torch.no_grad():
predictions = model(X_test).numpy()
y_test_np = y_test.numpy()
predictions_rescaled =
scaler_y.inverse_transform(predictions)
Le modèle est mis en mode évaluation pour désactiver la mise à jour des poids.
Les prédictions sont calculées sur l’ensemble test, puis retransformées dans leur
échelle originale pour l’interprétation.
ANNEE : 2024-2025 19
Conclusion
Le projet modèle neuronal pour l’estimation de grandeurs continues à partir de
données tabulaires a permis de démontrer l'efficacité des réseaux de neurones
artificiels pour la prédiction de variables continues à partir de données
environnementales. Grâce à l'utilisation de bibliothèques modernes telles que
PyTorch, Pandas, Scikit-learn et Matplotlib, une solution complète et automatisée a
été mise en place, allant du traitement des données à l’analyse graphique des
résultats.
Le modèle entraîné a atteint des performances satisfaisantes sur les données de test,
comme en témoignent les métriques calculées (R², RMSE, MAE) et les visualisations
associées. Ces éléments confirment que l'approche est non seulement viable, mais
également adaptable à d'autres types de données ou cas d’usage similaires.
En plus de l’aspect technique, le projet a été l’occasion de mettre en œuvre une
démarche rigoureuse de développement : préparation des données, modélisation,
évaluation, et restitution visuelle. Il constitue une base solide pour aller plus loin, en
explorant des modèles plus complexes ou des fonctionnalités avancées comme
l’optimisation hyperparamétrique ou la mise en production.
ANNEE : 2024-2025 20