Régression linéaire sur l’ensemble de données du logement de Boston

Crédits: http://www.wbur.org/radioboston/2013/09/18/bostons-housing-challenge

Dans mon blog précédent, j’ai couvert les bases de la régression linéaire et de la descente de gradient. Pour obtenir une régression linéaire pratique, nous prendrons un ensemble de données original et appliquerons les concepts que nous avons appris.

Nous allons prendre l’ensemble de données sur le logement qui contient des informations sur les différentes maisons de Boston. Ces données faisaient à l’origine partie du référentiel d’apprentissage automatique UCI et ont été supprimées maintenant. Nous pouvons également accéder à ces données à partir de la bibliothèque scikit-learn. Il y a 506 échantillons et 13 variables d’entités dans cet ensemble de données. L’objectif est de prédire la valeur des prix de la maison en utilisant les caractéristiques données.

Alors commençons.

Tout d’abord, nous importerons les bibliothèques requises.

Ensuite, nous chargerons les données du boîtier de la bibliothèque scikit-learn et les comprendrons.

Nous imprimons la valeur du boston_dataset pour comprendre ce qu’il contient. print(boston_dataset.keys()) donne

dict_keys()
  • données: contient les informations pour différentes maisons
  • cible: prix de la maison
  • feature_names: noms des fonctionnalités
  • DESCR: décrit l’ensemble de données

Pour en savoir plus sur l’utilisation des fonctionnalités boston_dataset.DESCRLa description de toutes les fonctionnalités est donnée ci-dessous:

CRIM: Per capita crime rate by town
ZN: Proportion of residential land zoned for lots over 25,000 sq. ft
INDUS: Proportion of non-retail business acres per town
CHAS: Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
NOX: Nitric oxide concentration (parts per 10 million)
RM: Average number of rooms per dwelling
AGE: Proportion of owner-occupied units built prior to 1940
DIS: Weighted distances to five Boston employment centers
RAD: Index of accessibility to radial highways
TAX: Full-value property tax rate per $10,000
PTRATIO: Pupil-teacher ratio by town
B: 1000(Bk — 0.63)², where Bk is the proportion of by town
LSTAT: Percentage of lower status of the population
MEDV: Median value of owner-occupied homes in $1000s

Les prix de la maison indiqués par la variable MEDV est notre variable cible et les autres sont les variables caractéristiques sur lesquelles nous allons prédire la valeur d’une maison.

Nous allons maintenant charger les données dans une trame de données pandas en utilisant pd.DataFrame. Nous imprimons ensuite les 5 premières lignes des données en utilisant head()

Nous pouvons voir que la valeur cible MEDV est manquante dans les données. Nous créons une nouvelle colonne de valeurs cibles et l’ajoutons à la trame de données.

Prétraitement des données

Après le chargement des données, il est recommandé de vérifier s’il manque des valeurs dans les données. Nous comptons le nombre de valeurs manquantes pour chaque entité en utilisant isnull()

Cependant, il n’y a pas de valeurs manquantes dans cet ensemble de données comme indiqué ci-dessous.

Analyse exploratoire des données

L’analyse exploratoire des données est une étape très importante avant d’entraîner le modèle. Dans cette section, nous utiliserons quelques visualisations pour comprendre la relation de la variable cible avec d’autres fonctionnalités.

Tracons d’abord la distribution de la variable cible MEDV. Nous utiliserons la fonction distplot de la bibliothèque seaborn.

Nous voyons que les valeurs de MEDV sont distribuées normalement avec quelques valeurs aberrantes.

Ensuite, nous créons une matrice de corrélation qui mesure les relations linéaires entre les variables. La matrice de corrélation peut être formée en utilisant la fonction corr de la bibliothèque de trames de données pandas. Nous utiliserons la fonction heatmap de la bibliothèque seaborn pour tracer la matrice de corrélation.

Le coefficient de corrélation varie de -1 à 1. Si la valeur est proche de 1, cela signifie qu’il existe une forte corrélation positive entre les deux variables. Lorsqu’il est proche de -1, les variables ont une forte corrélation négative.

Observations:

  • Pour s’adapter à un modèle de régression linéaire, nous sélectionnons les entités qui ont une forte corrélation avec notre variable cible MEDV. En regardant la matrice de corrélation, nous pouvons voir que RM a une forte corrélation positive avec (0,7) où as LSTAT a une forte corrélation négative avec (-0,74) .
  • Un point important dans la sélection des entités pour un modèle de régression linéaire est de vérifier la multi-co-linéarité. Les caractéristiques RADTAX ont une corrélation de 0,91. Ces paires de caractéristiques sont fortement corrélées les unes aux autres. Nous ne devrions pas sélectionner ces deux fonctionnalités ensemble pour entraîner le modèle. Vérifiez ceci pour une explication. Il en va de même pour les fonctionnalités DIS et AGE qui ont une corrélation de -0,75.

Sur la base des observations ci-dessus, nous RM et LSTAT en tant que fonctionnalités. En utilisant un nuage de points, voyons comment ces fonctionnalités varient avec MEDV.

Observations:

  • Les prix augmentent à mesure que la valeur de RM augmente linéairement. Il y a peu de valeurs aberrantes et les données semblent être plafonnées à 50.
  • Les prix ont tendance à diminuer avec une augmentation du LSTAT. Bien qu’il ne semble pas suivre exactement une ligne linéaire.

Préparation des données pour l’entraînement du modèle

Nous concaténons les colonnes LSTAT et RM en utilisant np.c_ fournies par la bibliothèque numpy.

Diviser les données en ensembles de formation et de test

Ensuite, nous divisons les données en ensembles de formation et de test. Nous entraînons le modèle avec 80% des échantillons et testons avec les 20% restants. Nous faisons cela pour évaluer les performances du modèle sur des données invisibles. Pour diviser les données, nous utilisons la fonction train_test_split fournie par la bibliothèque scikit-learn. Nous imprimons enfin les tailles de notre jeu de formation et de test pour vérifier si le fractionnement s’est correctement produit.

(404, 2) 
(102, 2)
(404,)
(102,)

Formation et test du modèle

Nous utilisons le LinearRegression de scikit-learn pour entraîner notre modèle à la fois sur les ensembles de formation et de test.

Évaluation du modèle

Nous évaluerons notre modèle en utilisant RMSE et R2-score.

The model performance for training set 
--------------------------------------
RMSE is 5.6371293350711955
R2 score is 0.6300745149331701 The model performance for testing set
--------------------------------------
RMSE is 5.137400784702911
R2 score is 0.6628996975186952

C’est bon pour commencer. Dans les prochains blogs, nous examinerons les moyens d’augmenter les performances du modèle.

Le cahier Jupyter complet se trouve ici.

Conclusion

Dans cette histoire, nous avons appliqué les concepts de régression linéaire sur l’ensemble de données sur le logement de Boston. Je recommanderais également d’essayer d’autres ensembles de données.

Voici quelques endroits où vous pouvez rechercher des données

  • https://www.kaggle.com/datasets
  • https://toolbox.google.com/datasetsearch
  • https://archive.ics.uci.edu/ml/datasets.html

Merci d’avoir lu!!

Dans la partie suivante de cette série, nous aborderons la régression polynomiale. Regardez cet espace pour en savoir plus.

Related Posts

Laisser un commentaire

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