Introduction à l'apprentissage automatique: TP1 - Exercice 2


L'objectif de cet exercice est de construire un modèle de régression.

On cherche à prédire l'influence de dix indicateurs (âge, sexe, diverses mesures physiologiques) sur un indicateur 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.

In [ ]:
# import des bibliothèques Python utiles:
import numpy as np
from sklearn import datasets, linear_model, metrics, model_selection

import matplotlib.pyplot as plt

# "magic function" Jupyter pour l'affichage des graphiques dans le carnet:
%matplotlib inline
In [ ]:
# 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))

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: random_state=42 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.

In [ ]:
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)

Question 1. Que font les trois cellules suivantes ? Commentez en particulier le comportement des graphes.

In [ ]:
lr = linear_model.LinearRegression()
lr.fit(X_train, y_train)

MSE_lr = np.mean((lr.predict(X_test) - y_test) ** 2)

print(MSE_lr)
In [ ]:
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();
In [ ]:
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()

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 par validation croisée sur la base d'apprentissage , conformément à la démarche vue en cours.

Quel est le meilleur modèle ?

Indication : calculez la valeur de MSE sur la base de test .

Quelles variables semblent les plus pertinentes dans l'étude?

In [ ]:
# votre code ici (il faut pour l'essentiel faire des copier/coller depuis l'énoncé de l'exercice 1)
In [ ]: