Ejercicio

Trabajar con el dataset de Diabetes

[1]:
# Imports
from sklearn.datasets import load_diabetes
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np

Cargamos el dataset y mostramos su descripción

[2]:
diabetes = load_diabetes(as_frame=True)
df = diabetes.frame

print(diabetes.keys()) # Para saber que obtenemos al descargar el conjunto de datos

print(diabetes.DESCR)
dict_keys(['data', 'target', 'frame', 'DESCR', 'feature_names', 'data_filename', 'target_filename', 'data_module'])
.. _diabetes_dataset:

Diabetes dataset
----------------

Ten baseline variables, age, sex, body mass index, average blood
pressure, and six blood serum measurements were obtained for each of n =
442 diabetes patients, as well as the response of interest, a
quantitative measure of disease progression one year after baseline.

**Data Set Characteristics:**

  :Number of Instances: 442

  :Number of Attributes: First 10 columns are numeric predictive values

  :Target: Column 11 is a quantitative measure of disease progression one year after baseline

  :Attribute Information:
      - age     age in years
      - sex
      - bmi     body mass index
      - bp      average blood pressure
      - s1      tc, total serum cholesterol
      - s2      ldl, low-density lipoproteins
      - s3      hdl, high-density lipoproteins
      - s4      tch, total cholesterol / HDL
      - s5      ltg, possibly log of serum triglycerides level
      - s6      glu, blood sugar level

Note: Each of these 10 feature variables have been mean centered and scaled by the standard deviation times the square root of `n_samples` (i.e. the sum of squares of each column totals 1).

Source URL:
https://www4.stat.ncsu.edu/~boos/var.select/diabetes.html

For more information see:
Bradley Efron, Trevor Hastie, Iain Johnstone and Robert Tibshirani (2004) "Least Angle Regression," Annals of Statistics (with discussion), 407-499.
(https://web.stanford.edu/~hastie/Papers/LARS/LeastAngle_2002.pdf)

Mostramos la matriz de correlación

[3]:
plt.figure(figsize=(10,10))
cm = np.corrcoef(df[df.columns].values.T)
sns.set(font_scale=1.5)
hm = sns.heatmap(cm, cbar=True,annot=True, square=True, fmt='.2f',
                 annot_kws={'size': 15}, yticklabels=df.columns, xticklabels=df.columns)
plt.show()
../../../_images/notebooks_Part2_03_MachineLearningNotes_04b_Ejercicio2_5_0.png

Ejercicio

  • Realiza una regresión Lasso con todas las características. Debes seleccionar el mejor valor para el hiperparàmetro alpha en el rango \(10^{-6}\), 100.

  • Muestra por pantalla el mejor alpha y el mejor score

  • Realiza un plot donde muestres los residuos (la diferencia entre los valores reales y la predicción) frente a los valores predichos. ¿Cómo es esta distribución?

[4]:
from sklearn.linear_model import Lasso
[6]:
X = diabetes.data
y = diabetes.target

alphas = np.linspace(0.000001, 100, 100)

for a in alphas:

    lasso = Lasso(alpha= 0)#...TODO
    # ...

Ejercicio 2

Vamos a hacer una segunda versión sobre este ejercicio usando una Regresión polinómica:

  • Crea un polinomio de grado 1 y compara el resultado con el obtenido con la regressión LASSO. Que sucede?

  • Crea polinómios de grados mayores, que sucede con el score ?

[ ]:
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
[ ]:

Ejercicio 3

Evidentemente parece que lo que estamos consiguiendo es realizar overfitting sobre el conjunto de datos. Los dividimos en dos conjuntos usando la función train_test_split y de esta manera obtendremos un conjunto de test. Ver documentación enlace

Trabajaremos con una métrica diferente: MSE enlace

  • Dividir el conjunto de datos y los valores objetivo en 2 conjuntos. Nos quedaremos el 70% para entrenamiento.

  • Probar regresiones polinómicas con diferentes grados. Nos quedaremos con la que tenga mejor MSE en el conjunto de test.

  • Realiza un plot donde se vea la evolución del MSE en el conjunto de test.

  • Añade el MSE del conjunto de entrenamiento. Que podemos observar?

Nota: Intenta automatizar el proceso realizando un bucle sobre el grado del polinómio

[156]:
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
[ ]:

License: CC BY 4.0 Isaac Lera and Gabriel Moya Universitat de les Illes Balears isaac.lera@uib.edu, gabriel.moya@uib.edu