{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "TPregression.ipynb", "provenance": [], "collapsed_sections": [] }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "HwWGIO3TAmiM", "colab_type": "text" }, "source": [ "# Régression\n", "\n", "* modéliser des relations statistiques entre deux variables\n", "\n", "* estimer l'impact de la variation d'une variable explicative sur une variable à expliquer\n", "\n", "* modèle : $y = f(x) + \\epsilon$" ] }, { "cell_type": "markdown", "metadata": { "id": "oCdafNL5YK58", "colab_type": "text" }, "source": [ "# Partie I : Données simulées" ] }, { "cell_type": "markdown", "metadata": { "id": "uH-9ytqnA06o", "colab_type": "text" }, "source": [ "##I.1. Régression linéaire\n", "\n", "* $f(x) = \\langle x, \\beta \\rangle$\n", "\n", "* estimer le vecteur de paramètre $\\beta$" ] }, { "cell_type": "markdown", "metadata": { "id": "VVqpO4iHB76c", "colab_type": "text" }, "source": [ "a) Générer des données suivant le modèle : $y_i = \\beta_0 + \\beta_1 x_i + \\epsilon_i$. Afficher les données." ] }, { "cell_type": "code", "metadata": { "id": "60WPl17DCYxb", "colab_type": "code", "colab": {} }, "source": [ "import numpy as np\n", "from matplotlib.pyplot import *\n", "\n", "\n", "# A compléter" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "HZEn9gY9KPLp", "colab_type": "text" }, "source": [ "b) Calculer la solution obtenue par une régression linéaire à moindres carrés. Tracer la droite de régression obtenue." ] }, { "cell_type": "code", "metadata": { "id": "i0yVXq1sKX9Z", "colab_type": "code", "colab": {} }, "source": [ "# A compléter" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "xvPAmM6MM2mD", "colab_type": "text" }, "source": [ "##I.2. Régression non linéaire\n" ] }, { "cell_type": "markdown", "metadata": { "id": "GlmYrABzNGXS", "colab_type": "text" }, "source": [ "a) Générer des données suivant le modèle : $y_n = \\sin(\\frac{n}{10}) +(\\frac{n}{50})^2 + \\epsilon $. Afficher les données." ] }, { "cell_type": "code", "metadata": { "id": "F_u3PiBHNoEp", "colab_type": "code", "colab": {} }, "source": [ "import numpy as np\n", "\n", "from matplotlib.pyplot import *\n", "\n", "# A compléter" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Kp_CN5EAOKD0", "colab_type": "text" }, "source": [ "### I.2.1. Régression polynomiale\n", "\n", "* $y = \\beta_0 + \\beta_1 x + \\beta_2 x^2 +\\beta_3 x^3$\n", "\n", "* La solution d'une régression linéaire : $\\hat{\\beta} = (X^\\top X)^{-1} X^\\top Y$\n", "\n", "* Utiliser $X = [1 \\ x \\ x^2 \\ x^3]$\n" ] }, { "cell_type": "markdown", "metadata": { "id": "_y6xcmHXa20U", "colab_type": "text" }, "source": [ "a) Ecrire une fonction qui retourne la solution de la régression linéaire multiple." ] }, { "cell_type": "code", "metadata": { "id": "wRcxUWfNPbo2", "colab_type": "code", "colab": {} }, "source": [ "# A compléter" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "_r7byVnnbFd5", "colab_type": "text" }, "source": [ "b) Utilisant la fonction ci-dessus, estimer les parmètres du modèle de régression polynomiale et afficher la solution." ] }, { "cell_type": "code", "metadata": { "id": "EoVLd5DGPshv", "colab_type": "code", "colab": {} }, "source": [ "# A compléter" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "gtyN0Nu7Qsbl", "colab_type": "text" }, "source": [ "###I.2.2 Regression à noyau\n", "\n", "a) Dans le cas du modèle linéaire, appliquer la régression à noyau avec un noyau linéaire. Utiliser la fonction KernelRidge de Scikit-learn avec un noyau linéaire. Reptrésenter sur un graphique les données et la solution obtenue." ] }, { "cell_type": "code", "metadata": { "id": "9QH-3CTBQxID", "colab_type": "code", "colab": {} }, "source": [ "from sklearn.kernel_ridge import KernelRidge\n", "import numpy as np\n", "\n", "\n", "# A compléter" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Fkzpl_q8ajPH", "colab_type": "text" }, "source": [ "b) Dans le cas du modèle non-linéaire, appliquer la régression à noyau avec un noyau rbf. Représenter sur un graphique les données et la solution obtenue. " ] }, { "cell_type": "code", "metadata": { "id": "S_1C01pAVS4c", "colab_type": "code", "colab": {} }, "source": [ "# A compléter" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "mJ3d9NwMccbd" }, "source": [ "# Partie II : Données réelles" ] }, { "cell_type": "markdown", "metadata": { "id": "fd1xn557cf-G", "colab_type": "text" }, "source": [ "Soit les données suivantes : https://archive.ics.uci.edu/ml/datasets/Bike+Sharing+Dataset#" ] }, { "cell_type": "markdown", "metadata": { "id": "Hq4u7kjucy-4", "colab_type": "text" }, "source": [ "La régression ridge et lasso sont des extensions de la régression linéaire par moindres carrés permettant d'éviter le risque de sur-apprendtissage. L'idée est d'ajouter une pénalisation au problème de régression par moindres carrés:\n", "$$ \\arg\\min_{w\\in\\mathbb{R}^d, b\\in\\mathbb{R}} \\sum_{i=1}^n \\big(y_i - \\langle w, x_i \\rangle-b\\big)^2 + \\lambda \\Omega(w),$$\n", "où $\\lambda\\in\\mathbb{R}$ est un paramètre de régularisation, $\\Omega(w) = \\|w\\|_2^2$ pour la régression ridge et $\\Omega(w) = \\|w\\|_1$ pour le Lasso." ] }, { "cell_type": "markdown", "metadata": { "id": "9WBHGcvIeQsY", "colab_type": "text" }, "source": [ "a) Uyilisant la bibliothèque Scikit-learn, appliquez la régression Ridge et la régression Lasso sur le jeu de données \"Bike Sharing\". Affichez et comparez les deux solutions obtenues." ] }, { "cell_type": "code", "metadata": { "id": "AW0jFEIDexff", "colab_type": "code", "colab": {} }, "source": [ "# A compléter" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Ua-sKAQce60k", "colab_type": "text" }, "source": [ "b) Calculez les erreurs de prédiction sur les données d'apprentissage obtenues avec les régressions Ridge et Lasso. Comparez les résultats avec ceux obtenus par la régression par moindre carrés." ] }, { "cell_type": "code", "metadata": { "id": "5bU_PKrffCbl", "colab_type": "code", "colab": {} }, "source": [ "# A compléter" ], "execution_count": 0, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "aE9e0mI5fBcR", "colab_type": "text" }, "source": [ "c) Le choix du paramètre $\\lambda$ est primordiale pour avoir des résultats de prédiction optimaux. Une façon de procéder pour trouver une bonne valeur $\\lambda$ est d'utiliser la méthode de cross-validation sur une grille de valeurs. Déterminer par cross-validation les valeurs de $\\lambda$ permettant d'avoir les meilleurs taux de prédiction. \n", "\n" ] }, { "cell_type": "code", "metadata": { "id": "eWEm1sEMfcAQ", "colab_type": "code", "colab": {} }, "source": [ "# A compléter" ], "execution_count": 0, "outputs": [] } ] }