Skip to content
Snippets Groups Projects
Commit d9f172db authored by SUR Frederic's avatar SUR Frederic
Browse files

Upload New File

parent 806096c6
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags:
# Introduction à l'apprentissage automatique: TP1 - Exercice 2
<br>
L'objectif de cet exercice est de construire un modèle de régression linéaire.
__Remarque__: il ne s'agit que d'une étude préliminaire; il faudrait également tester les modèles non-linéaires que l'on verra dans la suite du cours.
<br>
On cherche à prédire l'influence de dix indicateurs $x_1,x_2,\dots,x_{10}$ (âge, sexe, et diverses mesures physiologiques) sur un indicateur $y$ de la progression du diabète, à l'aide d'un modèle linéaire. Une étude complète nécessiterait de justifier ce modèle par des graphes, les coefficients de corrélation linéaire, etc., comme vous l'avez fait en cours d'Analyse de données. Nous ne le ferons pas faute de temps.
On se base sur un jeu de données intégré à scikit-learn et [décrit ici](https://scikit-learn.org/stable/datasets/index.html#diabetes-dataset).
%% Cell type:code id: tags:
``` python
# import des bibliothèques Python utiles:
import numpy as np
from sklearn import datasets, linear_model, metrics, model_selection
import matplotlib.pyplot as plt
# on ignore les avertissements "future warning" (au cas où sklearn 1.0 est utilisé)
from warnings import simplefilter
simplefilter(action='ignore', category=FutureWarning)
# "magic function" Jupyter pour l'affichage des graphiques dans le carnet:
%matplotlib notebook
```
%% Cell type:code id: tags:
``` python
# chargement des données
diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y=True)
# affichage des 5 premières observations
print(diabetes_X[:5,:]) # rappel: les observations ont été préalablement normalisées
print(diabetes_y[:5]) # les labels y ne sont pas normalisés
# nombre d'observations:
print("\nnombre d'observations dans la base de données: %d" %len(diabetes_X))
```
%% Cell type:markdown id: tags:
Les observations (les 10 indicateurs) forment les colonnes de `diabetes_X` et l'indicateur à prédire est stocké dans `diabetes_y`.
On commence par séparer la base de données entre ensemble d'apprentissage et ensemble de test (20% des observations pour ce dernier ensemble). La répartition est faite de manière aléatoire par la cellule suivante.
__Remarque__: dans la cellule suivante, `random_state=42` (nombre arbitraire) permet de fixer la graine du générateur aléatoire de manière à ce que nous ayons tous la même répartition aléatoire, ce qui facilitera la discussion.
%% Cell type:code id: tags:
``` python
X_train, X_test, y_train, y_test = model_selection.train_test_split(diabetes_X, diabetes_y, \
test_size=0.2, random_state=42)
print(X_train.shape)
print(X_test.shape)
```
%% Cell type:markdown id: tags:
__Question 1__. Que font les trois cellules suivantes? Commentez en particulier le comportement des graphes. Pourquoi la MSE est-elle calculée sur la base test?
%% Cell type:code id: tags:
``` python
lr = linear_model.LinearRegression()
lr.fit(X_train, y_train)
MSE_lr = np.mean((lr.predict(X_test) - y_test) ** 2)
print(MSE_lr)
```
%% Cell type:code id: tags:
``` python
n_alphas = 100
alphas = np.logspace(-4, 4, n_alphas)
coefs=np.zeros((0,10))
MSE_ridge=[]
for a in alphas:
ridge = linear_model.Ridge(alpha=a)
ridge.fit(X_train, y_train)
coefs=np.vstack((coefs,ridge.coef_))
MSE_ridge.append([MSE_lr, np.mean((ridge.predict(X_test) - y_test) ** 2)])
plt.figure(figsize=(8,6))
plt.semilogx(alphas, coefs)
plt.xlabel('alpha')
plt.ylabel('coefs')
plt.title('Coefficients de la régression ridge en fonction de alpha')
plt.axis('tight')
plt.legend(['w1','w2','w3','w4','w5','w6','w7','w8','w9','w10'])
plt.grid()
plt.show()
plt.figure(figsize=(8,6))
plt.semilogx(alphas, MSE_ridge)
plt.xlabel('alpha')
plt.ylabel('MSE')
plt.title('MSE régression linéaire et ridge vs. alpha ')
plt.axis([1e-4,1e4,2750,3050])
plt.legend(['MSE lr','MSE ridge'])
plt.grid()
plt.show();
```
%% Cell type:code id: tags:
``` python
n_alphas = 100
alphas = np.logspace(-4, 4, n_alphas)
coefs=np.zeros((0,10))
MSE_lasso=[]
for a in alphas:
lasso = linear_model.Lasso(alpha=a)
lasso.fit(X_train, y_train)
coefs=np.vstack((coefs,lasso.coef_))
MSE_lasso.append([MSE_lr, np.mean((lasso.predict(X_test) - y_test) ** 2)])
#print(coefs)
plt.figure(figsize=(8,6))
plt.semilogx(alphas, coefs)
plt.xlabel('alpha')
plt.ylabel('coefs')
plt.title('Coefficients du Lasso en fonction de alpha')
plt.legend(['w1','w2','w3','w4','w5','w6','w7','w8','w9','w10'])
plt.axis('tight')
plt.grid()
plt.show();
plt.figure(figsize=(8,6))
plt.semilogx(alphas, MSE_lasso)
plt.xlabel('alpha')
plt.ylabel('MSE')
plt.axis([1e-4,1e4,2750,3050])
plt.title('MSE régression linéaire et lasso vs. alpha ')
plt.legend(['MSE lr','MSE lasso'])
plt.grid()
plt.show()
```
%% Cell type:markdown id: tags:
__Question 2__. Proposez des modèles de régression multivariée pour prédire $y$ en fonction des 10 indicateurs dans $X$. Vous testerez régression linéaire, ridge, lasso et fixerez l'hyperparamètre de ces deux dernières méthodes par validation croisée sur la _base d'apprentissage_ , conformément à la démarche vue dans l'exercice 1.
<br>
Quel est finalement le meilleur modèle ?
_Indication_ : calculez la valeur de MSE sur la _base de test_ .
<br>
Quelles variables semblent les plus pertinentes dans l'étude?
%% Cell type:code id: tags:
``` python
# votre code ici (il faut pour l'essentiel faire des copier/coller depuis l'énoncé de l'exercice 1)
```
%% Cell type:code id: tags:
``` python
```
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment