{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Sélection de variables pour la régression\n",
    "\n",
    "Le but de ce TP est d'implémenter divers algorithmes pour sélectionner uniquement les variables les plus importantes pour un problème de régression. Ces méthodes servent pour améliorer la performance d'un modèle tout en réduisant sa complexité\n",
    "\n",
    "| Numéro        | Compétence           | \n",
    "|:------------- |:--------------------:|\n",
    "|RL206|\tComprendre la définition du Cp de Mallows|\n",
    "|RL207|\tEtre capable de définir un algorithme de sélection de modèle donné un critère |\n",
    "|PY503|\tSavoir implémenter un algorithme itératif de sélection de variables|\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ex. 1 — De l’importance des variables\n",
    "\n",
    "Récupérez le fichier cereal.mat sur moodle. Ce fichier contient les mesures des ingrédients de céréales pour petit déjeuner. Sur chaque type de céréale, 8 variables ont été mesurées. Ces variables sont (dans l’ordre) :\n",
    "- Calories: la teneur en calories (le nombre pour un repas)\n",
    "- Carbo: la teneur en carbohydrates (en gramme pour un repas)\n",
    "- Cups: le nombre de tasse recommandé par repas\n",
    "- Fat: la teneur en graisse (en gramme pour un repas)\n",
    "- Fiber: la teneur en fibres alimentaires (en gramme pour un repas)\n",
    "- Potass: la teneur en potassium (en mg pour un repas)\n",
    "- Protein: la teneur en proteine (en gramme pour un repas)\n",
    "- Sugars: la teneur en sucre (en gramme pour un repas)\n",
    "    \n",
    "Ce fichier peut se décomposer en une matrice `X` qui contient toutes les données, et le tableau `Name` qui contient les noms des marques.\n",
    "\n",
    "À chaque type de céréale a été associé son nom contenu dans la variable Name. Ainsi la première céréale est mat[\"name\"][0] -> ’100% Bran’."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "1) Afin de déterminer quelle est la variable la plus importante pour la régression linéaire, effectuer 7 régressions linéaire simple de chacune des autres variables contre  La variable FAT.\n",
    "\n",
    "On commence par charger les données du fichier \"cereal.mat\" et construire la matrice `X` du modèle complet et le vecteur `y` de la variable à expliquer. Vous pouvez jeter un oeil au fichier à l'entete du fichier `cereal.mat`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import scipy.io as sio\n",
    "import numpy as np\n",
    "mat = sio.loadmat(\"cereal.mat\")\n",
    "X = mat[\"X\"]\n",
    "y = X[:, 3] # la quatrieme colonne\n",
    "X = np.delete(X, 3, 1)\n",
    "np.unique(y)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "b. Constuire une matrice A permettrant de stocker les paramètres de tous les modèles, ainsi qu'un vecteur $s2$ et un vecteur $R2$ permettant de stocker les $S^2$ et $R^2$ de tous les modèles que l'on souhaite tester.\n",
    "\n",
    "**aide** : `np.zeros`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "A = ...\n",
    "s2 = ...\n",
    "R2 = ..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "c. En utilisant la fonction `ma_reg` du précédent TP, calculez les paramètres, les $S^2$ (variance non biaisée) et les $R^2$ (coefficient de détermination) de tous les modèles. \n",
    "\n",
    "Retrouvez quelle est la variable la plus importante au sens du $R^2$\n",
    "\n",
    "**aide** `np.argmax` renvoie l'indice du max plutot que la valeur du max"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "for i in range(p):\n",
    "    Xn = ...\n",
    "    A[i,:], s2[i], R2[i], diagd = ...\n",
    "\n",
    "with np.printoptions(precision=3, suppress=True):\n",
    "    print('Erreur résiduelle :',s2) \n",
    "    print('               R2 :',R2)\n",
    "\n",
    "v = ...\n",
    "ind = ...\n",
    "\n",
    "print(f\"Le plus grand R2 est {v:3.3f}\")\n",
    "print(f\"La variable la plus importante est la variable {ind+1}\")\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "2. Nous allons maintenant calculer l’estimation du risque statistique (le Cp de Mallows) associé à ce modèle.\n",
    "    \n",
    "    a. calculez la variance estimée sur le modèle complet  (Attention aux dégrès de libertés)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "s2_r = ..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "b. calculez le $C_p$ du meilleur modèle à une seule variable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "Cp_1variable = ..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "3. Nous allons maintenant trouver quelles sont les deux variables optimales au sens du $C_p$ \n",
    "\n",
    "    a. combien de modèles possible avec deux variables ?  Attention, l'ordre des variables n'a pas d'importance. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "nb_modeles = ..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "b. Calculez le $C_p$ de chacun de ces modèles"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "4. Estimer le meilleur modèle au sens du $C_p$ par *forward* sélection. \n",
    "\n",
    "N'hésitez pas à réfléchir à l'algorithme sur une feuille de papier auparavant. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "5\\. **Bonus** Estimer le meilleur modèle au sens du $C_p$ par *backward* sélection"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "venvm8-ioPrAr7d-py3.10",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
