Applications

Régression avec Random Forest : Prédire le loyer d’un logement à Paris

Dans les différents projets où l’on a utilisé random forest, il s’agissait de faire de la classification. Nous pouvons aussi faire de...

Écrit par Ilyes Talbi · 3 min lecture >
loyers_paris

Dans les différents projets où l’on a utilisé random forest, il s’agissait de faire de la classification. Nous pouvons aussi faire de la régression avec random forest.

Dans ce tutoriel nous allons voir comment l’utiliser pour prédire le loyer d’un logement à Paris. Pour ce faire nous coderons sur Python en utilisant le module scikit-learn.

Données et présentation du problème

J’ai récupéré la base de données sur la plateforme data gouv. La base de données a été publiée par la mairie de Paris dans le cadre de l’encadrement des loyers.

Data gouv est une source de données plutôt fiable que je vous conseille pour vos projets. Surtout lorsque l’on sait que la qualité des données est un point crucial en machine learning.

La base Encadrement des loyers 2019 contient un certains nombre d’informations sur plus de 2000 logements à Paris :

  • id_zone : numéro de zone
  • id_quartier : numéro de quartier
  • nom_quartier : nom du quartier
  • piece : nombre de pièces
  • epoque : période de construction
  • meuble_txt : meublé/non meublé
  • ref : loyer de référence
  • max : loyer maximum
  • min : loyer minimum
  • geo_shape : géométrie du logement
  • geo_point_2D : coordonnées du logement

Pour construire le modèle nous utiliserons nom_quartier, piece, epoque, meuble_txt. L’objectif sera de prèdire le loyer de référence ref.

Implémentation de random forest pour la régression

Si vous avez suivi mes anciens projets vous connaissez déjà scikit-learn. Si ce n’est pas le cas jetez-y un œil !

On commence par importer les modules utiles :

import pandas as pd

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor

Ensuite on importe la base de données que l’on souhaite traiter avec le module Pandas :

data = pd.read_csv('logement-encadrement-des-loyers.csv',sep = ';')

data.head() permet d’avoir un aperçu du tableau de données pour s’assurer qu’il a été importé correctement :

data.head()

On commence par mettre les données dans le format souhaité. On met de côté l’attribut ref qui n’est autre que la variable que l’on souhaite prédire.

La fonction get_dummies de Pandas nous permet d’encoder les variables catégoriques avec l’encodage one-hot. Le principe de cette encodage est très simple, on transforme la colonne en une matrice composée de tous les valeurs possibles, avec un 1 lorsque l’option est réalisée et 0 partout ailleurs. L’image suivante vous permettra de mieux comprendre le principe.

encodage one-hot
Illustration du One-Hot encoding

Ensuite, comme toujours, on sépare notre dataset en données d’entraînements et données de test. Voici le code à écrire :

X = pd.DataFrame(data,columns = ['nom_quartier','piece',
                                 'epoque','meuble_txt'])
Y = data['ref']

X = pd.get_dummies(X)

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, 
                                          test_size = 0.2)

Il ne nous reste plus qu’à entraîner le modèle. La seule différence avec le random forest que l’on utilise habituellement et que c’est le regressor (et non pas le classifieur).

regressor = RandomForestRegressor(n_estimators = 10, 
                                  random_state = 0)

regressor.fit(X_train, Y_train)

Maintenant on peut regarder nos résultats sur les données de test. Pour cela rien de plus simple !

y_pred = regressor.predict(X_test)

Visualisation et évaluation du modèle

On peut regarder les performances de notre modèle en comparant les résultats prédits et ceux attendus.

Pour cela on commence par importer matplotlib.pyplot pour la visualisation.

import matplotlib.pyplot as plt

On trace pour les 20 premières valeurs le prix de référence prédits par notre modèle et le prix attendus :

import matplotlib.pyplot as plt

plt.title('Performance du modèle')
plt.plot(list(y_pred)[:20])
plt.plot(list(Y_test)[:20])
plt.legend()

Le résultat obtenu est plutôt bon pour un premier modèle :

Régression avec Random Forest : Prédire le loyer d'un logement à Paris
Comparaison des loyers prédits avec les loyers effectifs

Evidemment le fait d’avoir des bons résultats sur les premières valeurs ne donne aucune indication sur la performance globale du modèle. Pour cela on utilise plutôt des métriques comme l’erreur quadratique moyenne ou la MAPE.

Il intéressant de voir comment avec un modèle aussi simple on a réussi à avoir d’aussi bonnes performances. On peut même aller plus loin en exploitant de façon plus précise les données.

Par exemple en calculant la surface et en prenant en compte la géométrie des logements. De même on aurait pu exploiter de façon plus poussée la localisation. Plutôt que d’utiliser le découpage par défaut donné par la mairie de Paris, prendre en compte les positions exactes pourrait nous aider.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *