Régression par MLP expliquée simplement : un guide pratique pour prédire des données continues

Fabrice SangwaFabrice Sangwa
5 min read

La capacité de prédire des valeurs continues est essentielle dans de nombreux domaines : prévisions financières, estimation de prix immobiliers, évaluation de la consommation énergétique, etc. Pour ces tâches, les méthodes linéaires montrent rapidement leurs limites dès que les relations deviennent complexes. Les réseaux de neurones, et en particulier le Perceptron Multi-Couche (MLP), apportent une solution robuste et flexible pour modéliser ces dépendances non linéaires.

Un MLP peut être utilisé efficacement en régression à condition d’adapter sa structure et ses fonctions de perte. Cet article explore pas à pas le fonctionnement d’un MLP pour la régression, illustre l'entraînement d’un modèle avec Python, et souligne les points d’attention à garder en tête.

Fonctionnement d’un MLP en régression

Un MLP est composé de plusieurs couches : une couche d’entrée, des couches cachées et une couche de sortie. Chaque neurone dans une couche effectue une opération simple : il prend les entrées, applique une combinaison linéaire (somme pondérée + biais), puis une fonction d’activation non linéaire comme ReLU ou tanh.

Pour une couche cachée, la sortie peut être décrite par la formule :

a = activation(W * x + b)

où :

  • x est l’entrée,

  • W est la matrice des poids,

  • b est le biais,

  • a est la sortie (activation).

Dans le cas d’une régression, la dernière couche ne contient aucune fonction d’activation, ce qui permet au réseau de produire une valeur numérique brute.

Fonction de perte adaptée à la régression

La fonction de perte la plus utilisée est la MSE (Mean Squared Error), ou erreur quadratique moyenne. Elle se calcule comme :

MSE = (1/N) * Σ (yi - ŷi)²

où :

  • yi est la vraie valeur,

  • ŷi est la valeur prédite,

  • N est le nombre d’exemples.

Cette fonction est différentiable, facile à implémenter, et pénalise fortement les grandes erreurs

Mise en pratique avec le jeu de données California Housing

Nous allons maintenant mettre en œuvre un modèle de régression neuronale sur des données tabulaires réelles. Le jeu de données California Housing contient des informations sur des logements en Californie. L’objectif est de prédire la valeur médiane d’un logement à partir de variables comme la densité de population ou le revenu moyen.

Chargement et préparation des données

from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

data = fetch_california_housing(as_frame=True)
X = data.data
y = data.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

Ce que fait ce code :

  • Il charge les données California Housing.

  • Il sépare les données en entraînement et test.

  • Il normalise les valeurs avec StandardScaler pour que chaque variable ait une moyenne nulle et un écart-type de 1. C’est indispensable avec les MLP pour stabiliser l’apprentissage.

Construction du modèle MLP

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential()
model.add(Dense(64, activation='relu', input_shape=(X_train.shape[1],)))
model.add(Dense(32, activation='relu'))
model.add(Dense(1))  # couche de sortie linéaire

Explication :

  • Le modèle comporte deux couches cachées avec 64 et 32 neurones, activées par ReLU.

  • La couche de sortie ne contient aucune fonction d’activation, car nous voulons prédire une valeur réelle (et non une probabilité).

Compilation et entraînement du modèle

model.compile(optimizer='adam', loss='mse', metrics=['mae'])

history = model.fit(X_train, y_train, validation_split=0.2,
                    epochs=100, batch_size=32, verbose=1)

Explication :

  • L’optimiseur Adam est utilisé pour ajuster les poids.

  • La fonction de perte mse calcule l'erreur quadratique moyenne.

  • La métrique mae (Mean Absolute Error) est ajoutée pour évaluer l’erreur moyenne en valeur absolue.

  • validation_split=0.2 réserve 20 % des données d'entraînement pour évaluer le modèle à chaque époque.

Évaluation du modèle

loss, mae = model.evaluate(X_test, y_test)
print(f"Erreur absolue moyenne sur le test set : {mae:.2f}")

Ce que ça permet de voir :

  • Cette évaluation nous indique la performance du modèle sur des données jamais vues pendant l'entraînement.

  • La mae retournée est interprétable facilement : par exemple, une erreur moyenne de 0.5 signifie que le modèle se trompe de 0.5 unités en moyenne.

Visualisation de la performance

import matplotlib.pyplot as plt

plt.plot(history.history['loss'], label='Entraînement')
plt.plot(history.history['val_loss'], label='Validation')
plt.title("Évolution de la perte (MSE)")
plt.xlabel("Époques")
plt.ylabel("Perte")
plt.legend()
plt.grid(True)
plt.show()

Ce graphique montre :

  • La courbe d’entraînement diminue régulièrement si le réseau apprend bien.

  • Une courbe de validation qui remonte alors que celle d’entraînement continue de descendre indique un surapprentissage (overfitting).

Limites et remarques importantes

1. Sensibilité aux données brutes

Le MLP ne gère pas bien les données brutes non normalisées. La standardisation est indispensable pour que le réseau converge correctement.

2. Boîte noire

Un MLP ne permet pas d’interpréter directement l’effet de chaque variable sur la sortie, contrairement à une régression linéaire. Cela limite son usage dans les cas où l’explicabilité est cruciale.

3. Risque de surapprentissage

Avec un petit jeu de données, un MLP peut facilement surapprendre. Il faut utiliser une validation croisée ou du dropout si besoin.

4. Nécessité d’un bon réglage

Le choix du nombre de neurones, du nombre de couches, de l’optimiseur, etc., a un impact important sur les performances. Il faut tester plusieurs combinaisons pour trouver un bon compromis.

Un Perceptron Multi-Couche (MLP) bien entraîné peut produire des prédictions précises dans un cadre de régression, surtout lorsque les données présentent des relations non linéaires complexes. Grâce à son adaptabilité, il s'intègre bien aux pipelines de machine learning modernes. Toutefois, son efficacité dépend fortement de la qualité des données d’entrée, du prétraitement, et des choix d'architecture.

0
Subscribe to my newsletter

Read articles from Fabrice Sangwa directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Fabrice Sangwa
Fabrice Sangwa

Whatever you want to do, do it now but it may take you some time but don't wait until you are ready to do it, start first. I'm Python Developper.