├── README.md ├── Régression Linéaire Multiple.ipynb └── Régression Linéaire Numpy.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # MachineLearning-tutorial-French 2 | Codes provenant de mes vidéos YouTube : https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ 3 | -------------------------------------------------------------------------------- /Régression Linéaire Multiple.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Régression Linéaire Multiple et Polynomiale Numpy\n", 8 | "\n", 9 | "Guillaume Saint-Cirgue\n", 10 | "https://machinelearnia.com/\n" 11 | ] 12 | }, 13 | { 14 | "cell_type": "code", 15 | "execution_count": 1, 16 | "metadata": {}, 17 | "outputs": [], 18 | "source": [ 19 | "import numpy as np\n", 20 | "from sklearn.datasets import make_regression\n", 21 | "import matplotlib.pyplot as plt" 22 | ] 23 | }, 24 | { 25 | "cell_type": "markdown", 26 | "metadata": {}, 27 | "source": [ 28 | "# 1. Régression Polynomiale: 1 variable $x_1$" 29 | ] 30 | }, 31 | { 32 | "cell_type": "markdown", 33 | "metadata": {}, 34 | "source": [ 35 | "## 1.1 Dataset\n", 36 | "\n", 37 | "Pour développer un modèle polynomial à partir des équations de la régression linéaire, il suffit d'ajouter des degrés de polynome dans les colonnes de la matrice $X$ ainsi qu'un nombre égal de lignes dans le vecteur $\\theta$.\n", 38 | "\n", 39 | "Dans ce notebook, nous allons développer un ploynome de degré 2: $f(x) = ax^2 + bx + c$. Pour celà, il faut développer les matrices suivantes:\n", 40 | "\n", 41 | "$X = \\begin{bmatrix} x^{2 (1)} & x^{(1)} & 1 \\\\ ... & ... & ... \\\\ x^{2 (m)} & x^{(m)} & 1 \\end{bmatrix}$\n", 42 | "\n", 43 | "$\\theta = \\begin{bmatrix} a\\\\b\\\\c \\end{bmatrix}$\n", 44 | "\n", 45 | "$y = \\begin{bmatrix} y^{(1)}\\\\...\\\\y^{(m)} \\end{bmatrix}$ *note : le vecteur $y$ reste le meme que pour la régression linéaire*" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 2, 51 | "metadata": {}, 52 | "outputs": [ 53 | { 54 | "data": { 55 | "text/plain": [ 56 | "" 57 | ] 58 | }, 59 | "execution_count": 2, 60 | "metadata": {}, 61 | "output_type": "execute_result" 62 | }, 63 | { 64 | "data": { 65 | "image/png": "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\n", 66 | "text/plain": [ 67 | "
" 68 | ] 69 | }, 70 | "metadata": { 71 | "needs_background": "light" 72 | }, 73 | "output_type": "display_data" 74 | } 75 | ], 76 | "source": [ 77 | "np.random.seed(0) # permet de reproduire l'aléatoire\n", 78 | "\n", 79 | "x, y = make_regression(n_samples=100, n_features=1, noise = 10) # creation d'un dataset (x, y) linéaire\n", 80 | "y = y + abs(y/2) # modifie les valeurs de y pour rendre le dataset non-linéaire\n", 81 | "\n", 82 | "plt.scatter(x, y) # afficher les résultats. x en abscisse et y en ordonnée" 83 | ] 84 | }, 85 | { 86 | "cell_type": "code", 87 | "execution_count": 3, 88 | "metadata": {}, 89 | "outputs": [ 90 | { 91 | "name": "stdout", 92 | "output_type": "stream", 93 | "text": [ 94 | "(100, 1)\n", 95 | "(100,)\n", 96 | "(100, 1)\n" 97 | ] 98 | } 99 | ], 100 | "source": [ 101 | "# Verification des dimensions\n", 102 | "print(x.shape)\n", 103 | "print(y.shape)\n", 104 | "\n", 105 | "# redimensionner y\n", 106 | "y = y.reshape(y.shape[0], 1)\n", 107 | "print(y.shape)" 108 | ] 109 | }, 110 | { 111 | "cell_type": "code", 112 | "execution_count": 4, 113 | "metadata": {}, 114 | "outputs": [ 115 | { 116 | "name": "stdout", 117 | "output_type": "stream", 118 | "text": [ 119 | "(100, 3)\n", 120 | "[[ 0.12927848 -0.35955316 1. ]\n", 121 | " [ 0.95382381 0.97663904 1. ]\n", 122 | " [ 0.1618788 0.40234164 1. ]\n", 123 | " [ 0.66120688 -0.81314628 1. ]\n", 124 | " [ 0.78816353 -0.88778575 1. ]\n", 125 | " [ 0.19701457 0.44386323 1. ]\n", 126 | " [ 0.95507205 -0.97727788 1. ]\n", 127 | " [ 0.18346819 0.42833187 1. ]\n", 128 | " [ 0.04337847 0.20827498 1. ]\n", 129 | " [ 0.09706498 -0.31155253 1. ]]\n" 130 | ] 131 | } 132 | ], 133 | "source": [ 134 | "# Création de la matrice X, inclut le Biais\n", 135 | "X = np.hstack((x, np.ones(x.shape)))\n", 136 | "X = np.hstack((x**2, X)) # ajoute le vecteur x^2 a la gauche de la matrice X\n", 137 | "\n", 138 | "print(X.shape)\n", 139 | "print(X[:10])" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 5, 145 | "metadata": {}, 146 | "outputs": [ 147 | { 148 | "data": { 149 | "text/plain": [ 150 | "array([[-0.63743703],\n", 151 | " [-0.39727181],\n", 152 | " [-0.13288058]])" 153 | ] 154 | }, 155 | "execution_count": 5, 156 | "metadata": {}, 157 | "output_type": "execute_result" 158 | } 159 | ], 160 | "source": [ 161 | "# Initialisation du vecteur theta aléatoire, avec 3 éléments (car X a trois colonnes)\n", 162 | "theta = np.random.randn(3, 1)\n", 163 | "theta" 164 | ] 165 | }, 166 | { 167 | "cell_type": "markdown", 168 | "metadata": {}, 169 | "source": [ 170 | "## 1.2 Modèle Linéaire\n", 171 | "On implémente un modèle $F = X.\\theta$, puis on teste le modèle pour voir s'il n'y a pas de bug (bonne pratique oblige). En plus, cela permet de voir à quoi ressemble le modèle initial, défini par la valeur de $\\theta$" 172 | ] 173 | }, 174 | { 175 | "cell_type": "code", 176 | "execution_count": 6, 177 | "metadata": {}, 178 | "outputs": [], 179 | "source": [ 180 | "def model(X, theta):\n", 181 | " return X.dot(theta)" 182 | ] 183 | }, 184 | { 185 | "cell_type": "code", 186 | "execution_count": 7, 187 | "metadata": {}, 188 | "outputs": [ 189 | { 190 | "data": { 191 | "text/plain": [ 192 | "" 193 | ] 194 | }, 195 | "execution_count": 7, 196 | "metadata": {}, 197 | "output_type": "execute_result" 198 | }, 199 | { 200 | "data": { 201 | "image/png": "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\n", 202 | "text/plain": [ 203 | "
" 204 | ] 205 | }, 206 | "metadata": { 207 | "needs_background": "light" 208 | }, 209 | "output_type": "display_data" 210 | } 211 | ], 212 | "source": [ 213 | "plt.scatter(x, y)\n", 214 | "plt.scatter(x, model(X, theta), c='r')" 215 | ] 216 | }, 217 | { 218 | "cell_type": "markdown", 219 | "metadata": {}, 220 | "source": [ 221 | "## 1.3 Fonction Cout : Erreur Quadratique moyenne\n", 222 | "On mesure les erreurs du modele sur le Dataset X, y en implémenter l'Erreur Quadratique Moyenne, **Mean Squared Error (MSE)** en anglais.\n", 223 | "\n", 224 | "$ J(\\theta) = \\frac{1}{2m} \\sum (X.\\theta - y)^2 $\n", 225 | "\n", 226 | "Ensuite, on teste notre fonction, pour voir s'il n'y a pas de bug" 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": 8, 232 | "metadata": {}, 233 | "outputs": [], 234 | "source": [ 235 | "def cost_function(X, y, theta):\n", 236 | " m = len(y)\n", 237 | " return 1/(2*m) * np.sum((model(X, theta) - y)**2)" 238 | ] 239 | }, 240 | { 241 | "cell_type": "code", 242 | "execution_count": 9, 243 | "metadata": {}, 244 | "outputs": [ 245 | { 246 | "data": { 247 | "text/plain": [ 248 | "1328.6654828872622" 249 | ] 250 | }, 251 | "execution_count": 9, 252 | "metadata": {}, 253 | "output_type": "execute_result" 254 | } 255 | ], 256 | "source": [ 257 | "cost_function(X, y, theta)" 258 | ] 259 | }, 260 | { 261 | "cell_type": "markdown", 262 | "metadata": {}, 263 | "source": [ 264 | "## 1.4 Gradients et Descente de Gradient\n", 265 | "On implémente la formule du gradient pour la **MSE**\n", 266 | "\n", 267 | "$\\frac{\\partial J(\\theta) }{\\partial \\theta} = \\frac{1}{m} X^T.(X.\\theta - y)$\n", 268 | "\n", 269 | "Ensuite on utilise cette fonction dans la descente de gradient:\n", 270 | "\n", 271 | "$\\theta = \\theta - \\alpha \\frac{\\partial J(\\theta) }{\\partial \\theta}$\n" 272 | ] 273 | }, 274 | { 275 | "cell_type": "code", 276 | "execution_count": 10, 277 | "metadata": {}, 278 | "outputs": [], 279 | "source": [ 280 | "def grad(X, y, theta):\n", 281 | " m = len(y)\n", 282 | " return 1/m * X.T.dot(model(X, theta) - y)" 283 | ] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "execution_count": 11, 288 | "metadata": {}, 289 | "outputs": [], 290 | "source": [ 291 | "def gradient_descent(X, y, theta, learning_rate, n_iterations):\n", 292 | " \n", 293 | " cost_history = np.zeros(n_iterations) # création d'un tableau de stockage pour enregistrer l'évolution du Cout du modele\n", 294 | " \n", 295 | " for i in range(0, n_iterations):\n", 296 | " theta = theta - learning_rate * grad(X, y, theta) # mise a jour du parametre theta (formule du gradient descent)\n", 297 | " cost_history[i] = cost_function(X, y, theta) # on enregistre la valeur du Cout au tour i dans cost_history[i]\n", 298 | " \n", 299 | " return theta, cost_history" 300 | ] 301 | }, 302 | { 303 | "cell_type": "markdown", 304 | "metadata": {}, 305 | "source": [ 306 | "## 1.5 Phase d'entrainement\n", 307 | "On définit un **nombre d'itérations**, ainsi qu'un **pas d'apprentissage $\\alpha$**, et c'est partit !\n", 308 | "\n", 309 | "Une fois le modèle entrainé, on observe les resultats par rapport a notre Dataset" 310 | ] 311 | }, 312 | { 313 | "cell_type": "code", 314 | "execution_count": 12, 315 | "metadata": {}, 316 | "outputs": [], 317 | "source": [ 318 | "n_iterations = 1000\n", 319 | "learning_rate = 0.01\n", 320 | "\n", 321 | "theta_final, cost_history = gradient_descent(X, y, theta, learning_rate, n_iterations)" 322 | ] 323 | }, 324 | { 325 | "cell_type": "code", 326 | "execution_count": 13, 327 | "metadata": {}, 328 | "outputs": [ 329 | { 330 | "data": { 331 | "text/plain": [ 332 | "array([[ 8.60077615],\n", 333 | " [42.23116732],\n", 334 | " [ 8.18143081]])" 335 | ] 336 | }, 337 | "execution_count": 13, 338 | "metadata": {}, 339 | "output_type": "execute_result" 340 | } 341 | ], 342 | "source": [ 343 | "theta_final # voici les parametres du modele une fois que la machine a été entrainée" 344 | ] 345 | }, 346 | { 347 | "cell_type": "code", 348 | "execution_count": 14, 349 | "metadata": {}, 350 | "outputs": [ 351 | { 352 | "data": { 353 | "text/plain": [ 354 | "" 355 | ] 356 | }, 357 | "execution_count": 14, 358 | "metadata": {}, 359 | "output_type": "execute_result" 360 | }, 361 | { 362 | "data": { 363 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAD8CAYAAAB0IB+mAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzt3X10VfWd7/H3Nw9CotCIoEIgwOp1bKXewjI+9GJbn+ZC0UFqa2tXFKrVVJE79gkbb2YKepsx1bbqrU8r7fh8WnXaSulIS2uh4wxr2hoG2pFW79hKkAQrghQ1QSD53T/2OeEk2eecfR72OTnZn9daLDg7O2f/zmr95pfv7/v7/sw5h4iIjH0VpR6AiIgUhwK+iEhEKOCLiESEAr6ISEQo4IuIRIQCvohIRCjgi4hEhAK+iEhEKOCLiEREVakHkGzy5Mlu1qxZpR6GiEhZ2bx58+vOuSmZ7htVAX/WrFl0dnaWehgiImXFzLqC3KeUjohIRCjgi4hEhAK+iEhEKOCLiESEAr6ISEQo4IuIRETggG9mD5jZa2b2fNK11WbWbWZb438WJX3tJjN7ycxeNLMFhR64iIhkJ5sZ/kPAQp/rdzjn5sb/rAMws1OAy4A58e+518wq8x2siIjkLnDAd849C+wNePvFwOPOuXeccy8DLwFn5DA+EZGxJxaDWbOgosL7OxYrymMLkcNfYWa/i6d8jo1fqwdeSbpnZ/yaiEi0xWLQ3AxdXeCc93dzc1GCfr4B/z7g3cBcYBfwjfh187nX+b2BmTWbWaeZde7evTvP4YiIjGKxGCxbBr29Q6/39kJra+iPzyvgO+f+7Jzrd84NAN/mSNpmJzAj6dbpQE+K9+hwzjU65xqnTMnY+0dEpDwlZvb9/f5f37Ej9CHkFfDNbGrSy48CiQqetcBlZjbOzGYDJwG/yedZIiJlrbV15Mw+WUND6EMI3C3TzL4HnANMNrOdwCrgHDObi5eu2Q58FsA5t83MngR+DxwGrnfOpfixJiISAWlm8IfH11DV1hb6EAIHfOfcp3wu/2Oa+9uA8D+BiEg5aGjwFmiHOWwVtCxcwdmnnMOSkIegnbYiIsXQ1ga1tUMu9VaN4wsXfp7vn/xhbl//YuhDUMAXESmGpibo6GDnxCkMYOycOIWWhStYO+dcAHr29YU+hFF14pWIyJjW1MQnX5lKt09wn1ZXE/rjNcMXESmilQtOpqZ6aKeZmupKVi44OfRna4YvIlJES+Z5TQduX/8iPfv6mFZXw8oFJw9eD5MCvohIkS2ZV1+UAD+cUjoiIhGhgC8iEhEK+CIiEaEcvohIkjVbukuyoFoMCvgiInFrtnRz0w//k75DXuuv7n193PTD/6Szay8bX9hd9j8EFPBFROJuX//iYLBP6DvUT+xXOwYP9Ej8EADKLugrhy8iEpeqvcHw05v6DvUXpfdNoSngi4jEZdPeoBi9bwpNAV9EJM6v7YHfea1QnN43haaALyISt2RePbdecir1dTUYUF9XQ9NZDSXrfVNoWrQVEUni1/agceakMVGqqYAvIpLBkt//kiX3t3rHFDY0wIw2mNeU9fuUusZfAV9EJJ1YDJqbjxxA3tXlvQbvUJOAUtX4Q/HKO5XDFxFJp7X1SLBP6O31rmchVY1/Mcs7NcMXkbJQsnTIjh3ZXU8hVRlnMcs7NcMXkVEvkQ7p3teH40g6ZM2W7vAeGovBrFnghm+7imtoyOrtUpVxFrO8UwFfREa9oqdDEnn7ri7/r9fWQltbVm9ZyqMNE5TSEZFRr6jpkFgMli2D/n7/r8+c6QX7LBZsobRHGyYo4IvIqDetroZun+Be8HRIYmafKtibwfbtOb99qY42TFBKR0RGvaKlQ/wqcpL0njitsM8rMgV8ERn1/Foe3HrJqYWfLaepvOmtGsdtH1xa2OcVmVI6IlIWipIOaWjwXag9bBW0LFzBj2fPZ3W4IwiVZvgiIgltbV4FTpLeqnF84cLPs3bOuWXZITOZAr6IRNZzbXfz6rEnMGAVvHrsCTy3/Q3o6KB3aj0DGDsnTqFl4QrWzjm3bDtkJlNKR0Qi6Y+XLuO07z8yOOs9cd9rvOvmL/Hcqq9zes/OITt768u4Q2Yyc6l2kZVAY2Oj6+zsLPUwRGSsi8UYuPxy3xTHq3XHc+Ibfy76kPJhZpudc42Z7lNKR0Qip3fll1MGv+P37S7qWIpJAV9EImf8rp6UX3utbkoRR1JcCvgiEjk9Eyf7Xh8AXvnS3xd3MEWkgC8ikfOdhVfTWzVuyLUB4MnGizi9dUVpBlUEqtIRkbKVa4/8uS3X85WDh/nchoeYtv91eiZO5s7zPs3ZX7mhCKMuHQV8ESlL+RwZuGRePXzlBj555sKyP5g8G4EDvpk9AFwEvOace1/82iTgCWAWsB34hHPuDTMz4C5gEdALfNo59x+FHbqIRFm6HvlBAnepO1eWQjY5/IeAhcOutQC/cM6dBPwi/hrgI8BJ8T/NwH35DVNExJvVz2/fwOyWp33bJUNxjwwsN4EDvnPuWWDvsMsXAw/H//0wsCTp+iPO8yugzsym5jtYEYmu4cccplLu/W7ClG8O/wTn3C4A59wuMzs+fr0eeCXpvp3xa7vyfJ6IjAG5LLb6pXCGGwv9bsIU1qKt+Vzz/aFsZs14aR8asjwUWETKT66LrelSNQaRWXjNR74B/89mNjU+u58KvBa/vhOYkXTfdMB3a5tzrgPoAK+XTp7jEZFRLtfF1lTHHNbX1bCp5byCj3Msynfj1VpgWfzfy4AfJV1fap6zgL8kUj8iEm25HkhetGMOx7BsyjK/B5wDTDazncAqoB140sw+A+wALo3fvg6vJPMlvLLMKws4ZhEpY7keSJ6Y/eey0Uo8ao8sIkU1PIcP3kw9pzNqYzHv4PEdO7zjCdvaoKmpwCMe/YK2R9ZOWxEpqoLN1GMxaG6G3l7vdVeX9xoiGfSDUMAXkdD5lWHmvNAai8ENN8CePSO/1tvrzfgV8H0p4ItIqPLpeTNCLAZXXQUHD6a+Z8eOXIc65qk9soiEKl0ZZtZuuCF9sAcvly++FPBFJFS5lmGOsHy5fxonWW2tt3ArvhTwRSRUqcots+p5E4vB/fenv6eyEjo6lL9PQwFfREJVkA1Tra2QroS8uhoefljBPgMt2opEXK6nRgVVkDLMdAuxZvDggwr2ASjgi0RYQSto0sj7sJGGBq/OfjgzePRRBfuAlNIRibCCVtCEqa3NW5BNZgbXXqtgnwUFfJEIK1gFTdiamrwF2ZkzwYzeqfWsvrSF2RMvZH77BtZs6S71CMuCUjoiEZZrI7OSaGqCpqaipaHGIs3wRSKsHFsOl00aahTSDF8kwnKtoAm7siedsklDjUIK+CIRl20FTalTKmWVhhpllNIRkayUOqVSjmmo0UIzfBHJSqlTKjr5KncK+CKSlYKkVPI8qSrvjVwRpZSOiGQl75TK8uVwxRXezlnnjpxUFYuFMFpJpoAvIllZMq+eWy85lfq6Ggyor6sJfh7t8uVw330jG6ElTqqSUCmlIyJZyymlkqnFsU6qCp1m+CISvlgMli1L3+JYJ1WFTjN8EQlXLObl6Pv7U99jFvikqlJu+ip3CvgiERZ68EzM7NMEewdYwK6Xpd70Ve6U0hGJqETw7N7Xh+NI8CxY58lYjMNXX5M22A8A3z3tQtZcE2zBttSbvsqdAr5IRIUdPHtXfpmqA6k3Yx22Cj530RdpveC6wM8s9aavcqeALxJRYQfP8bt6Un6tt2ocX7jw86ydc25WzyzIgegRpoAvElFhB8+eiZN9rx+2CloWrhgM9tk8U3108qOALxJRBQ+esRjMmgUVFTBrFr9+7wforRo35JbhM3sAi48liLw2fYmqdESiqqBNyBKll7293uuuLi7+82s88f4L+PB//YZp+1+nZ+JkbvvQ0iHBHrwqnWyeqT46uVPAF4mwggXP1tYjwT6u6kAfH+3Zyl/f9Dg9+/qoMKPfZ+NVvfLvRaOALyL5S9EWofbVHja1nAeMrKEH5d+LTTl8EfG1Zks389s3MLvlaea3bxhan798OVRVeTtkq6rg6KP93ySpXYLy76WnGb6IjJB2R+u327yOlwn9/fDWW17gP3z4yPXa2hHtEpR/Ly3N8EVkhFSbsra23zM02Cfr74eZM71Z/8yZ0NGR1aEmEj7N8EVkBL+NUIu3beTGn96d+pucg+3bwxuU5E0BX0RGSD7GcPG2jdz47CPU79+Npfumysp0X5VRQCkdkQhKuyDLkU1Zi7dtpP2ndzM9U7AHrw5fRjXN8EUiJkiL4SXz6qlf9xTznr6DKjeQ+U2vu44117Rye/sG9akfxQoS8M1sO/Am0A8cds41mtkk4AlgFrAd+IRz7o1CPE9EcpeuS+ZggI7FOP0fvgyZgn1tLXR0sOaUc9SnvgwUMqVzrnNurnOuMf66BfiFc+4k4Bfx1yJSYoG6ZPrsnB0hqRJHferLQ5g5/IuBh+P/fhhYEuKzRCSgQF0y0x0oXlsLjz3mVeTEyy7Vp748FCrgO+BnZrbZzBIrNyc453YBxP8+3u8bzazZzDrNrHP37t0FGo6IpBKoS2aqA8UrK33r69WnvjyYS3eKfNA3MZvmnOsxs+OBnwP/C1jrnKtLuucN59yx6d6nsbHRdXZ25j0ekbHE79xZyK7L5fD3OPc9U9j4wm569vWx7OVN3Pivj1D7ao8X6BO7Y5O7X8Jgvt5vM1WqPjlqnVAcZrY5KZ2e+r5CBPxhD14NvAVcA5zjnNtlZlOBXzrn0nZJUsAXGcovkFZXGBgc6j/y32664Jo2GH+7De6/39s0lZAI7ODl8nfsOPKDIM3O2dAPRJeUihbwzexooMI592b83z8HbgHOB/Y459rNrAWY5Jy7Md17KeCLDDW/fcPgBqhM6utqBjtTBnmPT7+8idX/1D402CfMnOm7a1ZBfXQKGvALUZZ5AvCUmSXe77vOuZ+a2XPAk2b2GWAHcGkBniUSKdksemazcLp420b+7uk7/IM9+C7aBqnfl9Et74DvnPsT8H6f63vwZvkikqPkFgdB7g3yHjevv5crtq5LX7Hhs2gbqH5fRjW1VhAZxfwqavxUV1rKg0SS32Pxto2Zg73ZiLbGoNLLsUCtFURGseHnzqY6JvDoo6pSzrITbRJm3P1/OGHfa+l74pjBtdf6Ls6m+m1DpZflQzN8kVFuybx6NrWcx8vtFzKQIuf+l75Dqd8g3ibhxEzBvrISHn0U7r3X98uB6vdlVFPAFykjOW1wCtAmYQDg4YfTll3qiMLyp5SOSBlZueDk7A8CT9cmAS/YP3XmYj4W4HQqHVFY3jTDFykjOc2yU7RJcMDOiVO4cclKKu/zT+PI2KIZvkiZyXqW3dY2ok1CX/U4WhasoHP+oqzbMmizVflSwBcZ6xKpmqQ2CTVtbdwVIIWjzVZjS8F76eRDrRVkrErXvGw0z5pTtWU4traa2qOqRv34o6KYrRVEJA2/WfJjvzqykDqaZ82pNlW90XuIN3q9UtDRPH4ZSou2IiHza0kw3Gg9HSropqrROn4ZSgFfJGRBWw+ku2/Nlm7mt29gdsvTzG/fwB8vXQZVVd7O2KoqWL68UMMdImhrB1CLhXKglI5IyII2QEs1m05OCS3etpHb1t3JuIGk3xj6++G++7x/p9glm6vhrR2m1dXw9juH2eezs1ctFkY/BXyRkJ37ninEfrWDdOUR6TZPJVJCN6+/l6Vb16Vuj9DRUfCADyPLQFMdqKIWC6OfAr5IiNZs6eYHm7uHBHsD/se7J7F9T1+gKpfGTevYuO5Oqgf60/fC6U+/TlAofrN+VemUBwV8kRD5Ldg6YPuePt/TqUaIxbjjn79JRdrfD+Iqg+XaC0EtFsqTFm1FQpRXD/lYDJYuDRbswdtNK5KGAr5IiOpqq7O6Pmj5crjiChgYyPgMB3D++aHk72VsUcAXCVGqjewpN7jHYjBhgld1k2EXvAPerBrHzZ+4CZ55Jq9xSjQo4IuEKNXBJPv6DjG/fQNrtnQfuRiLwVVXwVtvZXxfB7wwaQZntKxhbsv1BRqtjHUK+CIhSlebnmhJMBj0W1vh4MGM75kI9levfEgHkEhWFPBFQpRpp+qQlgQZDioB4LjjsMce4717drCp5TwFe8mKyjJFQpRcs56823bxto3c+OwjTNv/Oj0TJ8OMO7yDSrq6fN/HAd897UL+7oLrmPZKDSu3dCvYS9Y0wxcpsOF9bwA2tZxHfTy9s3jbRtp/ejfT9++mAsf0/bu9kspFizhYOXIONgA8MncRrRdch8MnFSQSkAK+SAEl2g507+sbEZxXLjiZj7/4L3zz6TuoPfzO0G/s7YV16/jtzXewt2YCDm9Wv2f8BD530RdZtWBoczR1p5RcKKUjUkB+O2v7DvWztf0eVq/5BhcfPJi6PcKOHZzeuoJ5/X812Gs+HXWnlGwp4IsUkF8Q/sm3r+M9e18BSN8LJ37Y+Kq/mcPnn9iacX+tulNKtpTSESmg4UH4ke+18p69r6QP9AC1td5h43gLvU1nNaT9HnWnlFxohi9SQCsXnMy/3XIXn9vwENP2v47hMgf7ykqvtXHSoeJfXXIqjTMnDXakrKutxjlvI5e6U0qudIi5SCEtX467777MQT7ZY48NCfYi2dIh5iLFFotBtsH+/POHBPs1W7rVZ15Coxy+SCHEYrBsWaBbEyWXXHfdkKZn6Uo6RQpBAV8kH7EYTJ4Ml1+e9sQpl/TntTPOxpwb0c44VUmn6u2lUJTSEclVLObtkO3tzXirVVQM/kA4IcU9eR2WIhKAZvgiuWptDRTsAfjsZzPekqquXvX2UigK+BIpw/vcZJUfj8Vg1iyoqPD+TtHobAgzL1d/770Zn+3XWVP19lJISulIZCQWRRN58sSiKJC5EiYW4/DV11B1IJ5e6erCYViq/bC1tUNq64M8O7mzpqp0JAwK+BIZ6RZFUwbVWAxaW3FdXSP+YzGcf9A/7ji4664h5ZZBn71kXr0CvIQm9IBvZguBu4BK4DvOufawnyniV8+e1aLo8uVw//2D58qmrq13MHOmd3hJQ4PXHsFnE1WhF2RVry+5CDXgm1klcA/w18BO4DkzW+uc+32Yz5VoS5U+qamuoPfQwIj7hyyKxmJw9dVw4ECgZ3VPnML07dsz3jetrmbIASi+z04hEdy79/VRaUa/89o1JH6vyCo1JZEW9qLtGcBLzrk/OecOAo8DF4f8TIm4VOkTv2BfXWFHFkVjMfqvvDJwsO+tGsd3Fl4d6N5cF2STN2MB9Md/4xi+cqB6fQki7JROPfBK0uudwJkhP1MiLps0yTHjqwZnxb0rv0ztocx96B3ezP7O8z7N2S3XB3pOrguyfj+8UlG9vmQSdsD3S30OmZyYWTPQDNAQ7wcuko9U6ZPhEufKsvp1aGigZlfmEs2+6nG0LFhB5/xFvgE7XW49lwXZbIK46vUlk7AD/k5gRtLr6UBP8g3OuQ6gA7xumSGPR8ao5EBbV1tNdYVxaODI/52Sc94AN6+/lyu2rjuS0+zqwpF6cdYBb1eP5w+rbueu1hUpx5Bz2WcKQX94qV5fggg7h/8ccJKZzTazo4DLgLUhP1MiZnjTsTd6D4FBXU01BtTX1dB0VgMff/Ff2HzXp3j5axexNDnYx1UwMjdO/Nq/Nryf933h+yw98N9SbtYKoxeOX+4/IfHDqb6uhlsvOVULtpJRqDN859xhM1sBrMcry3zAObctzGdK9PgF2kP9jqPHVbF68Ry2tt/D395yN8f2vZmxdbED3qiZwLF9bwKwd/wEbr6gmbVzzgXS1+1nKr3MpZQyOfefXKVTr1JMyUHodfjOuXXAurCfI9GVKtB27+tj8iUXsWr71sA96g9MreeDV3+Htw+mXihN9bxU6ZfaoyrzSvdoM5YUinrpSMnk1dcmid9i5eJtG3n+mx9nfhbBHjNqb/8a225ZyOVnpS4gSH5e8md4+53DVPg87O2D/fzvH/5OrY+l5BTwpSQKedjH8Dz34m0b+dr6uznm0IGsgj3XXju4S/arS07lzk/OTVs7P/wz7Os7xECKsgO/PQCgUkopLvXSkZLIqa9NkuH58Ac6H+T09d+n0nmBNWigd8BfaibwX63/wOnDqm8y1c5nUyOfikoppZgU8KUkgvSWSbXIOTwf3vzENzhr67rszpLFC/aPzF3EqgXLqTlQya1bukf8sEmXP89mdm4G46sqh/yAUCmlFJsCvoTOL3Bn6i3jt8j5+Se20tm1l40v7B4SOJt++9OsZvTg7ZS97UNLh1TfrF67LavF0aA18gBNZzbQOHOSGp5JSZlzo2evU2Njo+vs7Cz1MKSAhgdu8Ga2Hzutnh9s7h5yvbrCOGZ8Fft6D1ERLz8cLrGBKrFLdtr+1zFcoHLLAYzH5n6EVQuWp7zvzk/OBYK1QPD7bMNVmvGpM2fw1SWnZhihSO7MbLNzrjHTfZrhS6hS5eo3vrCbWy85dTCwvqummrcPHvY2TcGIYJ8c4PfVTODoA28zzqXPn3uHhhs9EycPmc2nc/OPt3Hg0ECg8snE6y8++VvfH071dTVsajkv4zNFikUBX0KVLlefnB+f376BfX0jG5ct3raRVc90MOnAkU1Tk/r2Z3yuAx6dt4iv/M/Us3k/iR84ydItJieu+f0Wo/y8jDYK+BKqVHnuCjNmtzyd9nCSEf1uMkjMsfutgtj7F7IqRbA3oK622je4p5JugVZHE0q5UA5fQhUkz11TXcn46go++NzPktI2xwRqhZBs58QpnH3dg4OvK1OsAyTaEvjNysdVVfj+pqH0jIxmQXP42ngloVoyr56PnZZ+ptt3qJ+Fv93A19bfzfT9u6nAMSnLYN9XPY7bPrR08HVNdSWfOnNGyo1TS+bVc+slp1JfVzPYYO3WS05l9eI5OR1UIlIOlNKR0G18Ybfv9eSF2AEzqpz/blQ/Byur6D2qhroDb0FDA89f8yU2V56CDUuppCuFTFdjr/SMjEVK6UjoZrc8PaTt8OJtG1n9i46sUzZwpJvl6vOb+fGcc3m5/cICjlSkPKksU0IXtN3vtLoamp/4BpcnLcBmG+gBBoBH4ztjwUvDiEhwCvgyxJot3axeu21w4fLY2mpW/c0c36P8grb7/eFTqzh+679lH+SPOgomTMDt3UvPxCl87YNXDNbSK68ukj2ldGTQmi3drPyn3w45GhCgwuBdNdXs6z00OJNPHMgxXH1dDZtm7ILWVtixAyZNwu3ZEzzYV1bCwAA0NEBb22D3ylwODxGJiqApHQV8GTS/fUPg81NTlVku3raR/7vhPujtzX4AtbXQ0TEY5EUkGOXwx7CwZrtBuz/2HeofrHFPrrTpmTiZmoMH4EAOwf644+CuuxTsRUKkgF9m8jkqL5Nsuj/2O8ct6+8dshA7ff9u30PAU3GAKdCLFI02XpWZdAeH5GvlgpOp9jujz8enX940JNgnBPluBxyorKbzq9+C119XsBcpEs3wy0yQg0NylfgNIblKJ7lmHmDv+AncckEzN25+POVswTE08B+sqOTQ0ROoefMv9EyczHcWXs3cluu16CpSZAr4ZSbTwSHJcsn1L/n9L1nyrRtgz57B9Exy8D7uwJvc9vSdaVsTv1Ezgd7q8YN5/ds+tJTN8xexqeU8pgOrM39MEQmBAn6ZSdX0a3hNek65/lgMrrwSDnmz+1TpmXGu3yuf7B8Z9AeA1ec3j+g9bzqsW6TklMMvM6mafg0P4jnl+ltbB4N9Rv39XhllMjOeOnOx70EjOqxbpPQ0wy9D6Zp+JSTn9IeXTjLjDv+F0h07gg9i5kxvY1Rig1V8o1TlKedQo8NAREYlBfxRLtea+2l1NZy2ad2IJmXT9++G5mbvxfCg39AAXV2ZB1VdfWQX7LD3WBL/W7tiRUYf7bQdxVIdAO6XwiEWGzLb/uPpH2baj56g5tA7/m8+cyZs3z7yPZJy+L5UNy8y6ugAlDEgVR5+a/s9MGsWVFR4fy9f7s3au7rAOejq4t0/eDR1sAecX/qmqQkefNAL6gnHHQePPea9r3OqmxcpY0rpjGLpznkd1NUF99/vBeNkGX5z+/O7pnCi3xd80jQiMjYo4I9iy17exN/++O7BTU9vVY3jmMPvjCyXzDIt11s1jlvPvoK7CjNMESkTCvijVSzG3z/1dSqT8ukTDqdO0fgZYGjOzuHtlL35gmY2z19UkGGKSPlQDj9MsdjQXHssFvx7W1uHBPtMhp8G21s1jsfmLqJ3aj0DGDsnTuGGi77IaTd8j5/PvUBlkiIRpBl+WGIxbyE10Re+qyt1OaSfLGriE0f/nf+n50a0M1jact6Q0s56lUmKRNbYKsscVpqYfGJS0c2a5V/T7lcOmc33DzMA/HrhJ7iq8cpg5ZsiMuZErywzMaNOKk2kuTm7NEohpZqhB525t7V5Z7oOM2AV7KudyADGq3XHs/mr3+IDP3kiULsFEYm2sTPDz3dGXWC906ZTu6t75PWp9dT27Az2JrEY3OB1rgS06UlEfEVvhp/vjLrAbvvgUnqrxg251ls1jts+uDT4mzQ1eRudtOlJRApg7AT8hobsrofs4dnzaVm4gp0TpwxWybQsXMHDs+cHfo81W7qZ376B2S1PM799A2u2jPyNQUQkqLFTpdPWNrQqBrz2vW1tJRnOtLoa1s45d0Sr4PqAbYLDPLtWRKIprxm+ma02s24z2xr/syjpazeZ2Utm9qKZLch/qBk0NUFHh5ezN/P+7ugoWQpk5YKTqamuHHItmzbBYZ5dKyLRVIgZ/h3Oua8nXzCzU4DLgDnANOAZM/sr59Kci1cIo6gPTGIWnmub4DDPrhWRaAorpXMx8Lhz7h3gZTN7CTgD+PeQnjcqBTmoJJVszq4VEQmiEIu2K8zsd2b2gJkdG79WD7ySdM/O+LURzKzZzDrNrHP37t0FGM7YkG9KSERkuIwB38yeMbPnff5cDNwHvBuYC+wCvpH4Np+38i34d851OOcanXONU6ZMyfFjjD1Bz64VEQkqY0rHOXdBkDcys28D/xx/uROYkfTl6UBP1qOLuHxSQiIiw+VbpTM16eVHgefj/14LXGZm48xsNnAS8Jt8niUiIvlQqi/RAAADH0lEQVTJd9H2NjObi5eu2Q58FsA5t83MngR+DxwGrg+9QofcD/wWEYmCvAK+c+6KNF9rA4q260kblURE0hszrRW0UUlEJL0xE/C1UUlEJL0xE/BTbUjSRiUREc+YCfjaqCQikt6Y6ZaZb+8aEZGxbswEfNBGJRGRdMZMSkdERNJTwBcRiQgFfBGRiFDAFxGJCAV8EZGIMOd829SXhJntBrpKPY4Cmwy8XupBFFkUPzPoc0fNaPrcM51zGQ8UGVUBfywys07nXGOpx1FMUfzMoM9d6nEUWzl+bqV0REQiQgFfRCQiFPDD11HqAZRAFD8z6HNHTdl9buXwRUQiQjN8EZGIUMAPmZndbmYvmNnvzOwpM6sr9ZiKwcwuNbNtZjZgZmVVyZALM1toZi+a2Utm1lLq8RSDmT1gZq+Z2fOlHksxmdkMM9toZn+I/3/8hlKPKSgF/PD9HHifc+6/A/8PuKnE4ymW54FLgGdLPZCwmVklcA/wEeAU4FNmdkppR1UUDwELSz2IEjgMfNE5917gLOD6cvnfWwE/ZM65nznnDsdf/gqYXsrxFItz7g/OuagcKHwG8JJz7k/OuYPA48DFJR5T6JxzzwJ7Sz2OYnPO7XLO/Uf8328CfwDKoi+7An5xXQX8pNSDkIKrB15Jer2TMgkAkh8zmwXMA35d2pEEM6YOQCkVM3sGONHnS63OuR/F72nF+1UwVsyxhSnI544I87mm8rcxzsyOAX4AfM45t7/U4wlCAb8AnHMXpPu6mS0DLgLOd2OoDjbT546QncCMpNfTgZ4SjUWKwMyq8YJ9zDn3w1KPJyildEJmZguBLwOLnXO9pR6PhOI54CQzm21mRwGXAWtLPCYJiZkZ8I/AH5xz3yz1eLKhgB++u4EJwM/NbKuZ3V/qARWDmX3UzHYCHwCeNrP1pR5TWOKL8iuA9XgLeE8657aVdlThM7PvAf8OnGxmO83sM6UeU5HMB64Azov/N73VzBaVelBBaKetiEhEaIYvIhIRCvgiIhGhgC8iEhEK+CIiEaGALyISEQr4IiIRoYAvIhIRCvgiIhHx/wGhIR4L4P6U6wAAAABJRU5ErkJggg==\n", 364 | "text/plain": [ 365 | "
" 366 | ] 367 | }, 368 | "metadata": { 369 | "needs_background": "light" 370 | }, 371 | "output_type": "display_data" 372 | } 373 | ], 374 | "source": [ 375 | "# création d'un vecteur prédictions qui contient les prédictions de notre modele final\n", 376 | "predictions = model(X, theta_final)\n", 377 | "\n", 378 | "# Affiche les résultats de prédictions (en rouge) par rapport a notre Dataset (en bleu)\n", 379 | "plt.scatter(x, y)\n", 380 | "plt.scatter(x, predictions, c='r')" 381 | ] 382 | }, 383 | { 384 | "cell_type": "markdown", 385 | "metadata": {}, 386 | "source": [ 387 | "## 1.6 Courbes d'apprentissage\n", 388 | "Pour vérifier si notre algorithme de Descente de gradient a bien fonctionné, on observe l'évolution de la fonction cout à travers les itérations. On est sensé obtenir une courbe qui diminue à chaque itération jusqu'à stagner a un niveau minimal (proche de zéro). Si la courbe ne suit pas ce motif, alors le pas **learning_rate** est peut-etre trop élevé, il faut prendre un pas plus faible." 389 | ] 390 | }, 391 | { 392 | "cell_type": "code", 393 | "execution_count": 15, 394 | "metadata": {}, 395 | "outputs": [ 396 | { 397 | "data": { 398 | "text/plain": [ 399 | "[]" 400 | ] 401 | }, 402 | "execution_count": 15, 403 | "metadata": {}, 404 | "output_type": "execute_result" 405 | }, 406 | { 407 | "data": { 408 | "image/png": "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\n", 409 | "text/plain": [ 410 | "
" 411 | ] 412 | }, 413 | "metadata": { 414 | "needs_background": "light" 415 | }, 416 | "output_type": "display_data" 417 | } 418 | ], 419 | "source": [ 420 | "plt.plot(range(n_iterations), cost_history)" 421 | ] 422 | }, 423 | { 424 | "cell_type": "markdown", 425 | "metadata": {}, 426 | "source": [ 427 | "## 1.7 Evaluation finale\n", 428 | "Pour évaluer la réelle performance de notre modèle avec une métrique populaire (pour votre patron, client, ou vos collegues) on peut utiliser le **coefficient de détermination**, aussi connu sous le nom $R^2$. Il nous vient de la méthode des moindres carrés. Plus le résultat est proche de 1, meilleur est votre modèle" 429 | ] 430 | }, 431 | { 432 | "cell_type": "code", 433 | "execution_count": 16, 434 | "metadata": {}, 435 | "outputs": [], 436 | "source": [ 437 | "def coef_determination(y, pred):\n", 438 | " u = ((y - pred)**2).sum()\n", 439 | " v = ((y - y.mean())**2).sum()\n", 440 | " return 1 - u/v" 441 | ] 442 | }, 443 | { 444 | "cell_type": "code", 445 | "execution_count": 17, 446 | "metadata": {}, 447 | "outputs": [ 448 | { 449 | "data": { 450 | "text/plain": [ 451 | "0.9287186469389942" 452 | ] 453 | }, 454 | "execution_count": 17, 455 | "metadata": {}, 456 | "output_type": "execute_result" 457 | } 458 | ], 459 | "source": [ 460 | "coef_determination(y, predictions)" 461 | ] 462 | }, 463 | { 464 | "cell_type": "markdown", 465 | "metadata": {}, 466 | "source": [ 467 | "# 2. Régression Multiples Variables\n", 468 | "C'est lorsqu'on integre plusieures variables $x_1, x_2, x_3, etc.$ à notre modèle que les choses commencent à devenir vraiment intéressantes. C'est peut-être aussi à ce moment que les gens commencent parfois à parler *d'intelligence artificielle*, car il est difficile pour un être humain de se représenter dans sa tête un modèle à plusieurs dimensions (nous n'évoluons que dans un espace 3D). On se dit alors que la machine, quant à elle, arrive à se réprésenter ces espaces, car elle y trouve le meilleur modèle (avec la descente de gradient) et les gens disent donc qu'elle est intelligente, alors que ce ne sont que des mathématiques.\n", 469 | "\n", 470 | "## 2.1 Dataset\n", 471 | "\n", 472 | "\n", 473 | "Dans ce notbook, nous allons créer un modèle à 2 variables $x_1, x_2$. Pour cela, il suffit d'injecter les différentes variables $x_1, x_2$ (les **features** en anglais) dans la matrice $X$, et de créer le vecteur $\\theta$ qui s'accorde avec:\n", 474 | "\n", 475 | "\n", 476 | "\n", 477 | "$X = \\begin{bmatrix} x^{(1)}_1 & x^{(1)}_2 & 1 \\\\ ... & ... & ... \\\\ x^{(m)}_1 & x^{(m)}_2 & 1 \\end{bmatrix}$\n", 478 | "\n", 479 | "$\\theta = \\begin{bmatrix} a\\\\b\\\\c \\end{bmatrix}$\n", 480 | "\n", 481 | "$y = \\begin{bmatrix} y^{(1)}\\\\...\\\\y^{(m)} \\end{bmatrix}$ *note : le vecteur $y$ reste le meme que pour la régression linéaire*\n" 482 | ] 483 | }, 484 | { 485 | "cell_type": "code", 486 | "execution_count": 18, 487 | "metadata": {}, 488 | "outputs": [ 489 | { 490 | "data": { 491 | "text/plain": [ 492 | "" 493 | ] 494 | }, 495 | "execution_count": 18, 496 | "metadata": {}, 497 | "output_type": "execute_result" 498 | }, 499 | { 500 | "data": { 501 | "image/png": "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\n", 502 | "text/plain": [ 503 | "
" 504 | ] 505 | }, 506 | "metadata": { 507 | "needs_background": "light" 508 | }, 509 | "output_type": "display_data" 510 | } 511 | ], 512 | "source": [ 513 | "np.random.seed(0) # permet de reproduire l'aléatoire\n", 514 | "\n", 515 | "x, y = make_regression(n_samples=100, n_features=2, noise = 10) # creation d'un dataset (x, y) linéaire\n", 516 | "\n", 517 | "plt.scatter(x[:,0], y) # afficher les résultats. x_1 en abscisse et y en ordonnée" 518 | ] 519 | }, 520 | { 521 | "cell_type": "markdown", 522 | "metadata": {}, 523 | "source": [ 524 | "Ce Dataset ne contenant que 2 variables $x_1 et x_2$ il est possible de le visualiser dans un espace 3D. Comme vous pouvez le voir, ce modèle peut être représenté par une surface. Au passage, cette surface est plane car make_regression nous retourne des données linéaire. Si on veut créer une surface non plane, il suffit de modifier la valeur de y comme nous l'avons fait au début de ce notebook. (Nous ne le ferons pas ici)" 525 | ] 526 | }, 527 | { 528 | "cell_type": "code", 529 | "execution_count": 25, 530 | "metadata": {}, 531 | "outputs": [ 532 | { 533 | "data": { 534 | "text/plain": [ 535 | "Text(0.5, 0, 'y')" 536 | ] 537 | }, 538 | "execution_count": 25, 539 | "metadata": {}, 540 | "output_type": "execute_result" 541 | } 542 | ], 543 | "source": [ 544 | "from mpl_toolkits.mplot3d import Axes3D\n", 545 | "#%matplotlib notebook #activez cette ligne pour manipuler le graph 3D\n", 546 | "\n", 547 | "ax = fig.add_subplot(111, projection='3d')\n", 548 | "\n", 549 | "ax.scatter(x[:,0], x[:,1], y) # affiche en 3D la variable x_1, x_2, et la target y\n", 550 | "\n", 551 | "# affiche les noms des axes\n", 552 | "ax.set_xlabel('x_1')\n", 553 | "ax.set_ylabel('x_2')\n", 554 | "ax.set_zlabel('y')" 555 | ] 556 | }, 557 | { 558 | "cell_type": "code", 559 | "execution_count": 26, 560 | "metadata": {}, 561 | "outputs": [ 562 | { 563 | "name": "stdout", 564 | "output_type": "stream", 565 | "text": [ 566 | "(100, 2)\n", 567 | "(100, 1)\n", 568 | "(100, 1)\n" 569 | ] 570 | } 571 | ], 572 | "source": [ 573 | "# Verification des dimensions\n", 574 | "print(x.shape)\n", 575 | "print(y.shape)\n", 576 | "\n", 577 | "# redimensionner y\n", 578 | "y = y.reshape(y.shape[0], 1)\n", 579 | "print(y.shape)" 580 | ] 581 | }, 582 | { 583 | "cell_type": "code", 584 | "execution_count": 27, 585 | "metadata": {}, 586 | "outputs": [ 587 | { 588 | "name": "stdout", 589 | "output_type": "stream", 590 | "text": [ 591 | "(100, 3)\n", 592 | "[[ 1.05445173 -1.07075262 1. ]\n", 593 | " [-0.36274117 -0.63432209 1. ]\n", 594 | " [-0.85409574 0.3130677 1. ]\n", 595 | " [ 1.3263859 0.29823817 1. ]\n", 596 | " [-0.4615846 -1.31590741 1. ]\n", 597 | " [ 1.94362119 -1.17312341 1. ]\n", 598 | " [-1.60205766 0.62523145 1. ]\n", 599 | " [-0.40178094 0.17742614 1. ]\n", 600 | " [-0.97727788 1.86755799 1. ]\n", 601 | " [ 0.37816252 0.15494743 1. ]]\n" 602 | ] 603 | } 604 | ], 605 | "source": [ 606 | "# Création de la matrice X, inclut le Biais\n", 607 | "X = np.hstack((x, np.ones((x.shape[0], 1)))) # ajoute un vecteur Biais de dimension (x.shape[0], 1)\n", 608 | "\n", 609 | "print(X.shape)\n", 610 | "print(X[:10])" 611 | ] 612 | }, 613 | { 614 | "cell_type": "code", 615 | "execution_count": 28, 616 | "metadata": {}, 617 | "outputs": [ 618 | { 619 | "data": { 620 | "text/plain": [ 621 | "array([[-1.26459544],\n", 622 | " [ 0.85693318],\n", 623 | " [-0.49399435]])" 624 | ] 625 | }, 626 | "execution_count": 28, 627 | "metadata": {}, 628 | "output_type": "execute_result" 629 | } 630 | ], 631 | "source": [ 632 | "# Initialisation du vecteur theta aléatoire, avec 3 éléments (car X a trois colonnes)\n", 633 | "theta = np.random.randn(3, 1)\n", 634 | "theta" 635 | ] 636 | }, 637 | { 638 | "cell_type": "markdown", 639 | "metadata": {}, 640 | "source": [ 641 | "## 2.2 Modèle Linéaire\n", 642 | "## 2.3 Fonction Cout\n", 643 | "## 2.4 Gradient Descent\n", 644 | "\n", 645 | "Nos fonctions étant déjà implémentées, inutile de les réécrire. Passons imédiatement à la phase d'entrainement !" 646 | ] 647 | }, 648 | { 649 | "cell_type": "markdown", 650 | "metadata": {}, 651 | "source": [ 652 | "## 2.5 Phase d'entrainement" 653 | ] 654 | }, 655 | { 656 | "cell_type": "code", 657 | "execution_count": 29, 658 | "metadata": {}, 659 | "outputs": [], 660 | "source": [ 661 | "n_iterations = 1000\n", 662 | "learning_rate = 0.01\n", 663 | "\n", 664 | "theta_final, cost_history = gradient_descent(X, y, theta, learning_rate, n_iterations)" 665 | ] 666 | }, 667 | { 668 | "cell_type": "code", 669 | "execution_count": 30, 670 | "metadata": {}, 671 | "outputs": [ 672 | { 673 | "data": { 674 | "text/plain": [ 675 | "array([[28.67153869],\n", 676 | " [97.2952491 ],\n", 677 | " [-0.51147823]])" 678 | ] 679 | }, 680 | "execution_count": 30, 681 | "metadata": {}, 682 | "output_type": "execute_result" 683 | } 684 | ], 685 | "source": [ 686 | "# création d'un vecteur prédictions qui contient les prédictions de notre modele final\n", 687 | "predictions = model(X, theta_final)\n", 688 | "\n", 689 | "theta_final" 690 | ] 691 | }, 692 | { 693 | "cell_type": "code", 694 | "execution_count": 31, 695 | "metadata": {}, 696 | "outputs": [ 697 | { 698 | "data": { 699 | "text/plain": [ 700 | "" 701 | ] 702 | }, 703 | "execution_count": 31, 704 | "metadata": {}, 705 | "output_type": "execute_result" 706 | }, 707 | { 708 | "data": { 709 | "image/png": "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\n", 710 | "text/plain": [ 711 | "
" 712 | ] 713 | }, 714 | "metadata": { 715 | "needs_background": "light" 716 | }, 717 | "output_type": "display_data" 718 | } 719 | ], 720 | "source": [ 721 | "fig = plt.figure()\n", 722 | "ax = fig.add_subplot(111, projection='3d')\n", 723 | "\n", 724 | "ax.scatter(x[:,0], x[:,1], y)\n", 725 | "ax.scatter(x[:,0], x[:,1], predictions)" 726 | ] 727 | }, 728 | { 729 | "cell_type": "markdown", 730 | "metadata": {}, 731 | "source": [ 732 | "## 2.6 Courbe d'apprentissage" 733 | ] 734 | }, 735 | { 736 | "cell_type": "code", 737 | "execution_count": 32, 738 | "metadata": {}, 739 | "outputs": [ 740 | { 741 | "data": { 742 | "text/plain": [ 743 | "[]" 744 | ] 745 | }, 746 | "execution_count": 32, 747 | "metadata": {}, 748 | "output_type": "execute_result" 749 | }, 750 | { 751 | "data": { 752 | "image/png": "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\n", 753 | "text/plain": [ 754 | "
" 755 | ] 756 | }, 757 | "metadata": { 758 | "needs_background": "light" 759 | }, 760 | "output_type": "display_data" 761 | } 762 | ], 763 | "source": [ 764 | "plt.plot(range(n_iterations), cost_history)" 765 | ] 766 | }, 767 | { 768 | "cell_type": "markdown", 769 | "metadata": {}, 770 | "source": [ 771 | "## 1.7 Evaluation finale" 772 | ] 773 | }, 774 | { 775 | "cell_type": "code", 776 | "execution_count": 33, 777 | "metadata": {}, 778 | "outputs": [ 779 | { 780 | "data": { 781 | "text/plain": [ 782 | "0.9916687122229687" 783 | ] 784 | }, 785 | "execution_count": 33, 786 | "metadata": {}, 787 | "output_type": "execute_result" 788 | } 789 | ], 790 | "source": [ 791 | "coef_determination(y, predictions)" 792 | ] 793 | }, 794 | { 795 | "cell_type": "markdown", 796 | "metadata": {}, 797 | "source": [ 798 | "Merci d'avoir suivi ce tutoriel. Abonnez-vous a ma chaine youtube pour ne pas louper d'autres tutos (chaque semaine de nouvelles vidéos!) https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ" 799 | ] 800 | }, 801 | { 802 | "cell_type": "code", 803 | "execution_count": null, 804 | "metadata": {}, 805 | "outputs": [], 806 | "source": [] 807 | } 808 | ], 809 | "metadata": { 810 | "kernelspec": { 811 | "display_name": "Python 3", 812 | "language": "python", 813 | "name": "python3" 814 | }, 815 | "language_info": { 816 | "codemirror_mode": { 817 | "name": "ipython", 818 | "version": 3 819 | }, 820 | "file_extension": ".py", 821 | "mimetype": "text/x-python", 822 | "name": "python", 823 | "nbconvert_exporter": "python", 824 | "pygments_lexer": "ipython3", 825 | "version": "3.7.3" 826 | } 827 | }, 828 | "nbformat": 4, 829 | "nbformat_minor": 2 830 | } 831 | -------------------------------------------------------------------------------- /Régression Linéaire Numpy.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# Régression Linéaire Simple Numpy\n", 8 | "\n", 9 | "Guillaume Saint-Cirgue\n", 10 | "https://machinelearnia.com/\n", 11 | "\n", 12 | "Youtube: coming soon\n", 13 | "\n", 14 | "article associé: coming soon" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 31, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "import numpy as np\n", 24 | "from sklearn.datasets import make_regression\n", 25 | "import matplotlib.pyplot as plt" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": {}, 31 | "source": [ 32 | "# 1. Dataset\n", 33 | "Génération de données aléatoires avec une tendance linéaire avec make_regression: on a un dataset $(x, y)$ qui contient 100 exemples, et une seule variable $x$. Note: chaque fois que la cellule est executée, des données différentes sont générer. Utiliser np.random.seed(0) pour reproduire le meme Dataset a chaque fois." 34 | ] 35 | }, 36 | { 37 | "cell_type": "code", 38 | "execution_count": 32, 39 | "metadata": {}, 40 | "outputs": [ 41 | { 42 | "data": { 43 | "text/plain": [ 44 | "" 45 | ] 46 | }, 47 | "execution_count": 32, 48 | "metadata": {}, 49 | "output_type": "execute_result" 50 | }, 51 | { 52 | "data": { 53 | "image/png": "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\n", 54 | "text/plain": [ 55 | "
" 56 | ] 57 | }, 58 | "metadata": { 59 | "needs_background": "light" 60 | }, 61 | "output_type": "display_data" 62 | } 63 | ], 64 | "source": [ 65 | "np.random.seed(0) # pour toujours reproduire le meme dataset\n", 66 | "x, y = make_regression(n_samples=100, n_features=1, noise=10)\n", 67 | "plt.scatter(x, y) # afficher les résultats. X en abscisse et y en ordonnée" 68 | ] 69 | }, 70 | { 71 | "cell_type": "markdown", 72 | "metadata": {}, 73 | "source": [ 74 | "Important: vérifier les dimensions de x et y. On remarque que y n'a pas les dimensions (100, 1). On corrige le probleme avec np.reshape" 75 | ] 76 | }, 77 | { 78 | "cell_type": "code", 79 | "execution_count": 33, 80 | "metadata": {}, 81 | "outputs": [ 82 | { 83 | "name": "stdout", 84 | "output_type": "stream", 85 | "text": [ 86 | "(100, 1)\n", 87 | "(100,)\n", 88 | "(100, 1)\n" 89 | ] 90 | } 91 | ], 92 | "source": [ 93 | "print(x.shape)\n", 94 | "print(y.shape)\n", 95 | "\n", 96 | "# redimensionner y\n", 97 | "y = y.reshape(y.shape[0], 1)\n", 98 | "\n", 99 | "print(y.shape)" 100 | ] 101 | }, 102 | { 103 | "cell_type": "markdown", 104 | "metadata": {}, 105 | "source": [ 106 | "Création de la matrice X qui contient la colonne de Biais. Pour ca, on colle l'un contre l'autre le vecteur x et un vecteur 1 (avec np.ones) de dimension égale a celle de x" 107 | ] 108 | }, 109 | { 110 | "cell_type": "code", 111 | "execution_count": 34, 112 | "metadata": {}, 113 | "outputs": [ 114 | { 115 | "name": "stdout", 116 | "output_type": "stream", 117 | "text": [ 118 | "(100, 2)\n" 119 | ] 120 | } 121 | ], 122 | "source": [ 123 | "X = np.hstack((x, np.ones(x.shape)))\n", 124 | "print(X.shape)" 125 | ] 126 | }, 127 | { 128 | "cell_type": "markdown", 129 | "metadata": {}, 130 | "source": [ 131 | "Finalement, création d'un vecteur parametre $\\theta$, initialisé avec des coefficients aléatoires. Ce vecteur est de dimension (2, 1). Si on désire toujours reproduire le meme vecteur $\\theta$, on utilise comme avant np.random.seed(0)." 132 | ] 133 | }, 134 | { 135 | "cell_type": "code", 136 | "execution_count": 35, 137 | "metadata": {}, 138 | "outputs": [ 139 | { 140 | "data": { 141 | "text/plain": [ 142 | "array([[1.76405235],\n", 143 | " [0.40015721]])" 144 | ] 145 | }, 146 | "execution_count": 35, 147 | "metadata": {}, 148 | "output_type": "execute_result" 149 | } 150 | ], 151 | "source": [ 152 | "np.random.seed(0) # pour produire toujours le meme vecteur theta aléatoire\n", 153 | "theta = np.random.randn(2, 1)\n", 154 | "theta" 155 | ] 156 | }, 157 | { 158 | "cell_type": "markdown", 159 | "metadata": {}, 160 | "source": [ 161 | "# 2. Modele Linéaire\n", 162 | "On implémente un modele $F = X.\\theta$, puis on teste le modele pour voir s'il n'y a pas de bug (bonne pratique oblige). En plus, cela permet de voir a quoi ressemble le modele initial, défini par la valeur de $\\theta$" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "execution_count": 36, 168 | "metadata": {}, 169 | "outputs": [], 170 | "source": [ 171 | "def model(X, theta):\n", 172 | " return X.dot(theta)" 173 | ] 174 | }, 175 | { 176 | "cell_type": "code", 177 | "execution_count": 37, 178 | "metadata": {}, 179 | "outputs": [ 180 | { 181 | "data": { 182 | "text/plain": [ 183 | "[]" 184 | ] 185 | }, 186 | "execution_count": 37, 187 | "metadata": {}, 188 | "output_type": "execute_result" 189 | }, 190 | { 191 | "data": { 192 | "image/png": "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\n", 193 | "text/plain": [ 194 | "
" 195 | ] 196 | }, 197 | "metadata": { 198 | "needs_background": "light" 199 | }, 200 | "output_type": "display_data" 201 | } 202 | ], 203 | "source": [ 204 | "plt.scatter(x, y)\n", 205 | "plt.plot(x, model(X, theta), c='r')" 206 | ] 207 | }, 208 | { 209 | "cell_type": "markdown", 210 | "metadata": {}, 211 | "source": [ 212 | "# 3. Fonction Cout : Erreur Quadratique moyenne\n", 213 | "On mesure les erreurs du modele sur le Dataset X, y en implémenterl'erreur quadratique moyenne, **Mean Squared Error (MSE)** en anglais.\n", 214 | "\n", 215 | "$ J(\\theta) = \\frac{1}{2m} \\sum (X.\\theta - y)^2 $\n", 216 | "\n", 217 | "Ensuite, on teste notre fonction, pour voir s'il n'y a pas de bug" 218 | ] 219 | }, 220 | { 221 | "cell_type": "code", 222 | "execution_count": 38, 223 | "metadata": {}, 224 | "outputs": [], 225 | "source": [ 226 | "def cost_function(X, y, theta):\n", 227 | " m = len(y)\n", 228 | " return 1/(2*m) * np.sum((model(X, theta) - y)**2)" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 39, 234 | "metadata": {}, 235 | "outputs": [ 236 | { 237 | "data": { 238 | "text/plain": [ 239 | "905.6306841935502" 240 | ] 241 | }, 242 | "execution_count": 39, 243 | "metadata": {}, 244 | "output_type": "execute_result" 245 | } 246 | ], 247 | "source": [ 248 | "cost_function(X, y, theta)" 249 | ] 250 | }, 251 | { 252 | "cell_type": "markdown", 253 | "metadata": {}, 254 | "source": [ 255 | "# 4. Gradients et Descente de Gradient\n", 256 | "On implémente la formule du gradient pour la **MSE**\n", 257 | "\n", 258 | "$\\frac{\\partial J(\\theta) }{\\partial \\theta} = \\frac{1}{m} X^T.(X.\\theta - y)$\n", 259 | "\n", 260 | "Ensuite on utilise cette fonction dans la descente de gradient:\n", 261 | "\n", 262 | "$\\theta = \\theta - \\alpha \\frac{\\partial J(\\theta) }{\\partial \\theta}$\n" 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": 40, 268 | "metadata": {}, 269 | "outputs": [], 270 | "source": [ 271 | "def grad(X, y, theta):\n", 272 | " m = len(y)\n", 273 | " return 1/m * X.T.dot(model(X, theta) - y)" 274 | ] 275 | }, 276 | { 277 | "cell_type": "code", 278 | "execution_count": 45, 279 | "metadata": {}, 280 | "outputs": [], 281 | "source": [ 282 | "def gradient_descent(X, y, theta, learning_rate, n_iterations):\n", 283 | " \n", 284 | " cost_history = np.zeros(n_iterations) # création d'un tableau de stockage pour enregistrer l'évolution du Cout du modele\n", 285 | " \n", 286 | " for i in range(0, n_iterations):\n", 287 | " theta = theta - learning_rate * grad(X, y, theta) # mise a jour du parametre theta (formule du gradient descent)\n", 288 | " cost_history[i] = cost_function(X, y, theta) # on enregistre la valeur du Cout au tour i dans cost_history[i]\n", 289 | " \n", 290 | " return theta, cost_history" 291 | ] 292 | }, 293 | { 294 | "cell_type": "markdown", 295 | "metadata": {}, 296 | "source": [ 297 | "# 5. Phase d'entrainement\n", 298 | "On définit un **nombre d'itérations**, ainsi qu'un **pas d'apprentissage $\\alpha$**, et c'est partit !\n", 299 | "\n", 300 | "Une fois le modele entrainé, on observe les resultats par rapport a notre Dataset" 301 | ] 302 | }, 303 | { 304 | "cell_type": "code", 305 | "execution_count": 46, 306 | "metadata": {}, 307 | "outputs": [], 308 | "source": [ 309 | "n_iterations = 1000\n", 310 | "learning_rate = 0.01\n", 311 | "\n", 312 | "\n", 313 | "theta_final, cost_history = gradient_descent(X, y, theta, learning_rate, n_iterations)" 314 | ] 315 | }, 316 | { 317 | "cell_type": "code", 318 | "execution_count": 47, 319 | "metadata": {}, 320 | "outputs": [ 321 | { 322 | "data": { 323 | "text/plain": [ 324 | "array([[42.61765864],\n", 325 | " [-0.81309274]])" 326 | ] 327 | }, 328 | "execution_count": 47, 329 | "metadata": {}, 330 | "output_type": "execute_result" 331 | } 332 | ], 333 | "source": [ 334 | "theta_final # voici les parametres du modele une fois que la machine a été entrainée" 335 | ] 336 | }, 337 | { 338 | "cell_type": "code", 339 | "execution_count": 48, 340 | "metadata": {}, 341 | "outputs": [ 342 | { 343 | "data": { 344 | "text/plain": [ 345 | "[]" 346 | ] 347 | }, 348 | "execution_count": 48, 349 | "metadata": {}, 350 | "output_type": "execute_result" 351 | }, 352 | { 353 | "data": { 354 | "image/png": "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\n", 355 | "text/plain": [ 356 | "
" 357 | ] 358 | }, 359 | "metadata": { 360 | "needs_background": "light" 361 | }, 362 | "output_type": "display_data" 363 | } 364 | ], 365 | "source": [ 366 | "# création d'un vecteur prédictions qui contient les prédictions de notre modele final\n", 367 | "predictions = model(X, theta_final)\n", 368 | "\n", 369 | "# Affiche les résultats de prédictions (en rouge) par rapport a notre Dataset (en bleu)\n", 370 | "plt.scatter(x, y)\n", 371 | "plt.plot(x, predictions, c='r')" 372 | ] 373 | }, 374 | { 375 | "cell_type": "markdown", 376 | "metadata": {}, 377 | "source": [ 378 | "# 6. Courbes d'apprentissage\n", 379 | "Pour vérifier si notre algorithme de Descente de gradient a bien fonctionné, on observe l'évolution de la fonction cout a travers les itérations. On est sensé obtenir une courbe qui diminue a chaque itération jusqu'a stagner a un niveau minimal (proche de zéro). Si la courbe ne suit pas ce motif, alors le pas **learning_rate** est peut-etre trop élevé, il faut prendre un pas plus faible." 380 | ] 381 | }, 382 | { 383 | "cell_type": "code", 384 | "execution_count": 49, 385 | "metadata": {}, 386 | "outputs": [ 387 | { 388 | "data": { 389 | "text/plain": [ 390 | "[]" 391 | ] 392 | }, 393 | "execution_count": 49, 394 | "metadata": {}, 395 | "output_type": "execute_result" 396 | }, 397 | { 398 | "data": { 399 | "image/png": "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\n", 400 | "text/plain": [ 401 | "
" 402 | ] 403 | }, 404 | "metadata": { 405 | "needs_background": "light" 406 | }, 407 | "output_type": "display_data" 408 | } 409 | ], 410 | "source": [ 411 | "plt.plot(range(n_iterations), cost_history)" 412 | ] 413 | }, 414 | { 415 | "cell_type": "markdown", 416 | "metadata": {}, 417 | "source": [ 418 | "# 7. Evaluation finale\n", 419 | "Pour évaluer la réelle performance de notre modele avec une métrique populaire (pour votre patron, client, ou vos collegues) on peut utiliser le **coefficient de détermination**, aussi connu sous le nom $R^2$. Il nous vient de la méthode des moindres carrés. Plus le résultat est proche de 1, meilleur est votre modele" 420 | ] 421 | }, 422 | { 423 | "cell_type": "code", 424 | "execution_count": 50, 425 | "metadata": {}, 426 | "outputs": [], 427 | "source": [ 428 | "def coef_determination(y, pred):\n", 429 | " u = ((y - pred)**2).sum()\n", 430 | " v = ((y - y.mean())**2).sum()\n", 431 | " return 1 - u/v" 432 | ] 433 | }, 434 | { 435 | "cell_type": "code", 436 | "execution_count": 51, 437 | "metadata": {}, 438 | "outputs": [ 439 | { 440 | "data": { 441 | "text/plain": [ 442 | "0.9417294706504984" 443 | ] 444 | }, 445 | "execution_count": 51, 446 | "metadata": {}, 447 | "output_type": "execute_result" 448 | } 449 | ], 450 | "source": [ 451 | "coef_determination(y, predictions)" 452 | ] 453 | }, 454 | { 455 | "cell_type": "markdown", 456 | "metadata": {}, 457 | "source": [ 458 | "Merci d'avoir suivi ce tutoriel. Abonnez-vous a ma chaine youtube pour ne pas louper d'autres tutos (chaque semaine de nouvelles vidéos!) https://www.youtube.com/channel/UCmpptkXu8iIFe6kfDK5o7VQ" 459 | ] 460 | }, 461 | { 462 | "cell_type": "code", 463 | "execution_count": null, 464 | "metadata": {}, 465 | "outputs": [], 466 | "source": [] 467 | } 468 | ], 469 | "metadata": { 470 | "kernelspec": { 471 | "display_name": "Python 3", 472 | "language": "python", 473 | "name": "python3" 474 | }, 475 | "language_info": { 476 | "codemirror_mode": { 477 | "name": "ipython", 478 | "version": 3 479 | }, 480 | "file_extension": ".py", 481 | "mimetype": "text/x-python", 482 | "name": "python", 483 | "nbconvert_exporter": "python", 484 | "pygments_lexer": "ipython3", 485 | "version": "3.7.3" 486 | } 487 | }, 488 | "nbformat": 4, 489 | "nbformat_minor": 2 490 | } 491 | --------------------------------------------------------------------------------