<jupyter_start><jupyter_text>TP 2 - Régression Prédiction des prix de l'immobilier à Boston dans les années 1970 La prédiction du prix de maisons bostoniennes des années 1970, dont les données sont issues de la base *Boston House Prices*, créée par <NAME> et <NAME> à l'Université de Californie à Irvine (http://archive.ics.uci.edu/ml/machine-learning-databases/housing/), est un problème classique d'apprentissage supervisé. Plus précisément, le label à prédire dans cette base de données est le prix médian par quartier de l'immobilier (en milliers de dollars). Il s'agit donc d'un problème de régression puisque l'on veut inférer des valeurs continues. Pour ce faire, on dispose de 13 entrées offrant les informations suivantes : - 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 oxides 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 centres- TAX - full-value property-tax rate per \$10,000- RAD - index of accessibility to radial highways- PTRATIO - pupil-teacher ratio by town- B $ = 1000(B_k - 0.63)^2$ where $B_k$ is the proportion of blacks by town- LSTAT - percentage lower status of the populationL'objectif de ce TP est d'arriver à prédire au plus près les valeurs médianes de prix de maison par quartier. ![Texte alternatif…](https://miro.medium.com/max/763/1*i9vZk7NkS1dZz6JEcbV5nA.png)<jupyter_code>from __future__ import print_function
import numpy as np
from matplotlib import pyplot as plt
from keras import optimizers
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras import regularizers

%matplotlib inline<jupyter_output><empty_output><jupyter_text>Nous réutilisons la fonction d'affichage des fonctions de coût introduite dans le TP1<jupyter_code>def plot_loss(val_loss, train_loss, ymax=100):
  plt.plot(val_loss, color='green', label='Erreur de validation')
  plt.plot(train_loss, color='blue', linestyle='--', label='Erreur d\'entraînement')
  plt.xlabel('Epochs')
  plt.ylim(0, ymax)
  plt.title('Évolution de la perte sur les ensembles d\'apprentissage et de validation au cours de l\'apprentissage')
  plt.legend()<jupyter_output><empty_output><jupyter_text>Préparation des données On commence par charger les données d'entraînement et de test.<jupyter_code>from keras.datasets import boston_housing

(x_train, y_train), (x_test, y_test) = boston_housing.load_data()<jupyter_output>Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/boston_housing.npz
57344/57026 [==============================] - 0s 1us/step<jupyter_text>Approche simple à corriger  Création du modèle<jupyter_code>model = Sequential()
model.add(Dense(4, activation='relu', input_dim=13))
model.add(Dense(1, activation='sigmoid'))<jupyter_output><empty_output><jupyter_text>Entrainement du réseau<jupyter_code>optim = optimizers.SGD(lr = 0.01)
model.compile(optimizer=optim, loss='mse', metrics=['mae'])

history = model.fit(x_train, y_train, epochs=50, batch_size=32)<jupyter_output>Epoch 1/50
13/13 [==============================] - 1s 2ms/step - loss: 536.9858 - mae: 21.2825
Epoch 2/50
13/13 [==============================] - 0s 2ms/step - loss: 551.0585 - mae: 21.5515
Epoch 3/50
13/13 [==============================] - 0s 2ms/step - loss: 529.8773 - mae: 21.1394
Epoch 4/50
13/13 [==============================] - 0s 2ms/step - loss: 574.1940 - mae: 22.0607
Epoch 5/50
13/13 [==============================] - 0s 2ms/step - loss: 572.7984 - mae: 22.0302
Epoch 6/50
13/13 [==============================] - 0s 1ms/step - loss: 525.4861 - mae: 21.0256
Epoch 7/50
13/13 [==============================] - 0s 2ms/step - loss: 562.3838 - mae: 21.7986
Epoch 8/50
13/13 [==============================] - 0s 1ms/step - loss: 525.7583 - mae: 21.0730
Epoch 9/50
13/13 [==============================] - 0s 2ms/step - loss: 545.1213 - mae: 21.5209
Epoch 10/50
13/13 [==============================] - 0s 2ms/step - loss: 517.7800 - mae: 20.7260
Epoch 11/50
13/13 [====================[...]<jupyter_text>Evaluation du modèle<jupyter_code>train_loss=(history.history['loss'])
plot_loss([], train_loss, ymax=800)
#val_loss=(history.history['val_loss'])
#plot_loss(val_loss, train_loss, ymax=500)
model.evaluate(x_test, y_test)<jupyter_output>4/4 [==============================] - 0s 1ms/step - loss: 570.7010 - mae: 22.0784<jupyter_text>On obtient une mae d'environ 22, ce qui signie que l'on est éloigné en moyenne de 22000$ de la vérité terrain. Travail à faireL'approche présentée ci-dessus apporte des résultats décevants, en raison de  quelques maladresses, voire erreurs. Dans un premier temps, vous devez **trouver et corriger ces problèmes**.Dans un second temps, cherchez à améliorer les performances du modèle. Vous pouvez atteindre sans trop de difficulté un score de MAE inférieur à 3 sur l'ensemble de test. Pour vous aider, inspirez-vous de la vidéo du cours ci-dessous. A chaque nouveau test, vous devez évaluer si votre réseau est en sous-apprentissage, ou en sur-apprentissage, et en déduire des modifications possibles pour en améliorer les performances.MAE de test à battre si vous aimez les défis : **2.20** !<jupyter_code>from IPython.display import IFrame
IFrame("https://video.polymny.studio/?v=c9e5c27b-2228-488e-b64d-8fd57ed30056/", width=640, height=360)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.16302610548748003, 'fraction_numerical': 0.06464215947433849, 'mean_word_length': 5.285714285714286, 'pattern_counts': {'":': 0, '<': 28, '<?xml version=': 0, '>': 28, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '7', 'dir': 'jupyter-structured-clean-dedup', 'id': '25889', 'license': 'Apache-2.0', 'n_tokens_mistral': 2187, 'n_tokens_neox': 1906, 'n_words': 595, 'path': '2A/S8/Deep_Learning/TPs/TP2/TP2.ipynb', 'repo_name': 'MOUDDENEHamza/ENSEEIHT', 'size': '5644'}