{ "cells": [ { "cell_type": "markdown", "id": "bdcc40f5-1d27-423f-ac0a-07c448de8d5b", "metadata": {}, "source": [ "# Problema clasificación con RNA y Keras" ] }, { "cell_type": "code", "execution_count": 103, "id": "04a0f673-5f7f-4aeb-95ad-a615b0382183", "metadata": {}, "outputs": [], "source": [ "from keras.models import Sequential\n", "from keras.layers import Dense\n", "import tensorflow as tf\n", "import pandas as pd\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 52, "id": "aee52bb9-f52f-44a5-8008-1df871f4fded", "metadata": {}, "outputs": [], "source": [ "# Para obtener todos el mismo resultado debemos añadir una semilla\n", "from numpy.random import seed\n", "seed(1)\n", "from tensorflow import random\n", "random.set_seed(1)" ] }, { "cell_type": "code", "execution_count": 53, "id": "8e6a7788-2b7d-4ee2-963b-ce247d7467f8", "metadata": {}, "outputs": [], "source": [ "# Cargamos el conjunto de datos\n", "df = pd.read_csv(\"./datos/diabetes.csv\", sep=\",\", header=None)" ] }, { "cell_type": "code", "execution_count": 54, "id": "9513123c-11ec-41e1-9b0f-65427d59e6d2", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 768 entries, 0 to 767\n", "Data columns (total 9 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 0 768 non-null int64 \n", " 1 1 768 non-null int64 \n", " 2 2 768 non-null int64 \n", " 3 3 768 non-null int64 \n", " 4 4 768 non-null int64 \n", " 5 5 768 non-null float64\n", " 6 6 768 non-null float64\n", " 7 7 768 non-null int64 \n", " 8 8 768 non-null int64 \n", "dtypes: float64(2), int64(7)\n", "memory usage: 54.1 KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 55, "id": "72dc4f4a-d75a-4e88-86c7-852c0aff82d9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
012345678
061487235033.60.627501
11856629026.60.351310
28183640023.30.672321
318966239428.10.167210
40137403516843.12.288331
\n", "
" ], "text/plain": [ " 0 1 2 3 4 5 6 7 8\n", "0 6 148 72 35 0 33.6 0.627 50 1\n", "1 1 85 66 29 0 26.6 0.351 31 0\n", "2 8 183 64 0 0 23.3 0.672 32 1\n", "3 1 89 66 23 94 28.1 0.167 21 0\n", "4 0 137 40 35 168 43.1 2.288 33 1" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "markdown", "id": "6d5d3b2a-2f15-4642-9368-041efb584fbb", "metadata": {}, "source": [ "Significado de las columnas:\n", "\n", " 0. Number of times pregnant\n", " 1. Plasma glucose concentration a 2 hours in an oral glucose tolerance test\n", " 2. Diastolic blood pressure (mm Hg)\n", " 3. Triceps skin fold thickness (mm)\n", " 4. 2-Hour serum insulin (mu U/ml)\n", " 5. Body mass index (weight in kg/(height in m)^2)\n", " 6. Diabetes pedigree function\n", " 7. Age (years)\n", " 8. Variable clase (Tiene diabetes)" ] }, { "cell_type": "code", "execution_count": 135, "id": "f01202bc-e23a-4793-abc8-22750828e4d0", "metadata": {}, "outputs": [], "source": [ "# Dividimos los datos en X e y\n", "X = df.iloc[:,0:8]\n", "y = df.iloc[:,8]" ] }, { "cell_type": "code", "execution_count": 136, "id": "899ed651-0505-456b-b799-17d71adb021b", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "X_train, X_test, y_train, y_test = train_test_split(\n", " X,\n", " y,\n", " train_size = 0.7,\n", " random_state = 123,\n", " shuffle = True\n", " )" ] }, { "cell_type": "markdown", "id": "ee718e19-2a9f-4855-a225-7d5245d31438", "metadata": { "tags": [] }, "source": [ "### Definimos el modelo Keras" ] }, { "cell_type": "code", "execution_count": 137, "id": "6a42e55b-9cdb-49a7-a0bf-81820d72a0b6", "metadata": {}, "outputs": [], "source": [ "# Definiremos el modelo como una secuencia de capas.\n", "# Usaremos el modelo secuencial de manera que podamos ir añadiendo capas hasta estar contentos con la arquitectura desarrollada.\n", "model = Sequential()\n", "\n", "# Partimos de un sistema con 8 variables por lo que nuestra primera capa acomodará dichas variables\n", "# En la primera capa oculta usaremos 12 neuronas y una función de activación ReLU\n", "# En la segunda capa oculta usaremos 8 neuronas y una función de activación ReLU\n", "# Finalmente en la de salida una neurona y función de activación sigmoide\n", "model.add(Dense(12, input_dim=8, activation='relu'))\n", "model.add(Dense(8, activation='relu'))\n", "model.add(Dense(1, activation='sigmoid'))\n", "\n", "# Nota: Fíjate que el total de neuronas de entrada, lo definimos en la primera capa con input_dim\n" ] }, { "cell_type": "markdown", "id": "0746d633-caac-4fb0-a865-f66b75004816", "metadata": {}, "source": [ "### Compilamos el modelo" ] }, { "cell_type": "code", "execution_count": 144, "id": "f0222457-544f-4e2f-ae99-427bfc9cb2ce", "metadata": {}, "outputs": [], "source": [ "# La compilación usa (internamente) librerías numéricas muy eficientes como TensorFlow además de comprobar si tenemos GPU o sólo CPU\n", "# Es necesario definir la función de pérdida que vamos a minimizar (optimizar). Para este caso minimizaremos Binary Cross Entropy puesto\n", "# que funciona bien para problemas binarios de clasificación.\n", "# Como métrica (al ser clasificación) usaremos la precisión\n", "# Como optimizador, usaremos el algoritmo \"adam\" ya que ofrece buenos resultados en un amplio abanico de problemas y además de manera rápida\n", "\n", "model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),\n", " #loss=\"binary_crossentropy\",\n", " loss=tf.keras.losses.BinaryCrossentropy(from_logits=False, # para valores de predicción [0,1]\n", " label_smoothing=0.0,\n", " axis=-1,\n", " reduction=\"auto\",\n", " name=\"binary_crossentropy\"),\n", " metrics=['accuracy'])\n", "\n" ] }, { "cell_type": "markdown", "id": "74c1d83b-31e7-40bc-8a7d-d79dedefa38e", "metadata": {}, "source": [ "### Entrenamos el modelo" ] }, { "cell_type": "code", "execution_count": 145, "id": "c037df80-32c5-45ed-b4bd-e2d7b42c734e", "metadata": { "scrolled": true, "tags": [] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Epoch 1/150\n", "54/54 [==============================] - 0s 915us/step - loss: 0.4362 - accuracy: 0.7970\n", "Epoch 2/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4337 - accuracy: 0.7877\n", "Epoch 3/150\n", "54/54 [==============================] - 0s 973us/step - loss: 0.4296 - accuracy: 0.7914\n", "Epoch 4/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4271 - accuracy: 0.7896\n", "Epoch 5/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4422 - accuracy: 0.7728\n", "Epoch 6/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4354 - accuracy: 0.8101\n", "Epoch 7/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4312 - accuracy: 0.8045\n", "Epoch 8/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4345 - accuracy: 0.7914\n", "Epoch 9/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4333 - accuracy: 0.7803\n", "Epoch 10/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4478 - accuracy: 0.7803\n", "Epoch 11/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4462 - accuracy: 0.7784\n", "Epoch 12/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4247 - accuracy: 0.7896\n", "Epoch 13/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4260 - accuracy: 0.8026\n", "Epoch 14/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4235 - accuracy: 0.8007\n", "Epoch 15/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4287 - accuracy: 0.7914\n", "Epoch 16/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4314 - accuracy: 0.7896\n", "Epoch 17/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4244 - accuracy: 0.8045\n", "Epoch 18/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4192 - accuracy: 0.7970\n", "Epoch 19/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4306 - accuracy: 0.7840\n", "Epoch 20/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4284 - accuracy: 0.7896\n", "Epoch 21/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4272 - accuracy: 0.7933\n", "Epoch 22/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4433 - accuracy: 0.7952\n", "Epoch 23/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4295 - accuracy: 0.7989\n", "Epoch 24/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4208 - accuracy: 0.8063\n", "Epoch 25/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4251 - accuracy: 0.7896\n", "Epoch 26/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4336 - accuracy: 0.7896\n", "Epoch 27/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4201 - accuracy: 0.7933\n", "Epoch 28/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4206 - accuracy: 0.8063\n", "Epoch 29/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4161 - accuracy: 0.7952\n", "Epoch 30/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4432 - accuracy: 0.7989\n", "Epoch 31/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4190 - accuracy: 0.7914\n", "Epoch 32/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4192 - accuracy: 0.7970\n", "Epoch 33/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4258 - accuracy: 0.7914\n", "Epoch 34/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4210 - accuracy: 0.8082\n", "Epoch 35/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4351 - accuracy: 0.7896\n", "Epoch 36/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4401 - accuracy: 0.7896\n", "Epoch 37/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4267 - accuracy: 0.8026\n", "Epoch 38/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4256 - accuracy: 0.8007\n", "Epoch 39/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4293 - accuracy: 0.7858\n", "Epoch 40/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4141 - accuracy: 0.8138\n", "Epoch 41/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4210 - accuracy: 0.7989\n", "Epoch 42/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4183 - accuracy: 0.8045\n", "Epoch 43/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4281 - accuracy: 0.7970\n", "Epoch 44/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4134 - accuracy: 0.8082\n", "Epoch 45/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4353 - accuracy: 0.7784\n", "Epoch 46/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4207 - accuracy: 0.8045\n", "Epoch 47/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4287 - accuracy: 0.7989\n", "Epoch 48/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4157 - accuracy: 0.8119\n", "Epoch 49/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4172 - accuracy: 0.8045\n", "Epoch 50/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4135 - accuracy: 0.8007\n", "Epoch 51/150\n", "54/54 [==============================] - 0s 3ms/step - loss: 0.4129 - accuracy: 0.8138\n", "Epoch 52/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4177 - accuracy: 0.7952\n", "Epoch 53/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4234 - accuracy: 0.7840\n", "Epoch 54/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4201 - accuracy: 0.8119\n", "Epoch 55/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4138 - accuracy: 0.8101\n", "Epoch 56/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4428 - accuracy: 0.7896\n", "Epoch 57/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4222 - accuracy: 0.7877\n", "Epoch 58/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4157 - accuracy: 0.7933\n", "Epoch 59/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4206 - accuracy: 0.7933\n", "Epoch 60/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4187 - accuracy: 0.8026\n", "Epoch 61/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4297 - accuracy: 0.8026\n", "Epoch 62/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4201 - accuracy: 0.7989\n", "Epoch 63/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4182 - accuracy: 0.8101\n", "Epoch 64/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4262 - accuracy: 0.8101\n", "Epoch 65/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4214 - accuracy: 0.7840\n", "Epoch 66/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4220 - accuracy: 0.8026\n", "Epoch 67/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4187 - accuracy: 0.7952\n", "Epoch 68/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4295 - accuracy: 0.7933\n", "Epoch 69/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4182 - accuracy: 0.7933\n", "Epoch 70/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4211 - accuracy: 0.8082\n", "Epoch 71/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4277 - accuracy: 0.7933\n", "Epoch 72/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4199 - accuracy: 0.7952\n", "Epoch 73/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4411 - accuracy: 0.7933\n", "Epoch 74/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4228 - accuracy: 0.7952\n", "Epoch 75/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4062 - accuracy: 0.8119\n", "Epoch 76/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4339 - accuracy: 0.7877\n", "Epoch 77/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4183 - accuracy: 0.8026\n", "Epoch 78/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4498 - accuracy: 0.7821\n", "Epoch 79/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4153 - accuracy: 0.7989\n", "Epoch 80/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4054 - accuracy: 0.8082\n", "Epoch 81/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4151 - accuracy: 0.8231\n", "Epoch 82/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4128 - accuracy: 0.8007\n", "Epoch 83/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4371 - accuracy: 0.7933\n", "Epoch 84/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4145 - accuracy: 0.8026\n", "Epoch 85/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4131 - accuracy: 0.8156\n", "Epoch 86/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4214 - accuracy: 0.7989\n", "Epoch 87/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4172 - accuracy: 0.7914\n", "Epoch 88/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4205 - accuracy: 0.7933\n", "Epoch 89/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4080 - accuracy: 0.8119\n", "Epoch 90/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4291 - accuracy: 0.7989\n", "Epoch 91/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4139 - accuracy: 0.8045\n", "Epoch 92/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4163 - accuracy: 0.8026\n", "Epoch 93/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4089 - accuracy: 0.8175\n", "Epoch 94/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4080 - accuracy: 0.8045\n", "Epoch 95/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4106 - accuracy: 0.8063\n", "Epoch 96/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4187 - accuracy: 0.8138\n", "Epoch 97/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4398 - accuracy: 0.8007\n", "Epoch 98/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4180 - accuracy: 0.8026\n", "Epoch 99/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4107 - accuracy: 0.7933\n", "Epoch 100/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4209 - accuracy: 0.8026\n", "Epoch 101/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4153 - accuracy: 0.7933\n", "Epoch 102/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4045 - accuracy: 0.8063\n", "Epoch 103/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4505 - accuracy: 0.7821\n", "Epoch 104/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4241 - accuracy: 0.7896\n", "Epoch 105/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4321 - accuracy: 0.7970\n", "Epoch 106/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4226 - accuracy: 0.8063\n", "Epoch 107/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4118 - accuracy: 0.8045\n", "Epoch 108/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4175 - accuracy: 0.7970\n", "Epoch 109/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4133 - accuracy: 0.8119\n", "Epoch 110/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4135 - accuracy: 0.7989\n", "Epoch 111/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4171 - accuracy: 0.8026\n", "Epoch 112/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4119 - accuracy: 0.8156\n", "Epoch 113/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4113 - accuracy: 0.8101\n", "Epoch 114/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4176 - accuracy: 0.7952\n", "Epoch 115/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4088 - accuracy: 0.8026\n", "Epoch 116/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4119 - accuracy: 0.7952\n", "Epoch 117/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4215 - accuracy: 0.7970\n", "Epoch 118/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4218 - accuracy: 0.8138\n", "Epoch 119/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4062 - accuracy: 0.8194\n", "Epoch 120/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4147 - accuracy: 0.7840\n", "Epoch 121/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4158 - accuracy: 0.8045\n", "Epoch 122/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4159 - accuracy: 0.8045\n", "Epoch 123/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4097 - accuracy: 0.8082\n", "Epoch 124/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4022 - accuracy: 0.8156\n", "Epoch 125/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4062 - accuracy: 0.8119\n", "Epoch 126/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4131 - accuracy: 0.8026\n", "Epoch 127/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4110 - accuracy: 0.8045\n", "Epoch 128/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4069 - accuracy: 0.8101\n", "Epoch 129/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4067 - accuracy: 0.8045\n", "Epoch 130/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4137 - accuracy: 0.8045\n", "Epoch 131/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4097 - accuracy: 0.8026\n", "Epoch 132/150\n", "54/54 [==============================] - 0s 943us/step - loss: 0.4148 - accuracy: 0.8063\n", "Epoch 133/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4060 - accuracy: 0.8026\n", "Epoch 134/150\n", "54/54 [==============================] - 0s 1ms/step - loss: 0.4029 - accuracy: 0.7952\n", "Epoch 135/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4153 - accuracy: 0.8101\n", "Epoch 136/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4210 - accuracy: 0.7877\n", "Epoch 137/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4084 - accuracy: 0.8119\n", "Epoch 138/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4278 - accuracy: 0.8119\n", "Epoch 139/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4305 - accuracy: 0.7970\n", "Epoch 140/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4288 - accuracy: 0.7933\n", "Epoch 141/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4272 - accuracy: 0.7914\n", "Epoch 142/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4005 - accuracy: 0.8194\n", "Epoch 143/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.3998 - accuracy: 0.8119\n", "Epoch 144/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4106 - accuracy: 0.8119\n", "Epoch 145/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4124 - accuracy: 0.8045\n", "Epoch 146/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4015 - accuracy: 0.8194\n", "Epoch 147/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4097 - accuracy: 0.8082\n", "Epoch 148/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4139 - accuracy: 0.8175\n", "Epoch 149/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4119 - accuracy: 0.8156\n", "Epoch 150/150\n", "54/54 [==============================] - 0s 2ms/step - loss: 0.4095 - accuracy: 0.8082\n" ] }, { "data": { "text/plain": [ "" ] }, "execution_count": 145, "metadata": {}, "output_type": "execute_result" } ], "source": [ "seed(1)\n", "random.set_seed(1)\n", "# El argumento batch_size, nos permite definir el número de filas que se considerarán, antes de que los pesos del\n", "# modelo se reajusten dentro de cada ciclo.\n", "model.fit(X_train, y_train, epochs=150, batch_size=10)" ] }, { "cell_type": "markdown", "id": "d2ff0822-25fe-4bd9-8591-d9eb67ee0f3a", "metadata": {}, "source": [ "### Evaluamos el modelo" ] }, { "cell_type": "code", "execution_count": 146, "id": "594870e3-0d4c-42a9-95e3-129dfdc5e2c9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "17/17 [==============================] - 0s 968us/step - loss: 0.4053 - accuracy: 0.8026\n", "Accuracy: 80.26\n" ] } ], "source": [ "# Con la red neuronal entrenada, ahora debemos evaluar cómo ha funcionado.\n", "_, accuracy = model.evaluate(X_train, y_train)\n", "print('Accuracy: %.2f' % (accuracy*100))" ] }, { "cell_type": "code", "execution_count": 74, "id": "6305f141-d464-49e3-bd37-06feb1eef7df", "metadata": {}, "outputs": [], "source": [ "# No es un mal resultado, tenemos una precisión de más del 80%" ] }, { "cell_type": "markdown", "id": "ea5c8cb0-afee-4f5d-85d4-42bcbf39141e", "metadata": {}, "source": [ "### Predicciones" ] }, { "cell_type": "code", "execution_count": 147, "id": "00e54af8-55eb-4da4-abf8-c6699c07d86c", "metadata": { "scrolled": true, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "array([[1],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [1],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [0],\n", " [1],\n", " [1],\n", " [0],\n", " [0],\n", " [1],\n", " [1],\n", " [1],\n", " [0],\n", " [0],\n", " [0],\n", " [1],\n", " [0],\n", " [1],\n", " [0],\n", " [0],\n", " [0]])" ] }, "execution_count": 147, "metadata": {}, "output_type": "execute_result" } ], "source": [ "predicciones = model.predict(X_test)\n", "\n", "# La función sigmoide nos devueve los resultados en formato probabilidad.\n", "# Convertimos los mismos a casos, tomando como umbral 0.5\n", "y_pred = (predicciones > 0.5).astype(int)\n", "y_pred" ] }, { "cell_type": "code", "execution_count": 148, "id": "e8eb3b21-b518-47d0-babf-af7acdc5ad50", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[125, 18],\n", " [ 48, 40]])" ] }, "execution_count": 148, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sklearn.metrics import confusion_matrix\n", "confusion_matrix(y_test, y_pred)" ] }, { "cell_type": "markdown", "id": "ffbf0de0-b6cb-437c-a92c-1b992e1d533b", "metadata": {}, "source": [ "## Ejercicios" ] }, { "cell_type": "markdown", "id": "33cf349a-48f3-46a2-85ab-abc2769e600a", "metadata": {}, "source": [ "1.Configura la red neuronal para que trabaje con 4 capas. \n", "- La primera con 15 neuronas y función de activación sigmoide. \n", "- La segunda con 10 neuronas y función de activación sigmoide.\n", "- La tercera con 8 neuronas y función de activación ReLU.\n", "- La cuarta con 1 neurona y función de activación sigmoide." ] }, { "cell_type": "markdown", "id": "3b692f1a-92cb-4134-b817-ba9cdd99d632", "metadata": {}, "source": [ "2.Configura la red neuronal para que trabaje con las 3 mismas capas del ejemplo inicial, pero esta vez usa como función de activación de la última capa 'softmax'" ] }, { "cell_type": "markdown", "id": "ab6f5724-f5db-42f5-95f8-a6bfecb51365", "metadata": {}, "source": [ "3.En compile, cambia la configuración del optimizer, de manera que en vez de Adam, usemos esta vez SGD:\n", "optimizer=tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.1, nesterov=False, name='SGD')" ] }, { "cell_type": "markdown", "id": "f1cc7577-0b0d-4c1a-886f-be3c305035be", "metadata": {}, "source": [ "4.En compile, cambia la configuración del loss para usar como función de pérdida CategoriclCrossentropy.\n", "\n", "tf.keras.losses.CategoricalCrossentropy(\n", " from_logits=False,\n", " label_smoothing=0.0,\n", " axis=-1,\n", " reduction=\"auto\",\n", " name=\"categorical_crossentropy\",\n", ")" ] }, { "cell_type": "markdown", "id": "cb6f2919-396b-484d-b5ad-cfd8b473664c", "metadata": {}, "source": [ "4.Prueba diferentes configuraciones a ver si consigues mejorar el resultado inicial." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.12" } }, "nbformat": 4, "nbformat_minor": 5 }