{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "#
Diplomado en Inteligencia Artificial y Aprendizaje Profundo
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#
Clasificación Lineal binaria en Python
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Profesores" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. Alvaro Mauricio Montenegro Díaz, ammontenegrod@unal.edu.co\n", "2. Daniel Mauricio Montenegro Reyes, dextronomo@gmail.com \n", "3. Campo Elías Pardo Turriago, cepardot@unal.edu.co " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Asesora Medios y Marketing digital\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "4. Maria del Pilar Montenegro, pmontenegro88@gmail.com " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Asistentes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "5. Oleg Jarma, ojarmam@unal.edu.co \n", "6. Laura Lizarazo, ljlizarazore@unal.edu.co " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Contenido" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- [Introduccion](#Introducción)\n", "- [Importamos la librerías que usaremos](#Importamos-la-librerías-que-usaremos)\n", "- [Preprocesamiento](#Preprocesamiento)\n", "- [Análisis exploratorio inicial](#Análisis-exploratorio-inicial)\n", "- [Clasificación usando un modelo lineal](#Clasificación-usando-un-modelo-lineal)\n", "- [Funciones de pérdida](#Funciones-de-pérdida)\n", "- [Aprendizaje como optimización](Aprendizaje-como-optimización)\n", "- [Analizando la función de pérdida cuadrática](#Analizando-la-función-de-pérdida-cuadrática)\n", "- [Gradiente descendiente](#Gradiente-descendiente)\n", "- [Gradiente descendente en batch](#Gradiente-descendente-en-batch)\n", "- [Gradiente descendente estocástico (SGD)](#Gradiente-descendente-estocástico-(SGD))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introducción" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Clasificación Lineal - Colab](https://colab.research.google.com/drive/18skm99K-VsCmd66o0CaZDJiPmOHyDfXX)\n", "\n", "En esta lección hacemos una primera práctica de modelamiento para clasificación con un subconjunto muy famoso de datos: Iris Dataset. \n", "\n", "El propósito del ejercicio es clasificar las flres en dos clases." ] }, { "cell_type": "markdown", "metadata": { "id": "KV50uBY7pPQC" }, "source": [ "El **Aprendizaje de Máquina** se concentra en la construcción y estudio de sistemas que puedan aprender de los datos. El problema principal consiste en encontrar patrones, relaciones y regularidades sobre los datos, los cuales le permitan construir modelos descriptivos y predictivos. Una aplicación muy común del Aprendizaje de Máquina consiste en la detección de spam, en el cual un modelo recibe un nuevo correo y lo etiqueta como spam o no.\n", "\n", "Para construir un modelo de este tipo, se deben tener en cuenta dos conceptos claves. El primero es que el modelo debe debe realizar un **proceso automático de clasificación**, sin que el usuario le especifique de forma explicita la forma en la que la clasificación se lleve a cabo. Por ejemplo, el modelo recibe ejemplos de correos que son spam y ejemplos de correos que no lo son. El segundo concepto consiste en que el modelo debe tener capidad de **generalización**, es decir, el modelo debe ser capaz de predecir sobre datos nunca antes vistos. En el ejemplo del filtrado de spam, estamos interesados en clasificar de forma automática los correos que vayan llegando a la bandeja del usuario.\n", "\n", "A continuación abordaremos un problema de clasificación binaria sobre un subconjunto del conjunto de datos IRIS.\n", "\n", "Originalmente IRIS tiene 150 datos y 4 variables (features). La categorías (target) son 3. Paar los propósistos de esta demostración, se tomaran solamente las especies 1 y 3 y las variables 1 y 2. En consecuencia, el conjunto de datos se reduce a 100 datos, dos variables y dos categorías." ] }, { "cell_type": "markdown", "metadata": { "id": "4IdgjH40pPQD" }, "source": [ "## Importamos las librerías que usaremos" ] }, { "cell_type": "markdown", "metadata": { "id": "4IdgjH40pPQD" }, "source": [ "El siguiente código va a cargar un conjunto de datos (IRIS) que nos va a servir para ilustrar en que consiste un problema de clasificación y como resolverlo con un modelo de machine learning. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "id": "0VYm1wynaWu8" }, "outputs": [], "source": [ "#%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pylab as plt\n", "from sklearn import preprocessing\n", "from sklearn import datasets\n", "from io import BytesIO\n", "from PIL import Image\n", "iris = datasets.load_iris()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Preprocesamiento " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. La variable $y$ contendrá las categorías de las flores. Solamente vamos a conservar las categorias 1 y 2, las cuales recodificamos como -1 y 1.\n", "2. La matriz *X_noscale* contendrá los variables 1 y 2 (ancho de sépalo y ancho de pétalo) y solamente las filas asociadas a las categoría 1 y 2.\n", "3. La matriz $X$ es la matriz anterior en donde cada columna está estandarizada de tal manera que tiene media 0 y varianza 1." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "y = 2*iris.target[iris.target != 0] - 3\n", "X_noscale = iris.data[:,[1, 3]]\n", "X_noscale = X_noscale[iris.target != 0, :]\n", "X = preprocessing.scale(X_noscale)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Análisis exploratorio inicial " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Generamos un gráfico con los 100 puntos reservados, los cuales correspondes a dos clases de flores." ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 458 }, "executionInfo": { "elapsed": 1429, "status": "ok", "timestamp": 1557782009719, "user": { "displayName": "Fabio Augusto Gonzalez Osorio", "photoUrl": "https://lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s64/photo.jpg", "userId": "12068829047521495105" }, "user_tz": 300 }, "id": "gPS-NHDdpPQE", "outputId": "8301564e-c528-44ff-8513-a7ba9b2baaea" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def plot_data(X, y):\n", " y_unique = np.unique(y)\n", " colors = plt.cm.rainbow(np.linspace(0.0, 1.0, y_unique.size))\n", " for this_y, color in zip(y_unique, colors):\n", " this_X = X[y == this_y]\n", " plt.scatter(this_X[:, 0], this_X[:, 1], color=color,\n", " alpha=0.5, edgecolor='k',\n", " label=\"Class: %s\" % this_y)\n", " plt.legend(loc=\"best\")\n", " plt.title(\"Datos\")\n", "\n", "\n", "# dibujamos\n", "\n", "plt.figure(figsize=(8, 6))\n", "plt.xlabel('Ancho de sépalo')\n", "plt.ylabel('Ancho de pétalo')\n", "plot_data(X_noscale, y)" ] }, { "cell_type": "markdown", "metadata": { "id": "jyogyjcrpPQJ" }, "source": [ "Los datos deben ser presentados como arreglos bi-dimensionales de números. Cada fila corresponde a una instancia de entrenamiento, sobre la cual queremos aprender o hacer una predicción sobre sus datos." ] }, { "cell_type": "markdown", "metadata": { "id": "aRpqE7S6pPQL" }, "source": [ "Verifiquemos el tamaño de cada arreglo construído" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 51 }, "executionInfo": { "elapsed": 465, "status": "ok", "timestamp": 1557784256622, "user": { "displayName": "Fabio Augusto Gonzalez Osorio", "photoUrl": "https://lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s64/photo.jpg", "userId": "12068829047521495105" }, "user_tz": 300 }, "id": "jz8VH_rwpPQL", "outputId": "13ffd24b-20d0-4bf1-d674-b20eb27cbb12" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(100, 2)\n", "(100,)\n" ] } ], "source": [ "print(X.shape)\n", "print(y.shape)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "executionInfo": { "elapsed": 432, "status": "ok", "timestamp": 1557784260409, "user": { "displayName": "Fabio Augusto Gonzalez Osorio", "photoUrl": "https://lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s64/photo.jpg", "userId": "12068829047521495105" }, "user_tz": 300 }, "id": "4w16Ae3cpPQQ", "outputId": "6b9c5414-8f58-4819-ee88-45f3f5670be2" }, "outputs": [ { "data": { "text/plain": [ "(array([-1, 1]), array([50, 50]))" ] }, "execution_count": 4, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "np.unique(y, return_counts=True)" ] }, { "cell_type": "markdown", "metadata": { "id": "-hNob0J7pPQT" }, "source": [ "Observamos que cada clase tiene 50 ejemplos en total. los datos de una clase se representan con una etiqueta positiva, +1, y los de la otra clase con una etiqueta positiva, +1." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 103 }, "executionInfo": { "elapsed": 415, "status": "ok", "timestamp": 1557784290573, "user": { "displayName": "Fabio Augusto Gonzalez Osorio", "photoUrl": "https://lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s64/photo.jpg", "userId": "12068829047521495105" }, "user_tz": 300 }, "id": "3h962sAfrXnr", "outputId": "cfdbfe5d-bd2c-49f6-b120-d810fe3e8fb9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1\n", " -1 -1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", " 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1\n", " 1 1 1 1]\n" ] } ], "source": [ "print(y)" ] }, { "cell_type": "markdown", "metadata": { "id": "7A85yN-vpPQU" }, "source": [ "### Pregunta\n", "**¿Cómo diferenciamos entre ambas clases de manera automática?**\n", "\n", "Es decir si me dan un nuevo ejemplo, quiero poderlo clasificar en uno de estas dos clases." ] }, { "cell_type": "markdown", "metadata": { "id": "qoJ3wl4BpPQU" }, "source": [ "## Clasificación usando un modelo lineal " ] }, { "cell_type": "markdown", "metadata": { "id": "QWvUeu1CpPQV" }, "source": [ "### Discriminación lineal" ] }, { "cell_type": "markdown", "metadata": { "id": "QWvUeu1CpPQV" }, "source": [ "* Nuestro modelo de clasificación es una función que recibe un ejemplo $x$ y retorna la predicción. Esta función se basa en una función (llamada discriminante) $f:\\mathbb{R}^{2}\\rightarrow\\mathbb{R}$ tal que:\n", "$$\\textrm{Predicción}(x)=\\begin{cases}\n", "C_{1} & \\mbox{si }f(x)\\ge \\theta\\\\\n", "C_{2} & \\mbox{si }f(x)<\\theta\n", "\\end{cases}$$\n", "\n", "* Para el caso de discriminación lineal, definimos $f$ como un modelo lineal con parámetros $w$ y $w_0$:\n", "$$f(x) = wx+w_0$$\n", "\n", "En la siguiente imagen se ilustra el problema genérico. Se ha tomado $b=w_0$ y $\\theta=0$." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](../Imagenes/clasificador_lineal.png)" ] }, { "cell_type": "markdown", "metadata": { "id": "ayzdZfmmpPQW" }, "source": [ "### Problemas\n", "\n", "* **¿Cómo encontrar $f$?**\n", "\n", "* **¿Cómo estimamos $w$ y $w_0$?**" ] }, { "cell_type": "markdown", "metadata": { "id": "PZTD8EcZpPQW" }, "source": [ "## Funciones de pérdida " ] }, { "cell_type": "markdown", "metadata": { "id": "PZTD8EcZpPQW" }, "source": [ "La pérdida (loss en inglés) es la penalidad por una predicción errada. En otras palabras, la pérdida indica qué tan errada fue la predicción de un modelo en un ejemplo. Si la predicción de mi modelo es perfecta, la pérdida es **cero**, de lo contrario, la pérdida va a ser un número mayor a cero.\n", "\n", "Una función de pérdida muy común es la pérdida cuadrática:\n", "$$ L(f, D) =\\sum_{(x_{i},r_{i})\\in D} (r_i - f(x_i))^2 $$\n", "\n", "donde:\n", "* $(x_{i},r_{i})$ es un ejemplo en el cual $x_i$ corresponde a un conjunto de características, en nuestro conjunto de datos, corresponde a las 2 características extraídas de una flor (Ancho del sépalo y ancho del pétalo). Estas características son usadas por el modelo para hacer predicciones. $r_i$ corresponde a la etiqueta del ejemplo, por ejemplo la especie de la flor.\n", "* $f(x_i)$ corresponde a la función de predicción que definimos previamente. Esta función es de la forma $f(x) = wx+w_0$.\n", "* $D$ corresponde al conjunto de datos compuesto por varios ejemplos anotados. " ] }, { "cell_type": "markdown", "metadata": { "id": "TjiSUzEBpPQX" }, "source": [ "## Aprendizaje como optimización " ] }, { "cell_type": "markdown", "metadata": { "id": "TjiSUzEBpPQX" }, "source": [ "* Estimar los parámetros $w$ y $w_0$ puede ser abordado como un problema de optimización que consiste en:\n", "$$\\min_{f\\in H}L(f,D)$$\n", "dónde $L(f, D)$ es la función de pérdida cuadrática. Esto se resume en encontrar una función $f$ que genere el valor mínimo de pérdida promedio con respecto a todos los ejemplos del conjunto de datos.\n", "* La función $f$ proviene de una conjunto de funciones llamado el espacio de hipótesis:\n", "$$H=\\{f_w(x,y)=wx+w_0,\\forall w\\in\\mathbb{R}^n \\ y \\ w_0\\in\\mathbb{R}\\}$$\n", "dónde $w$ y $w_0$ son los coeficientes de la función $f(x) = wx+w_0$.\n", "* La función de pérdida nos ayuda a estimar qué tan mal se comporta una función $f$ del espacio de hipótesis con respecto al conjunto de datos $D$." ] }, { "cell_type": "markdown", "metadata": { "id": "Jx_jZfKepPQY" }, "source": [ "A continuación, definimos en Python las funciones de predicción y pérdida, para nuestro problema." ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "id": "YJk6hCAxpPQZ" }, "outputs": [], "source": [ "def predict(w, x):\n", " a = np.dot(w[1:], x) + w[0]\n", " return a" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "id": "8FufsqudpPQb" }, "outputs": [], "source": [ "def square_loss(w, x, y):\n", " return (y - predict(w, x)) ** 2 / 2\n", "\n", "def batch_loss(loss_fun, w, X, Y):\n", " n = X.shape[0]\n", " tot_loss = 0\n", " for i in range(n):\n", " tot_loss += loss_fun(w, X[i], Y[i])\n", " return tot_loss" ] }, { "cell_type": "markdown", "metadata": { "id": "OyudE9oZpPQe" }, "source": [ "Supongamos $w$ y $w_0$:\n", "* $w = [5, 2]$\n", "* $w_0 = 1$\n", "\n", "Escogemos el primer ejemplo de nuestro conjunto de datos Iris:" ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 68 }, "executionInfo": { "elapsed": 402, "status": "ok", "timestamp": 1557785299399, "user": { "displayName": "Fabio Augusto Gonzalez Osorio", "photoUrl": "https://lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s64/photo.jpg", "userId": "12068829047521495105" }, "user_tz": 300 }, "id": "lXWsUOdYpPQf", "outputId": "c6fde4f1-3ed8-4aae-96c6-735403a3937e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Características: [ 0.99068792 -0.65303909]\n", "Etiqueta real: -1\n", "Función discriminante: 4.647361438018154\n" ] } ], "source": [ "w = [1, 5, 2] # Por facilidad, w[0] es igual a w_0\n", "x = X[0] # Primer ejemplo de nuestro conjunto de datos IRIS.\n", "label = y[0]\n", "\n", "print('Características: {}'.format(X[0]))\n", "print('Etiqueta real: {}'.format(y[0]))\n", "print('Función discriminante: {}'.format(predict(w, x)))\n" ] }, { "cell_type": "markdown", "metadata": { "id": "kksP6jNtpPQi" }, "source": [ "Puesto que el valor de la función discriminante es $f(x)>0$, la clase predicha es positiva.\n", "Ahora, estimamos el valor de pérdida usando esos valores de $w$ y $w_0$" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "executionInfo": { "elapsed": 5271, "status": "ok", "timestamp": 1536792075580, "user": { "displayName": "Fabio A. Gonzalez", "photoUrl": "//lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s50-c-k-no/photo.jpg", "userId": "112315845334496218213" }, "user_tz": 300 }, "id": "DZZe6JFcpPQj", "outputId": "3811df04-046e-430c-8caa-1d51cf632f8f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Pérdida: 15.946345605807238\n" ] } ], "source": [ "print('Pérdida: {}'.format(square_loss(w, x, label)))" ] }, { "cell_type": "markdown", "metadata": { "id": "03AgoXXLpPQm" }, "source": [ "¿Qué pasa si modificamos uno de los parámetros $w$?" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 67 }, "executionInfo": { "elapsed": 16636, "status": "ok", "timestamp": 1536792115727, "user": { "displayName": "Fabio A. Gonzalez", "photoUrl": "//lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s50-c-k-no/photo.jpg", "userId": "112315845334496218213" }, "user_tz": 300 }, "id": "VkOJEGWnpPQn", "outputId": "21546d73-5872-41f7-dc2c-37f9971c4954" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Etiqueta: -1\n", "Predicción: 3.9943223502437437\n", "Pérdida w_p: 12.471627869072096\n" ] } ], "source": [ "w_p = [1, 5, 3]\n", "\n", "print('Etiqueta: {}'.format(y[0]))\n", "print('Predicción: {}'.format(predict(w_p, x)))\n", "print('Pérdida w_p: {}'.format(square_loss(w_p, x, label)))" ] }, { "cell_type": "markdown", "metadata": { "id": "BNLN23qwpPQu" }, "source": [ "Observamos que nuestra pérdida bajó de $15.94$ a $12.47$. Sin embargo, estamos interesados en automatizar este proceso. Primero vamos a observar cómo se comporta la función de pérdida cuadrática." ] }, { "cell_type": "markdown", "metadata": { "id": "u92KZOcNpPQy" }, "source": [ "## Analizando la función de pérdida cuadrática " ] }, { "cell_type": "markdown", "metadata": { "id": "u92KZOcNpPQy" }, "source": [ "A continuación, definimos un par de funciones de python para poder visualizar la función de pérdida" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "id": "PGJ6rUUEpPQz" }, "outputs": [], "source": [ "def plot_loss(loss):\n", " w1_vals = np.linspace(-5, 5, 30)\n", " w2_vals = np.linspace(-5, 5, 30)\n", " W1, W2 = np.meshgrid(w1_vals, w2_vals)\n", " grid_r, grid_c = W1.shape\n", " ZZ = np.zeros((grid_r, grid_c))\n", " for i in range(grid_r):\n", " for j in range(grid_c):\n", " ZZ[i, j] = loss(W1[i, j], W2[i, j])\n", " pl.contourf(W1, W2, ZZ,30, cmap = pl.cm.jet)\n", " pl.colorbar()\n", " pl.xlabel(\"$w_1$\")\n", " pl.ylabel(\"$w_2$\")\n", "\n", "def bloss_square(w1, w2):\n", " w = np.array([1, w1, w2])\n", " return batch_loss(square_loss, w, X, y)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 283 }, "executionInfo": { "elapsed": 1112, "status": "ok", "timestamp": 1557785428429, "user": { "displayName": "Fabio Augusto Gonzalez Osorio", "photoUrl": "https://lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s64/photo.jpg", "userId": "12068829047521495105" }, "user_tz": 300 }, "id": "x2ad9mr3pPQ3", "outputId": "d359a2f1-39d6-4a79-dece-a37c83ca6617" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_loss(bloss_square)" ] }, { "cell_type": "markdown", "metadata": { "id": "nExl8BeBpPQ7" }, "source": [ "Intepretación: Observamos que el valor mínimo de nuestra función de pérdida se encuentra alrededor de:\n", "* $w_1 = 0.0$\n", "* $w_2 = 1.0$" ] }, { "cell_type": "markdown", "metadata": { "id": "YAHCFSE7pPQ9" }, "source": [ "## Gradiente descendiente " ] }, { "cell_type": "markdown", "metadata": { "id": "YAHCFSE7pPQ9" }, "source": [ "* Ventajas en este caso:\n", " * Óptimo global garantizado\n", " * Simplicidad del método\n", " * Facilidad para ajustar los parámetros\n", " * Escalabilidad\n", " * Paralelización potencial.\n", "* En aprendizaje de máquina, las preferencias cambian sobre el tiempo.\n", "* Hoy en día es escalable. Inclusive, la estrategias paralelizables son preferidas a sabiendas de la optimalidad garantizada." ] }, { "cell_type": "markdown", "metadata": { "id": "2tNQ0G_spPRC" }, "source": [ "Minimizar la función $L(f, D)$, donde $f$ es nuestra función de predicción resulta ser un problema convexo, es decir, existe solo un lugar donde la inclinación de la curva de pérdida es igual a cero. Ese valor mínimo es dónde nuestra función de pérdida $L$ **converge**.\n", "\n", "Por otro lado, calcular el valor de la función de pérdida para cada posible valor de $w$ sobre el conjunto de datos es una forma muy ineficiente de hallar ese valor de convergencia. Gradiente descendente es un mecanismo iterativo que nos permite hayar ese valor de convergencia.\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](../Imagenes/JcfpK.png)\n", "\n", "Ilustración del gradiente descendiente.\n", "\n", "[Fuente](https://i.stack.imgur.com/JcfpK.png)" ] }, { "cell_type": "markdown", "metadata": { "id": "2tNQ0G_spPRC" }, "source": [ "### Algoritmo gradiente descendente:" ] }, { "cell_type": "markdown", "metadata": { "id": "2tNQ0G_spPRC" }, "source": [ "* Paso 1: Escogemos un valor inicial o punto de partida. Puede ser cero o un valor aleatorio. Este valor inicial no tiene relevancia para este problema. \n", "* Paso 2: Calculamos el **gradiente de la función de pérdida** para el punto de partida. El gradiente de la pérdida me indica la derivada (inclinación) de la curva. El gradiente a su vez es un vector, por lo tanto tiene **dirección** y **magnitud**, esta dirección siempre apunta hacía donde se genera el mayor incremento en la función de pérdida. \n", "* Paso 3: Calculamos un nuevo valor $w$ cambiándolo en la dirección negativa del gradiente, con el objetivo reducir la pérdida lo más pronto posible.\n", "* Paso 4: El nuevo valor de $w$ también estará determinado por la magnitud del gradiente y una **taza de aprendizaje** $\\eta$. Por ejemplo, si la magnitud del gradiente es 2.5 y la taza de aprendizaje es 0.01, gradiente descendente escogerá un punto $w$ que esté alejado 0.025 unidades del punto anterior $w$. Para el calculo de $w$ usaremos la siguiente formula:\n", "$$\n", "w^{t+1} = w^t - \\eta \\nabla L\n", "$$\n", "* Repetir desde el Paso 1." ] }, { "cell_type": "markdown", "metadata": { "id": "2tNQ0G_spPRC" }, "source": [ "#### Problemas" ] }, { "cell_type": "markdown", "metadata": { "id": "2tNQ0G_spPRC" }, "source": [ "* ¿Qué pasa si el tamaño de nuestro paso es muy grande y no alcanza el minimo local?\n", "\n", "La elección de una tasa de aprendizaje alta puede terminar en que nunca alcanzemos el punto de convergencia. Pero una tasa muy pequeña puede llevar a que tome mucho tiempo llegar al mínimo global" ] }, { "cell_type": "markdown", "metadata": { "id": "fi5JVw_8pPRD" }, "source": [ "### ¿Cómo se calcula el gradiente?" ] }, { "cell_type": "markdown", "metadata": { "id": "fi5JVw_8pPRD" }, "source": [ "$$\n", "\\begin{aligned}L(f,D) & = \\sum_{(x_{i},r_{i})\\in D} (r_i - f(x_i))^2 = \\sum_{(x_{i},r_{i})\\in D}(r_i - (w_0 + w_1x_i))^2\\\\\n", " & =\\sum_{(x_{i},r_{i})\\in D}E(w, x_i, r_i)\n", "\\end{aligned}\n", "$$\n", "Si $f_w$ es la función que definimos antes se tiene que\n", "\n", "$$\n", "\\frac{\\partial E(w,x_{i,}r_{i})}{\\partial w_1}=(w_0 + w_1x_i-r_{i})x_{i}\n", "$$\n", "y\n", "$$\n", "\\frac{\\partial E(w,x_{i,}r_{i})}{\\partial w_0}=(w_0 + w_1x_i-r_{i})\n", "$$\n", "\n", "A continuación, definimos una función `de_dw` que corresponde el derivadas parciales de $E$ con respecto a los coeficientes $w$." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "id": "Hg4_lVtGpPRD" }, "outputs": [], "source": [ "def de_dw(w, x, r):\n", " x_prime = np.zeros(len(x) + 1)\n", " x_prime[1:] = x\n", " x_prime[0] = 1\n", " return (predict(w, x) - r) * x_prime" ] }, { "cell_type": "markdown", "metadata": { "id": "P8OCEAWDpPRG" }, "source": [ "## Gradiente descendente en batch " ] }, { "cell_type": "markdown", "metadata": { "id": "P8OCEAWDpPRG" }, "source": [ "Para estimar el gradiente, lo hacemos a lo largo de todos nuestro conjunto de datos. Puesto que solo contamos con 100 ejemplos, es relativamente rápido hacer este calculo. Sin embargo, en la práctica puede ser ineficiente si se cuenta con un gran número de ejemplos de entrenamiento." ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "id": "UnThWOsTpPRH" }, "outputs": [], "source": [ "def batch_gd(X, Y, epochs, eta, w_ini):\n", " \"\"\"\n", " X: instancias del conjunto de datos\n", " Y: etiquetas del conjunto de datos\n", " epochs: número de iteraciones para ejecutar\n", " gradiente descendente\n", " eta: taza de aprendizaje\n", " w_ini: w y w_0 iniciales\n", " \n", " \"\"\"\n", " losses = []\n", " w = w_ini \n", " n = X.shape[0]\n", " for i in range(epochs): \n", " delta = np.zeros(len(w))\n", " for j in range(n):\n", " delta += de_dw(w, X[j], Y[j]) # Vamos sumando el gradiente por cada ejemplo en el conjunto de datos\n", " w = w - eta * delta # Calculamos el nuevo valor de w\n", " losses.append(batch_loss(square_loss, w, X, Y)) # Vamos guardando el valor de pérdida para visualizar luego\n", " return w, losses" ] }, { "cell_type": "markdown", "metadata": { "id": "DBnrPOD3pPRK" }, "source": [ "Vamos a ejecutar gradiente descendente en batch con los siguientes parámetros:\n", "* $epochs = 50$\n", "* $w_0 = 0$ ($w_0$ inicial)\n", "* $w = [0, 0]$ ($w$ inicial)\n", "* $\\eta = 0.01$ (tasa de aprendizaje)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 358 }, "executionInfo": { "elapsed": 716, "status": "ok", "timestamp": 1557786335187, "user": { "displayName": "Fabio Augusto Gonzalez Osorio", "photoUrl": "https://lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s64/photo.jpg", "userId": "12068829047521495105" }, "user_tz": 300 }, "id": "_HpU2WjbpPRL", "outputId": "ef3fe64c-f4ad-47ef-a4cd-378b30e99ec0" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "w, losses = batch_gd(X, y, 50, 0.001, np.array([0, 0, 0]))\n", "pl.figure(figsize = (8,16/3))\n", "pl.plot(losses)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "NpdS5rPqpPRO" }, "source": [ "## Gradiente descendente estocástico (SGD) " ] }, { "cell_type": "markdown", "metadata": { "id": "NpdS5rPqpPRO" }, "source": [ "Cuando trabajamos con grandes conjuntos de datos, se vuelve poco práctico el cálculo del gradiente sobre todo el conjunto de datos. Una forma de disminuir el tiempo de computación es escogiendo muestras al azar de nuestro conjunto de datos, que nos generan un estimado en promedio del gradiente promedio. SGD toma entonces una muestra de forma aleatoria a la vez y estima el valor del gradiente para esa muestra. A pesar de ser ruidoso, SGD funciona bastante bien en la práctica." ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "id": "oJExhoRLpPRQ" }, "outputs": [], "source": [ " def sgd(X, Y, epochs, eta, w_ini):\n", " \"\"\"\n", " X: instancias del conjunto de datos\n", " Y: etiquetas del conjunto de datos\n", " epochs: número de iteraciones para ejecutar\n", " gradiente descendente\n", " eta: tasa de aprendizaje\n", " w_ini: w y w_0 iniciales\n", " \n", " \"\"\"\n", " \n", " losses = []\n", " w = w_ini\n", " n = X.shape[0]\n", " index = list(range(n))\n", " \n", " for i in range(epochs):\n", " np.random.shuffle(index)\n", " for j in index:\n", " delta = de_dw(w, X[j], Y[j]) # Aquí estimamos el gradiente para cada elemento pero no para todo el dataset\n", " w = w - eta * delta\n", " losses.append(batch_loss(square_loss, w, X, Y))\n", " return w, losses" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ejemplo de orden aleatorio" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n", "[5, 1, 7, 2, 9, 8, 4, 6, 0, 3]\n" ] } ], "source": [ "index = list(range(10))\n", "print(index)\n", "np.random.shuffle(index)\n", "print(index)" ] }, { "cell_type": "markdown", "metadata": { "id": "DONCNgbRpPRZ" }, "source": [ "A continuación, comparamos el comportamiento de Gradiente Descendente en Batch y Estocástico. Observamos que tienen un comportamiento similar para nuestro problema de clasificación de dos clases." ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 372 }, "executionInfo": { "elapsed": 1727, "status": "ok", "timestamp": 1557786793714, "user": { "displayName": "Fabio Augusto Gonzalez Osorio", "photoUrl": "https://lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s64/photo.jpg", "userId": "12068829047521495105" }, "user_tz": 300 }, "id": "2E2G5xfbpPRZ", "outputId": "a0a3e6e7-74c9-4cd3-995a-5e79808ea9c6" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "lr = 0.005\n", "epochs = 500\n", "w1, losses_bt = batch_gd(X, y, epochs, lr, np.array([0, 0, 0])) #Batch\n", "w2, losses_ol = sgd(X, y, epochs, lr, np.array([0, 0, 0])) #SGD\n", "pl.figure(figsize = (8,16/3))\n", "pl.plot(np.arange(epochs), losses_ol, label=\"SGD\")\n", "pl.plot(np.arange(epochs), losses_bt, label=\"Batch\")\n", "pl.xlabel(\"Epoch\")\n", "pl.ylabel(\"Loss\")\n", "pl.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "utjBLJqYpPRc" }, "source": [ "### Visualización de la función de predicción" ] }, { "cell_type": "markdown", "metadata": { "id": "9_sWueJlpPRc" }, "source": [ "Es útil poder visualizar qué regiones de nuestro espacio en 2D son asignadas a la clase positiva y a la clase negativa. Para eso escribimos una función que nos permite visualizar:" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "id": "WRLsCq20pPRd" }, "outputs": [], "source": [ "def plot_decision_region(X, pred_fun):\n", " \"\"\"\n", " X: corresponde a las instancias del conjunto de datos\n", " pred_fun: es una función que para cada valor de X, regresa una predicción\n", " \"\"\"\n", " min_x = np.min(X[:, 0])\n", " max_x = np.max(X[:, 0])\n", " min_y = np.min(X[:, 1])\n", " max_y = np.max(X[:, 1])\n", " min_x = min_x - (max_x - min_x) * 0.05\n", " max_x = max_x + (max_x - min_x) * 0.05\n", " min_y = min_y - (max_y - min_y) * 0.05\n", " max_y = max_y + (max_y - min_y) * 0.05\n", " x_vals = np.linspace(min_x, max_x, 30)\n", " y_vals = np.linspace(min_y, max_y, 30)\n", " XX, YY = np.meshgrid(x_vals, y_vals)\n", " grid_r, grid_c = XX.shape\n", " ZZ = np.zeros((grid_r, grid_c))\n", " for i in range(grid_r):\n", " for j in range(grid_c):\n", " ZZ[i, j] = pred_fun(XX[i, j], YY[i, j])\n", " pl.contourf(XX, YY, ZZ, 30, cmap = pl.cm.coolwarm, vmin= -1, vmax=2)\n", " pl.colorbar()\n", " pl.xlabel(\"x\")\n", " pl.ylabel(\"y\")" ] }, { "cell_type": "code", "execution_count": 74, "metadata": { "id": "U5SXcSgXpPRf" }, "outputs": [], "source": [ "def gen_pred_fun(w):\n", " def pred_fun(x1, x2):\n", " x = np.array([x1, x2])\n", " return predict(w, x)\n", " return pred_fun" ] }, { "cell_type": "markdown", "metadata": { "id": "HymZ1v_-pPRh" }, "source": [ "Visualizemos el caso donde nuestros coeficiente sean de la forma:\n", "* $w_0 = 0$\n", "* $w = [0.6, 1]$" ] }, { "cell_type": "code", "execution_count": 75, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 422 }, "executionInfo": { "elapsed": 848, "status": "ok", "timestamp": 1557786817090, "user": { "displayName": "Fabio Augusto Gonzalez Osorio", "photoUrl": "https://lh5.googleusercontent.com/-jcmRx3yeVv4/AAAAAAAAAAI/AAAAAAAAAic/QZe3kSPTExE/s64/photo.jpg", "userId": "12068829047521495105" }, "user_tz": 300 }, "id": "ksaA3NBzpPRi", "outputId": "43f8c571-f741-40e3-c0bb-02552cf5715e" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "w = [0, 0.6, 1]\n", "\n", "pl.figure(figsize = (8,16/3)) \n", "plot_decision_region(X, gen_pred_fun(w))\n", "plot_data(X, y)" ] }, { "cell_type": "markdown", "metadata": { "id": "9hDsvK5ipPRl" }, "source": [ "Nada útil, sin embargo si visualizamos el resultado luego de aplicar SGD:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 367 }, "executionInfo": { "elapsed": 1434, "status": "ok", "timestamp": 1536450509865, "user": { "displayName": "oscar Julian Perdomo Charry", "photoUrl": "https://lh3.googleusercontent.com/a/default-user=s128", "userId": "104061214375264597676" }, "user_tz": 300 }, "id": "qP3ch_fHpPRm", "outputId": "d5d4b06c-0881-4303-ed5e-46277befa187" }, "outputs": [ { "data": { "image/png": "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\nAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "lr = 0.005\n", "epochs = 500\n", "w, _ = sgd(X, y, epochs, lr, np.array([0, -1, 2])) #SGD\n", "\n", "pl.figure(figsize = (8,16/3)) \n", "plot_decision_region(X, gen_pred_fun(w))\n", "plot_data(X, y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 36 }, "executionInfo": { "elapsed": 510, "status": "ok", "timestamp": 1536450512569, "user": { "displayName": "oscar Julian Perdomo Charry", "photoUrl": "https://lh3.googleusercontent.com/a/default-user=s128", "userId": "104061214375264597676" }, "user_tz": 300 }, "id": "_O1ROxMZpPRp", "outputId": "ef5cce13-f5f5-4020-b65f-b2d012887d1f" }, "outputs": [ { "data": { "text/plain": [ "array([ 0.03780429, -0.23722539, 0.94336809])" ] }, "execution_count": 28, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "w" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "cI-pADqElkPP" }, "outputs": [], "source": [] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "Copia de Intro SI-ML1-linear classification.ipynb", "provenance": [ { "file_id": "18skm99K-VsCmd66o0CaZDJiPmOHyDfXX", "timestamp": 1616157883508 }, { "file_id": "1YOf_vd0I1d5j58vzRU2pXS2kCjeg2gqJ", "timestamp": 1557778220013 }, { "file_id": "1pI6YVLbFenTD1PKFdEsHYQ-wxPMtKBQ8", "timestamp": 1536785318169 } ] }, "kernelspec": { "display_name": "Python 3", "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.8.8" } }, "nbformat": 4, "nbformat_minor": 4 }