{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Diplomado en Inteligencia Artificial y Aprendizaje Profundo**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Subclassing-Modelo de Regresión multi-logística "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##  Autores"
   ]
  },
  {
   "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. Oleg Jarma, ojarmam@unal.edu.co\n",
    "4. Maria del Pilar Montenegro, pmontenegro88@gmail.com"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Contenido"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "* [Introducción](#Introducción)\n",
    "* [Importa módulos](#Importa-módulos)\n",
    "* [Funciones de activación](#Funciones-de-activación)\n",
    "* [El conjunto de datos Iris](#El-conjunto-de-datos-Iris)\n",
    "* [Lectura de datos](#Lectura-de-datos)\n",
    "* [Preprocesamiento](#Preprocesamiento)\n",
    "* [Crea el modelo usando la API funcional](#Crea-el-modelo-usando-la-API-funcional)\n",
    "* [Compila](#Compila)\n",
    "* [Entrena](#Entrena)\n",
    "* [Evaluación del modelo](#Evaluación-del-modelo)\n",
    "* [Predicciones](#Predicciones)\n",
    "* [Matriz de confusión](#Matriz-de-confusión)\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Introducción"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Esta lección está dedicada a presentar la programación orientada a objetos aplicada a Keras, conocida genéricamente coo subclassing.\n",
    "\n",
    "El tema es recomdado para  usuarios con conocimientos en programacón y keras en nuestro caso.\n",
    "\n",
    "Hermos el  modelo  de clasificación con múltiples categorias, utiilzado en la introducción de la API funcional. El ejemplo es de nueo Iris, con el propósito de comparar los ods estilos de programación.\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Importa módulos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "try:\n",
    "  %tensorflow_version 2.x\n",
    "except Exception:\n",
    "  pass"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2.1.0\n"
     ]
    }
   ],
   "source": [
    "from __future__ import absolute_import, division, print_function, unicode_literals\n",
    "#\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "import tensorflow as tf\n",
    "#\n",
    "from tensorflow.keras.models import Model\n",
    "#\n",
    "from tensorflow.keras.layers import Dense, Input, Activation\n",
    "#\n",
    "from tensorflow.keras.utils import to_categorical\n",
    "from tensorflow.keras.utils import plot_model\n",
    "#\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.metrics import confusion_matrix\n",
    "#\n",
    "print(tf.__version__)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El conjunto de datos Iris\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Este conjunto de datos fue introducido por sir [Ronald Fisher]()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lectura de datos"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# nombres de las columnas de los datos\n",
    "col_names = ['SepalLength', 'SepalWidth', 'PetalLength', 'PetalWidth', 'Species']\n",
    "target_dimensions = ['Setosa', 'Versicolor', 'Virginica']\n",
    "\n",
    "# lee los datos\n",
    "training_data_path = tf.keras.utils.get_file(\"iris_training.csv\", \"https://storage.googleapis.com/download.tensorflow.org/data/iris_training.csv\")\n",
    "test_data_path = tf.keras.utils.get_file(\"iris_test.csv\", \"https://storage.googleapis.com/download.tensorflow.org/data/iris_test.csv\")\n",
    "\n",
    "training = pd.read_csv(training_data_path, names=col_names, header=0)\n",
    "test = pd.read_csv(test_data_path, names=col_names, header=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Pre-procesamiento"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La variable objetivo (target) tiene tres categorías. Usaremos la codificación one-hot."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Codificación one-hot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "y_train= pd.DataFrame(to_categorical(training.Species))\n",
    "y_train.columns = target_dimensions\n",
    "\n",
    "y_test = pd.DataFrame(to_categorical(test.Species))\n",
    "y_test.columns = target_dimensions"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Elimina columna Species "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "training.drop(['Species'], axis=1, inplace=True)\n",
    "#test.drop(['Species'], axis=1, inplace=True)\n",
    "y_test_species = test.pop('Species') # extrae la columna y la coloca en y_test_species\n",
    "#\n",
    "#Si necesita subir al dataframe la recodificación use estas líneas\n",
    "#training = training.join(labels_training )\n",
    "#test = test.join(labels_test )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Normaliza los features"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### StandardScaler"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[5.845      3.065      3.73916667 1.19666667]\n"
     ]
    }
   ],
   "source": [
    "# crea el objeto StandardScaler\n",
    "scaler = StandardScaler()\n",
    "\n",
    "# Ajusta los parámetros del scaler\n",
    "scaler.fit(training)\n",
    "print (scaler.mean_)\n",
    "\n",
    "# escala training y test\n",
    "x_train = scaler.transform(training)\n",
    "x_test = scaler.transform(test)\n",
    "\n",
    "# labels ( no requieren escalación)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Crea el modelo usando subclassing"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    " Vamos a derivar una clase de la clase Model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "class CustomModel(Model):\n",
    "    \n",
    "    def __init__(self, **kwargs):\n",
    "        super(CustomModel, self).__init__(**kwargs)\n",
    "        self.dense1 = Dense(5, activation='relu', )\n",
    "        self.dense2 = Dense(10, activation='relu')\n",
    "        self.dense3 = Dense(3, activation='softmax')\n",
    "        \n",
    "    def call(self, inputs):\n",
    "        x = self.dense1(inputs)\n",
    "        x = self.dense2(x)\n",
    "        return self.dense3(x)\n",
    "    \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Crea una instancia de CustomModel"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [],
   "source": [
    "model_iris = CustomModel(name='my_custom_model')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "## Compila"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "model_iris.compile(optimizer='rmsprop',\n",
    "              loss='categorical_crossentropy',\n",
    "              metrics=['accuracy'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Entrena"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 96 samples, validate on 24 samples\n",
      "Epoch 1/30\n",
      "96/96 [==============================] - 1s 11ms/sample - loss: 0.9798 - accuracy: 0.3229 - val_loss: 0.8623 - val_accuracy: 0.5833\n",
      "Epoch 2/30\n",
      "96/96 [==============================] - 0s 271us/sample - loss: 0.9531 - accuracy: 0.3958 - val_loss: 0.8450 - val_accuracy: 0.6250\n",
      "Epoch 3/30\n",
      "96/96 [==============================] - 0s 259us/sample - loss: 0.9355 - accuracy: 0.4688 - val_loss: 0.8324 - val_accuracy: 0.6667\n",
      "Epoch 4/30\n",
      "96/96 [==============================] - 0s 307us/sample - loss: 0.9198 - accuracy: 0.5521 - val_loss: 0.8203 - val_accuracy: 0.8750\n",
      "Epoch 5/30\n",
      "96/96 [==============================] - 0s 247us/sample - loss: 0.9067 - accuracy: 0.6771 - val_loss: 0.8102 - val_accuracy: 0.8750\n",
      "Epoch 6/30\n",
      "96/96 [==============================] - 0s 300us/sample - loss: 0.8946 - accuracy: 0.7188 - val_loss: 0.7992 - val_accuracy: 0.9167\n",
      "Epoch 7/30\n",
      "96/96 [==============================] - 0s 303us/sample - loss: 0.8828 - accuracy: 0.7604 - val_loss: 0.7906 - val_accuracy: 0.9167\n",
      "Epoch 8/30\n",
      "96/96 [==============================] - 0s 370us/sample - loss: 0.8712 - accuracy: 0.7812 - val_loss: 0.7811 - val_accuracy: 0.9167\n",
      "Epoch 9/30\n",
      "96/96 [==============================] - 0s 278us/sample - loss: 0.8600 - accuracy: 0.8021 - val_loss: 0.7713 - val_accuracy: 0.9167\n",
      "Epoch 10/30\n",
      "96/96 [==============================] - 0s 358us/sample - loss: 0.8490 - accuracy: 0.8021 - val_loss: 0.7634 - val_accuracy: 0.9167\n",
      "Epoch 11/30\n",
      "96/96 [==============================] - 0s 274us/sample - loss: 0.8384 - accuracy: 0.8021 - val_loss: 0.7544 - val_accuracy: 0.9167\n",
      "Epoch 12/30\n",
      "96/96 [==============================] - 0s 282us/sample - loss: 0.8280 - accuracy: 0.8021 - val_loss: 0.7453 - val_accuracy: 0.9167\n",
      "Epoch 13/30\n",
      "96/96 [==============================] - 0s 347us/sample - loss: 0.8177 - accuracy: 0.8125 - val_loss: 0.7367 - val_accuracy: 0.9167\n",
      "Epoch 14/30\n",
      "96/96 [==============================] - 0s 289us/sample - loss: 0.8076 - accuracy: 0.8125 - val_loss: 0.7280 - val_accuracy: 0.9167\n",
      "Epoch 15/30\n",
      "96/96 [==============================] - 0s 379us/sample - loss: 0.7975 - accuracy: 0.8125 - val_loss: 0.7199 - val_accuracy: 0.9167\n",
      "Epoch 16/30\n",
      "96/96 [==============================] - 0s 295us/sample - loss: 0.7873 - accuracy: 0.8125 - val_loss: 0.7123 - val_accuracy: 0.9167\n",
      "Epoch 17/30\n",
      "96/96 [==============================] - 0s 319us/sample - loss: 0.7773 - accuracy: 0.8125 - val_loss: 0.7041 - val_accuracy: 0.9167\n",
      "Epoch 18/30\n",
      "96/96 [==============================] - 0s 331us/sample - loss: 0.7673 - accuracy: 0.8125 - val_loss: 0.6959 - val_accuracy: 0.9167\n",
      "Epoch 19/30\n",
      "96/96 [==============================] - 0s 341us/sample - loss: 0.7575 - accuracy: 0.8125 - val_loss: 0.6886 - val_accuracy: 0.9167\n",
      "Epoch 20/30\n",
      "96/96 [==============================] - 0s 450us/sample - loss: 0.7479 - accuracy: 0.8125 - val_loss: 0.6795 - val_accuracy: 0.9167\n",
      "Epoch 21/30\n",
      "96/96 [==============================] - 0s 297us/sample - loss: 0.7387 - accuracy: 0.8125 - val_loss: 0.6731 - val_accuracy: 0.9167\n",
      "Epoch 22/30\n",
      "96/96 [==============================] - 0s 355us/sample - loss: 0.7290 - accuracy: 0.8125 - val_loss: 0.6652 - val_accuracy: 0.9167\n",
      "Epoch 23/30\n",
      "96/96 [==============================] - 0s 265us/sample - loss: 0.7200 - accuracy: 0.8125 - val_loss: 0.6576 - val_accuracy: 0.9167\n",
      "Epoch 24/30\n",
      "96/96 [==============================] - 0s 317us/sample - loss: 0.7111 - accuracy: 0.8125 - val_loss: 0.6506 - val_accuracy: 0.9167\n",
      "Epoch 25/30\n",
      "96/96 [==============================] - 0s 252us/sample - loss: 0.7020 - accuracy: 0.8125 - val_loss: 0.6432 - val_accuracy: 0.9167\n",
      "Epoch 26/30\n",
      "96/96 [==============================] - 0s 361us/sample - loss: 0.6933 - accuracy: 0.8125 - val_loss: 0.6347 - val_accuracy: 0.9167\n",
      "Epoch 27/30\n",
      "96/96 [==============================] - 0s 395us/sample - loss: 0.6845 - accuracy: 0.8125 - val_loss: 0.6273 - val_accuracy: 0.9167\n",
      "Epoch 28/30\n",
      "96/96 [==============================] - 0s 285us/sample - loss: 0.6761 - accuracy: 0.8125 - val_loss: 0.6204 - val_accuracy: 0.9167\n",
      "Epoch 29/30\n",
      "96/96 [==============================] - 0s 352us/sample - loss: 0.6675 - accuracy: 0.8125 - val_loss: 0.6132 - val_accuracy: 0.9167\n",
      "Epoch 30/30\n",
      "96/96 [==============================] - 0s 264us/sample - loss: 0.6592 - accuracy: 0.8125 - val_loss: 0.6065 - val_accuracy: 0.9167\n"
     ]
    }
   ],
   "source": [
    "\n",
    "history = model_iris.fit(x_train, y_train.values,\n",
    "                    batch_size= 64,\n",
    "                    epochs= 30,\n",
    "                    validation_split=0.2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"my_custom_model\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense (Dense)                multiple                  25        \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              multiple                  60        \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              multiple                  33        \n",
      "=================================================================\n",
      "Total params: 118\n",
      "Trainable params: 118\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_iris.summary()\n",
    "#plot_model(model_iris, to_file='../Imagenes/iris_model.png', \n",
    "#           show_shapes=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Evaluación del modelo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "def plot_metric(history, metric):\n",
    "    train_metrics = history.history[metric]\n",
    "    val_metrics = history.history['val_'+metric]\n",
    "    epochs = range(1, len(train_metrics) + 1)\n",
    "    plt.plot(epochs, train_metrics, 'bo--')\n",
    "    plt.plot(epochs, val_metrics, 'ro-')\n",
    "    plt.title('Entrenamiento y validación '+ metric)\n",
    "    plt.xlabel(\"Epochs\")\n",
    "    plt.ylabel(metric)\n",
    "    plt.legend([\"train_\"+metric, 'val_'+metric])\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_metric(history, 'loss')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_metric(history, 'accuracy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "30/30 [==============================] - 0s 165us/sample - loss: 0.7790 - accuracy: 0.7000\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "[0.7789719104766846, 0.7]"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model_iris.evaluate(x = x_test,y = y_test.values)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Predicciones"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Predicting the Test set results\n",
    "y_pred = model_iris.predict(x_test)\n",
    "y_pred_c = np.argmax(y_pred, axis=1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Matriz de confusión"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "cm = confusion_matrix(y_test_species, y_pred_c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print(\"Our accuracy is {}%\".format(((cm[0][0] + cm[1][1]+ cm[2][2])/y_test_species.shape[0])*100))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.heatmap(cm,annot=True)\n",
    "plt.savefig('h.png')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "[Regresar al inicio](#Contenido)"
   ]
  }
 ],
 "metadata": {
  "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.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}