{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "Aula04_Classificacao.ipynb", "provenance": [], "collapsed_sections": [ "a7bSBLFhjBoK" ], "toc_visible": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "3aLpyNRRp4t0" }, "source": [ "# AI application in Structural Engineering\n", "_Larissa Driemeier, Izabel F. Machado_\n", " ![](https://drive.google.com/uc?export=view&id=1D5NMNp-KTfou5cSIiDdXwdDDTzRGzToq)\n", "\n", "This introductory notebook is about Classification problems. \n", "\n", "It is based on the [PMR5251 - Class#9](https://edisciplinas.usp.br/pluginfile.php/5809148/mod_resource/content/3/Aula04_Classification.pdf)." ] }, { "cell_type": "code", "metadata": { "id": "CBR3rOF3SCq1" }, "source": [ "import operator\n", "\n", "import numpy as np\n", "import seaborn as sn\n", "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "\n", "import sklearn\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn import metrics\n", "from sklearn.metrics import confusion_matrix\n", "\n", "import tensorflow as tf\n", "from tensorflow import keras\n", "from sklearn.model_selection import train_test_split\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Activation" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "Gyg9CD0vfPp9" }, "source": [ "## Sigmóide\n", "\n", "Uma das funções mais populares é o sigmoide, uma função poderosa principalmente para os problemas de classificação. Basicamente, a função sigmóide retorna um valor entre $1$ e $0$, bastante útil para problemas de classificação binária.\n", "\n", "Mas como podemos interpretar um valor retornado por uma função sigmóide?\n", "\n", "Suponha que você treinou uma Rede Neural para classificar imagens de Cães e Gatos, problema clássico, onde *cão* é 1 e *gato* é 0. Basicamente, quando seu modelo retorna valores $> 0.5$ significa que a imagem é de um cão, e $ \\ge 0.5$ significa que a imagem é de um gato.\n", "\n", "### Exemplo\n", "\n", "Suponha que a probabilidade de um cliente adquirir uma assinatura de uma revista por mala direta é,\n", "$$\n", "𝑝𝑟𝑜𝑏(𝑒𝑣𝑒𝑛𝑡𝑜)=\\frac{1}{1+e^{−(-1.143+0.452 x_1+0.029 x_2 − 0.242x_3 )}}\n", "$$\n", "onde $x_1$ é o sexo (1 para feminino e 0 para masculino), $x_2$ é a idade e $x_3$ é o estado civil (1 para solteiro e 0 para casado).\n", "\n", "Uma pessoa do sexo feminino, com 40 anos de idade e casada, irá adquirir a assinatura da revista?" ] }, { "cell_type": "code", "metadata": { "id": "xAsuAs3ve_uF" }, "source": [ "def sigmoid(z):\n", " # Activation function used to map any real value between 0 and 1\n", " return 1 / (1 + np.exp(-z))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "FCzMSAvQf5oM", "outputId": "6cf6ac74-2cf3-4436-85fb-a8f8c67a5575", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "w = np.array([-1.143,0.452, 0.029, -0.242 ])\n", "x =([1., 1., 40., 0.])\n", "z = np.dot (w,x)\n", "print('Probabilidade de compra = {:.4f}'.format(sigmoid(z)))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Probabilidade de compra = 0.6151\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "xU1dBbSje8ff" }, "source": [ "##Regressão Logística binária\n", "\n", "Dado um conjunto de dados de entrada represento pela matriz $\\textbf{X}$ de dimensão $m\\times n$, $\\mathbf{y}$ o vetor de valores de dados observados e $h_{\\omega}(\\mathbf X)$ o modelo logístico. $\\boldsymbol{\\omega}$ contém os valores dos parâmetros atuais. \n", "\n", "\n", "### Função perda: Entropia Cruzada\n", "Em vez do erro quadrático médio, usamos a perda de entropia cruzada,\n", "\\begin{aligned}\n", "J(\\boldsymbol{\\omega}, \\mathbf{X}, \\mathbf{y}) = \\frac{1}{m} \\sum_i \\left[- y^{(i)} \\ln (h_{\\omega}(\\mathbf{X}_i)) - \\left(1 - y^{(i)}\\right) \\ln \\left(1 - h_{\\omega}(\\mathbf{X}^{(i)})\\right) \\right]\n", "\\end{aligned}\n", "\n", "Você pode observar que, como de costume, calculamos a perda média de cada ponto em nosso conjunto de dados. A expressão interna no somatório acima representa o custo em um ponto de dados $(\\mathbf{X}^{(i)}, y^{(i)})$,\n", "\n", "$$\n", "\\begin{aligned}\n", "L(\\boldsymbol{\\omega}, \\textbf{X}^{(i)}, y^{(i)}) = - y^{(i)} \\ln \\left(h_{\\omega}(\\textbf{X}^{(i)})\\right) - (1 - y^{(i)}) \\ln \\left(1 - h_{\\omega}(\\textbf{X}^{(i)}) \\right)\n", "\\end{aligned}\\tag{1}\n", "$$\n", "\n", "Dado que, na regressão logística cada $y^{(i)}$ assume os valores $0$ ou $1$ percebe-se que se $y^{(i)}=0$, o primeiro termo da equação (1) é zero. Se $y^{(i)}=1$, o segundo termo da equação (1) é zero. Assim, para cada ponto em nosso conjunto de dados, apenas um termo da perda de entropia cruzada contribui para a perda geral.\n", "\n", "Suponha $y^{(i)}=0$ e a previsão do modelo logístico seja $h_{\\omega}(\\textbf{X}^{(i)}) = 0$ — ié, o modelo previu corretamente a resposta. O custo para este ponto será:\n", "\\begin{split}\n", "\\begin{aligned}\n", "L(\\boldsymbol{\\omega}, \\textbf{X}^{(i)}, y^{(i)})\n", "&= - y^{(i)} \\ln \\left(h_{\\omega}(\\textbf{X}^{(i)})\\right) - (1 - y^{(i)}) \\ln \\left(1 - h_{\\omega}(\\textbf{X}^{(i)}) \\right) \\\\\n", "&= - 0 - (1 - 0) \\ln (1 - 0 ) \\\\\n", "&= - \\ln (1) \\\\\n", "&= 0\n", "\\end{aligned}\n", "\\end{split}\n", "\n", "Como esperado, a perda de uma previsão correta é $0$. Pode-se verificar também que quanto mais longe a probabilidade prevista estiver do valor verdadeiro, maior será a perda.\n", "\n", "Minimizar a perda geral de entropia cruzada requer que o modelo $h_{\\omega}(\\textbf{X}^{(i)})$ faça as previsões mais precisas que puder. Convenientemente, essa função de perda é convexa, tornando a descida do gradiente uma escolha natural para otimização.\n", "\n", "### Gradiente da função de perda por entropia cruzada\n", "\n", "Para executar o gradiente descendente na perda de entropia cruzada de um modelo, devemos calcular o gradiente da função de perda. Primeiro, calculamos a derivada da função sigmóide, uma vez que a usaremos em nosso cálculo de gradiente.\n", "\n", "\\begin{split}\n", "\\begin{aligned}\n", "\\sigma(z) &= \\frac{1}{1 + e^{-z}} \\\\\n", "\\sigma'(z) &= \\frac{e^{-z}}{(1 + e^{-z})^2} \\\\\n", "\\sigma'(z) &= \\frac{1}{1 + e^{-z}} \\cdot \\left(1 - \\frac{1}{1 + e^{-z}} \\right) \\\\\n", "\\sigma'(z) &= \\sigma(z) \\left(1 - \\sigma(z)\\right)\n", "\\end{aligned}\n", "\\end{split}\n", "\n", "A derivada da função sigmóide pode ser convenientemente expressa em termos da própria função sigmóide.\n", "\n", "Define-se $\\sigma^{(i)} = h_{\\omega}(\\textbf{X}^{(i)}) = \\sigma({\\textbf{X}^{(i)}}^T \\boldsymbol{\\omega})$. Portanto,\n", "\n", "\\begin{split}\n", "\\begin{aligned}\n", "\\nabla_{\\omega} \\sigma^{(i)}\n", "&= \\nabla_{\\omega} \\sigma(\\textbf{X}^{(i)} \\cdot \\boldsymbol{\\omega}) \\\\\n", "&= \\sigma(\\textbf{X}^{(i)} \\cdot \\boldsymbol{\\omega}) (1 - \\sigma(\\textbf{X}^{(i)} \\cdot \\boldsymbol{\\omega})) \\nabla_{\\omega} (\\textbf{X}^{(i)} \\cdot \\boldsymbol{\\omega}) \\\\\n", "&= \\sigma^{(i)} (1 - \\sigma^{(i)}) \\textbf{X}^{(i)} \n", "\\end{aligned}\n", "\\end{split}\n", "\n", "Agora, derivamos o gradiente da perda de entropia cruzada em relação aos parâmetros do modelo $\\boldsymbol\\omega$.\n", "\n", "$$\n", "\\begin{split}\n", "\\begin{aligned}\n", "J(\\boldsymbol{\\omega}, \\textbf{X}, \\textbf{y})\n", "&= \\frac{1}{m} \\sum_i \\left(- y^{(i)} \\ln (h_{\\omega}(\\textbf{X}^{(i)})) - (1 - y^{(i)}) \\ln (1 - h_{\\omega}(\\textbf{X}^{(i)}) \\right) \\\\\n", "&= \\frac{1}{m} \\sum_i \\left(- y^{(i)} \\ln \\sigma^{(i)} - (1 - y^{(i)}) \\ln (1 - \\sigma^{(i)}) \\right) \\\\\n", "\\nabla_{\\omega} L(\\boldsymbol{\\omega}, \\textbf{X}, \\textbf{y})\n", "&= \\frac{1}{m} \\sum_i \\left(\n", " - \\frac{y^{(i)}}{\\sigma^{(i)}} \\nabla_{\\omega} \\sigma^{(i)}\n", " + \\frac{1 - y^{(i)}}{1 - \\sigma^{(i)}} \\nabla_{\\omega} \\sigma^{(i)} \\right) \\\\\n", "&= - \\frac{1}{m} \\sum_i \\left(\n", " \\frac{y^{(i)}}{\\sigma^{(i)}} - \\frac{1 - y^{(i)}}{1 - \\sigma^{(i)}}\n", "\\right) \\nabla_{\\omega} \\sigma^{(i)} \\\\\n", "&= - \\frac{1}{m} \\sum_i \\left(\n", " \\frac{y^{(i)}}{\\sigma^{(i)}} - \\frac{1 - y^{(i)}}{1 - \\sigma^{(i)}}\n", "\\right) \\sigma^{(i)} (1 - \\sigma^{(i)}) \\textbf{X}^{(i)} \\\\\n", "&= - \\frac{1}{m} \\sum_i \\left(\n", " y^{(i)} - \\sigma^{(i)}\n", "\\right) \\textbf{X}^{(i)} \\\\\n", "\\end{aligned} \n", "\\end{split}\\tag{2}\n", "$$\n", "\n", "Uma expressão surpreendentemente simples nos permite ajustar um modelo logístico para a perda de entropia cruzada usando gradiente descendente:\n", "$$\n", "\\hat{\\boldsymbol{\\omega}} = \\displaystyle\\arg \\min_{\\substack{\\boldsymbol{\\omega}}} J(\\boldsymbol{\\omega}, \\textbf{X}, \\textbf{y})\n", "$$\n", "\n", "### Gradiente descendente em lote\n", "\n", "A fórmula geral de atualização para a descida do gradiente é dada por:\n", "$$\n", "\\boldsymbol{\\omega}^{(t+1)} = \\boldsymbol{\\omega}^{(t)} - \\alpha \\nabla_{\\omega} J(\\boldsymbol{\\omega}^{(t)}, \\textbf{X}, \\textbf{y})\\tag{3}\n", "$$\n", "onde $\\alpha$ é o hiperparâmetro taxa de aprendizado.\n", "\n", "Ao inserir a eq. (2) à fórmula de atualização (3), tem-se o algoritmo de gradiente descendente específico para regressão logística,\n", "$$\n", "\\begin{split}\n", "\\begin{align}\n", "\\boldsymbol{\\omega}^{(t+1)} &= \\boldsymbol{\\omega}^{(t)} - \\alpha \\left[- \\frac{1}{m} \\sum\\limits_{i=1}^{m} \\left(y^{(i)} - \\sigma^{(i)}\\right) \\textbf{X}^{(i)} \\right] \\\\\n", "&= \\boldsymbol{\\omega}^{(t)} + \\alpha \\left[\\frac{1}{m} \\sum\\limits_{i=1}^{m} \\left(y^{(i)} - \\sigma^{(i)}\\right) \\textbf{X}^{(i)} \\right]\n", "\\end{align}\n", "\\end{split}\n", "$$\n" ] }, { "cell_type": "markdown", "metadata": { "id": "a7bSBLFhjBoK" }, "source": [ "### Exemplo 01\n", "\n", "O exemplo refere-se à estabilidade de um passo, na marcha de um robô. \n", "Os tamanhos de passo testados foram:\n", "\\begin{equation}\n", "[1.8, 2.6, 3.2, 4.2, 4.4, 4.8, 5.2, 6.2 , 6.9, 8.6]\n", "\\end{equation}\n", "\n", "E a resposta (1 - instável, 0 - estável) é,\n", "\\begin{equation}\n", "[0, 0, 1, 0, 1, 1, 1, 1, 1, 1]\n", "\\end{equation}" ] }, { "cell_type": "code", "metadata": { "id": "eJ2n4DB8jERt", "outputId": "06d05097-c843-46e0-ef1c-914da6feb49f", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "#Estabilidade\n", "x = np.array([1.8, 2.6, 3.2, 4.2, 4.4, 4.8, 5.2, 6.2 , 6.9, 8.6])\n", "y = np.array([0, 0, 1, 0, 1, 1, 1, 1, 1, 1])\n", "print('x = {}'.format(x))\n", "print('y = {}'.format(y))\n", "\n", "logr = LogisticRegression()\n", "logr.fit(x.reshape(-1, 1), y)\n", "\n", "y_pred_proba = logr.predict_proba(x.reshape(-1, 1))[:, 1].ravel()\n", "y_pred = logr.predict(x.reshape(-1, 1))\n", "print('ypred = {}'.format(y_pred))\n", "print('p(ypred) = {}'.format(np.round(y_pred_proba, 2)))\n", "\n", "print('Acurácia = {:0.3f}'.format(metrics.accuracy_score(y, y_pred)))\n", "print('Precisão = {:0.3f}'.format(metrics.precision_score(y, y_pred)))\n", "print('Revocação = {:0.3f}'.format(metrics.recall_score(y, y_pred)))\n", "\n", "gen = -(y*np.log(y_pred_proba)+(1.-y)*np.log(1-y_pred_proba))\n", "loss = 1./len(y)*np.sum(gen)\n", "\n", "print('Entropia cruzada = {:.4f}'.format(loss))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "x = [1.8 2.6 3.2 4.2 4.4 4.8 5.2 6.2 6.9 8.6]\n", "y = [0 0 1 0 1 1 1 1 1 1]\n", "ypred = [0 0 0 1 1 1 1 1 1 1]\n", "p(ypred) = [0.19 0.33 0.47 0.7 0.74 0.81 0.86 0.94 0.97 0.99]\n", "Acurácia = 0.800\n", "Precisão = 0.857\n", "Revocação = 0.857\n", "[0.20458617 0.40146754 0.75602354 1.20579133 0.30154437 0.21396552\n", " 0.14991103 0.05939226 0.03051931 0.0059205 ]\n", "Entropia cruzada = 0.3329\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "EcKKUxaOVOxV" }, "source": [ "### Exemplo 02\n", "\n", "O banco de dados de diabetes indiano Pima ([link aqui para download](https://www.kaggle.com/uciml/pima-indians-diabetes-database)), doado pelo *National Institute of Diabetes and Digestive and Kidney Diseases*, é uma coleção de relatórios de diagnóstico médico, incluindo informações (9 variáveis numéricas) sobre 768 pacientes do sexo feminino (com idades entre 21 e 81) de origem indígena (Pima, população nativa americana que vive perto de Phoenix, Arizona, EUA). O banco de dados inclui as seguintes informações:\n", "1. `Pregnancies`, número de gestações;\n", "2. `Glucose`, Glicose: concentração de glicose no plasma de 2 horas em um teste oral de tolerância à glicose;\n", "3. `BloodPressure`, Pressão sanguínea: pressão arterial diastólica $[mmHg]$;\n", "4. `SkinThickness`, Espessura da pele: espessura da dobra da pele do tríceps $[mm]$;\n", "5. `Insulin`, insulina sérica de 2 horas $\\left[\\frac{\\mu\\text{U}}{ml}\\right]$\n", "6. `BMI`, IMC: índice de massa corporal $\\left(\\frac{peso~[kg]}{altura^2~[m^2]}\\right)$\n", "7. `DiabetesPedigreeFunction`, Função de Linhagem de Diabetes.\n", "8. `Age`, Idade feminina $[anos]$\n", "9. `Outcome`, Resultado. Diabetes com início em 5 anos ($0 =$ Sem diabetes: verde, $1 =$ diabetico: vermelho).\n", "\n", "O objetivo é prever o diagnóstico de diabetes (# 9) usando os 8 recursos disponíveis (# 1- # 8).\n" ] }, { "cell_type": "code", "metadata": { "id": "PAdpiGvYqH3S", "outputId": "fbb89238-4232-415f-93fa-faf74b0cca6b", "colab": { "resources": { "http://localhost:8080/nbextensions/google.colab/files.js": { "data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCkgewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwogICAgICBwZXJjZW50LnRleHRDb250ZW50ID0KICAgICAgICAgIGAke01hdGgucm91bmQoKHBvc2l0aW9uIC8gZmlsZURhdGEuYnl0ZUxlbmd0aCkgKiAxMDApfSUgZG9uZWA7CiAgICB9CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK", "ok": true, "headers": [ [ "content-type", "application/javascript" ] ], "status": 200, "status_text": "" } }, "base_uri": "https://localhost:8080/", "height": 73 } }, "source": [ "from google.colab import files\n", "uploaded = files.upload()" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/html": [ "\n", " \n", " \n", " Upload widget is only available when the cell has been executed in the\n", " current browser session. Please rerun this cell to enable.\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } }, { "output_type": "stream", "text": [ "Saving diabetes.csv to diabetes.csv\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "q1AhzHizXmyX", "outputId": "e81dc69e-08af-40a3-dc6a-523643f79343", "colab": { "base_uri": "https://localhost:8080/", "height": 215 } }, "source": [ "diabetes = pd.read_csv('diabetes.csv')\n", "diabetes.head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "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", "
PregnanciesGlucoseBloodPressureSkinThicknessInsulinBMIDiabetesPedigreeFunctionAgeOutcome
061487235033.60.627501
11856629026.60.351310
28183640023.30.672321
318966239428.10.167210
40137403516843.12.288331
\n", "
" ], "text/plain": [ " Pregnancies Glucose BloodPressure ... DiabetesPedigreeFunction Age Outcome\n", "0 6 148 72 ... 0.627 50 1\n", "1 1 85 66 ... 0.351 31 0\n", "2 8 183 64 ... 0.672 32 1\n", "3 1 89 66 ... 0.167 21 0\n", "4 0 137 40 ... 2.288 33 1\n", "\n", "[5 rows x 9 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 5 } ] }, { "cell_type": "markdown", "metadata": { "id": "vFDbqpEXsXTb" }, "source": [ "O conjunto de dados de diabetes consiste em 768 dados, com 9 características cada. Destes 768 dados, 500 são rotulados como 0 (não tem diabetes) e 268 como 1 (tem diabetes)." ] }, { "cell_type": "code", "metadata": { "id": "ou0P1HkRrDab", "outputId": "fe23025e-cd06-4490-a737-ffb238b01c4e", "colab": { "base_uri": "https://localhost:8080/", "height": 434 } }, "source": [ "print('Dimensão do dataset: {}'.format(diabetes.shape))\n", "print(diabetes.groupby('Outcome').size())\n", "sn.countplot(diabetes['Outcome'],label='Count')" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Dimensão do dataset: (768, 9)\n", "Outcome\n", "0 500\n", "1 268\n", "dtype: int64\n" ], "name": "stdout" }, { "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/seaborn/_decorators.py:43: FutureWarning: Pass the following variable as a keyword arg: x. From version 0.12, the only valid positional argument will be `data`, and passing other arguments without an explicit keyword will result in an error or misinterpretation.\n", " FutureWarning\n" ], "name": "stderr" }, { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 6 }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYUAAAEGCAYAAACKB4k+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAPPklEQVR4nO3de6xlZXnH8e8PRsQbcplTijNDx9SxBqMinVCs/cNCa4G2DjVgNCojTjJNSo3Wpi01TW1NTbRVKWhDOimXgVAVr4zGtCWDl9aCelAcbrWMVGQmwIzc1Fpswad/7Pe8bOAAG5l19mHO95Ps7Hc9613rPGdyMr+sy147VYUkSQD7TLsBSdLiYShIkjpDQZLUGQqSpM5QkCR1y6bdwBOxfPnyWr169bTbkKQnlauuuup7VTUz37ondSisXr2a2dnZabchSU8qSW5+pHWePpIkdYaCJKkzFCRJnaEgSeoMBUlSZyhIkrpBQyHJd5Jck+TqJLOtdnCSy5Lc2N4PavUkOTvJ9iTbkhw1ZG+SpIdbiCOFX62qI6tqbVs+A9haVWuArW0Z4ARgTXttBM5ZgN4kSWOmcfpoHbC5jTcDJ43VL6yRK4EDkxw2hf4kacka+hPNBfxLkgL+vqo2AYdW1a1t/W3AoW28ArhlbNsdrXbrWI0kGxkdSXD44Yc/4QZ/8Y8ufML70N7nqr85ddotSFMxdCj8SlXtTPIzwGVJ/mN8ZVVVC4yJtWDZBLB27Vq/Nk6S9qBBTx9V1c72vgv4FHA0cPvcaaH2vqtN3wmsGtt8ZatJkhbIYKGQ5BlJnjU3Bl4JXAtsAda3aeuBS9t4C3BquwvpGOCesdNMkqQFMOTpo0OBTyWZ+zn/WFX/lORrwCVJNgA3A69p8z8HnAhsB34EnDZgb5KkeQwWClV1E/CSeep3AMfNUy/g9KH6kSQ9Nj/RLEnqDAVJUmcoSJI6Q0GS1BkKkqTOUJAkdYaCJKkzFCRJnaEgSeoMBUlSZyhIkjpDQZLUGQqSpM5QkCR1hoIkqTMUJEmdoSBJ6gwFSVJnKEiSOkNBktQZCpKkzlCQJHWGgiSpMxQkSZ2hIEnqDAVJUmcoSJI6Q0GS1BkKkqTOUJAkdYaCJKkzFCRJ3eChkGTfJN9I8tm2/NwkX0myPclHk+zX6k9ty9vb+tVD9yZJerCFOFJ4K3DD2PJ7gTOr6nnAXcCGVt8A3NXqZ7Z5kqQFNGgoJFkJ/CbwD205wLHAx9uUzcBJbbyuLdPWH9fmS5IWyNBHCn8L/DHwk7Z8CHB3Vd3XlncAK9p4BXALQFt/T5v/IEk2JplNMrt79+4he5ekJWewUEjyW8CuqrpqT+63qjZV1dqqWjszM7Mndy1JS96yAff9cuBVSU4E9gcOAM4CDkyyrB0NrAR2tvk7gVXAjiTLgGcDdwzYnyTpIQY7UqiqP62qlVW1GngtcHlVvR74PHBym7YeuLSNt7Rl2vrLq6qG6k+S9HDT+JzCnwBvT7Kd0TWDc1v9XOCQVn87cMYUepOkJW3I00ddVX0B+EIb3wQcPc+ce4FTFqIfSdL8/ESzJKkzFCRJnaEgSeoMBUlSZyhIkjpDQZLUGQqSpM5QkCR1hoIkqTMUJEmdoSBJ6gwFSVJnKEiSOkNBktQZCpKkzlCQJHWGgiSpMxQkSZ2hIEnqDAVJUmcoSJI6Q0GS1BkKkqTOUJAkdYaCJKkzFCRJnaEgSeoMBUlSZyhIkjpDQZLUGQqSpM5QkCR1g4VCkv2TfDXJN5Ncl+QvW/25Sb6SZHuSjybZr9Wf2pa3t/Wrh+pNkjS/IY8UfgwcW1UvAY4Ejk9yDPBe4Myqeh5wF7Chzd8A3NXqZ7Z5kqQFNFgo1MgP2+JT2quAY4GPt/pm4KQ2XteWaeuPS5Kh+pMkPdyg1xSS7JvkamAXcBnwbeDuqrqvTdkBrGjjFcAtAG39PcAhQ/YnSXqwQUOhqu6vqiOBlcDRwAue6D6TbEwym2R29+7dT7hHSdIDFuTuo6q6G/g88DLgwCTL2qqVwM423gmsAmjrnw3cMc++NlXV2qpaOzMzM3jvkrSUDHn30UySA9v4acCvAzcwCoeT27T1wKVtvKUt09ZfXlU1VH+SpIdb9thTfmqHAZuT7MsofC6pqs8muR74SJK/Ar4BnNvmnwtclGQ7cCfw2gF7kyTNY6JQSLK1qo57rNq4qtoGvHSe+k2Mri88tH4vcMok/UiShvGooZBkf+DpwPIkBwFzt4gewAN3DUmS9hKPdaTwu8DbgOcAV/FAKHwf+NCAfUmSpuBRQ6GqzgLOSvKWqvrgAvUkSZqSia4pVNUHk/wysHp8m6q6cKC+JElTMOmF5ouAnweuBu5v5QIMBUnai0x6S+pa4Ag/NyBJe7dJP7x2LfCzQzYiSZq+SY8UlgPXJ/kqo0diA1BVrxqkK0nSVEwaCn8xZBOSHu6773rRtFvQInT4n18z6P4nvfvoi4N2IUlaFCa9++gHjO42AtiP0Rfm/HdVHTBUY5KkhTfpkcKz5sbt29DWAccM1ZQkaToe96Oz29dsfhr4jQH6kSRN0aSnj149trgPo88t3DtIR5KkqZn07qPfHhvfB3yH0SkkSdJeZNJrCqcN3YgkafomuqaQZGWSTyXZ1V6fSLJy6OYkSQtr0gvN5zP6DuXntNdnWk2StBeZNBRmqur8qrqvvS4AZgbsS5I0BZOGwh1J3pBk3/Z6A3DHkI1JkhbepKHwZuA1wG3ArcDJwJsG6kmSNCWT3pL6LmB9Vd0FkORg4H2MwkKStJeY9EjhxXOBAFBVdwIvHaYlSdK0TBoK+yQ5aG6hHSlMepQhSXqSmPQ/9vcDVyT5WFs+BXj3MC1JkqZl0k80X5hkFji2lV5dVdcP15YkaRomPgXUQsAgkKS92ON+dLYkae9lKEiSOkNBktQZCpKkzlCQJHWGgiSpGywUkqxK8vkk1ye5LslbW/3gJJclubG9H9TqSXJ2ku1JtiU5aqjeJEnzG/JI4T7gD6vqCOAY4PQkRwBnAFurag2wtS0DnACsaa+NwDkD9iZJmsdgoVBVt1bV19v4B8ANwApgHbC5TdsMnNTG64ALa+RK4MAkhw3VnyTp4RbkmkKS1YyeqvoV4NCqurWtug04tI1XALeMbbaj1R66r41JZpPM7t69e7CeJWkpGjwUkjwT+ATwtqr6/vi6qiqgHs/+qmpTVa2tqrUzM34jqCTtSYOGQpKnMAqEi6vqk618+9xpofa+q9V3AqvGNl/ZapKkBTLk3UcBzgVuqKoPjK3aAqxv4/XApWP1U9tdSMcA94ydZpIkLYAhvyjn5cAbgWuSXN1q7wDeA1ySZANwM6Pvfgb4HHAisB34EXDagL1JkuYxWChU1b8BeYTVx80zv4DTh+pHkvTY/ESzJKkzFCRJnaEgSeoMBUlSZyhIkjpDQZLUGQqSpM5QkCR1hoIkqTMUJEmdoSBJ6gwFSVJnKEiSOkNBktQZCpKkzlCQJHWGgiSpMxQkSZ2hIEnqDAVJUmcoSJI6Q0GS1BkKkqTOUJAkdYaCJKkzFCRJnaEgSeoMBUlSZyhIkjpDQZLUGQqSpM5QkCR1g4VCkvOS7Epy7Vjt4CSXJbmxvR/U6klydpLtSbYlOWqoviRJj2zII4ULgOMfUjsD2FpVa4CtbRngBGBNe20EzhmwL0nSIxgsFKrqS8CdDymvAza38WbgpLH6hTVyJXBgksOG6k2SNL+FvqZwaFXd2sa3AYe28QrglrF5O1rtYZJsTDKbZHb37t3DdSpJS9DULjRXVQH1U2y3qarWVtXamZmZATqTpKVroUPh9rnTQu19V6vvBFaNzVvZapKkBbTQobAFWN/G64FLx+qntruQjgHuGTvNJElaIMuG2nGSDwOvAJYn2QG8E3gPcEmSDcDNwGva9M8BJwLbgR8Bpw3VlyTpkQ0WClX1ukdYddw8cws4faheJEmT8RPNkqTOUJAkdYaCJKkzFCRJnaEgSeoMBUlSZyhIkjpDQZLUGQqSpM5QkCR1hoIkqTMUJEmdoSBJ6gwFSVJnKEiSOkNBktQZCpKkzlCQJHWGgiSpMxQkSZ2hIEnqDAVJUmcoSJI6Q0GS1BkKkqTOUJAkdYaCJKkzFCRJnaEgSeoMBUlSZyhIkjpDQZLUGQqSpG5RhUKS45N8K8n2JGdMux9JWmoWTSgk2Rf4O+AE4AjgdUmOmG5XkrS0LJpQAI4GtlfVTVX1v8BHgHVT7kmSlpRl025gzArglrHlHcAvPXRSko3Axrb4wyTfWoDelorlwPem3cRikPetn3YLejD/Nue8M3tiLz/3SCsWUyhMpKo2AZum3cfeKMlsVa2ddh/SQ/m3uXAW0+mjncCqseWVrSZJWiCLKRS+BqxJ8twk+wGvBbZMuSdJWlIWzemjqrovye8D/wzsC5xXVddNua2lxtNyWqz821wgqapp9yBJWiQW0+kjSdKUGQqSpM5QkI8X0aKV5Lwku5JcO+1elgpDYYnz8SJa5C4Ajp92E0uJoSAfL6JFq6q+BNw57T6WEkNB8z1eZMWUepE0ZYaCJKkzFOTjRSR1hoJ8vIikzlBY4qrqPmDu8SI3AJf4eBEtFkk+DFwB/EKSHUk2TLunvZ2PuZAkdR4pSJI6Q0GS1BkKkqTOUJAkdYaCJKkzFLTkJVmZ5NIkNyb5dpKz2mc2Hm2bdyxUf9JCMhS0pCUJ8Eng01W1Bng+8Ezg3Y+xqaGgvZKhoKXuWODeqjofoKruB/4AeHOS30vyobmJST6b5BVJ3gM8LcnVSS5u605Nsi3JN5Nc1Gqrk1ze6luTHN7qFyQ5J8mVSW5q+zwvyQ1JLhj7ea9MckWSryf5WJJnLti/ipYsQ0FL3QuBq8YLVfV94LvAsvk2qKozgP+pqiOr6vVJXgj8GXBsVb0EeGub+kFgc1W9GLgYOHtsNwcBL2MUQFuAM1svL0pyZJLlbZ+/VlVHAbPA2/fELyw9mnn/6CU9LscCH6uq7wFU1dzz/18GvLqNLwL+emybz1RVJbkGuL2qrgFIch2wmtGDCY8Avjw6w8V+jB73IA3KUNBSdz1w8nghyQHA4cDdPPhoev89+HN/3N5/MjaeW14G3A9cVlWv24M/U3pMnj7SUrcVeHqSU6F/Pen7GX0N5E3AkUn2SbKK0bfUzfm/JE9p48uBU5Ic0vZxcKv/O6OnzgK8HvjXx9HXlcDLkzyv7fMZSZ7/eH856fEyFLSk1eiJkL/D6D/1G4H/BO5ldHfRl4H/YnQ0cTbw9bFNNwHbklzcnir7buCLSb4JfKDNeQtwWpJtwBt54FrDJH3tBt4EfLhtfwXwgp/295Qm5VNSJUmdRwqSpM5QkCR1hoIkqTMUJEmdoSBJ6gwFSVJnKEiSuv8HHGGod29RL/oAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "s7-8_oVts9AR", "outputId": "89cc85e2-e7d5-4b08-d1bc-335328c62aba", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "diabetes.info()" ], "execution_count": null, "outputs": [ { "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 Pregnancies 768 non-null int64 \n", " 1 Glucose 768 non-null int64 \n", " 2 BloodPressure 768 non-null int64 \n", " 3 SkinThickness 768 non-null int64 \n", " 4 Insulin 768 non-null int64 \n", " 5 BMI 768 non-null float64\n", " 6 DiabetesPedigreeFunction 768 non-null float64\n", " 7 Age 768 non-null int64 \n", " 8 Outcome 768 non-null int64 \n", "dtypes: float64(2), int64(7)\n", "memory usage: 54.1 KB\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "AzDg73UKxx73", "outputId": "684eaf63-df92-4091-d30d-d4df85cd3506", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "pd.set_option('display.expand_frame_repr', False)\n", "print(diabetes.describe())" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ " Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome\n", "count 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000\n", "mean 3.845052 120.894531 69.105469 20.536458 79.799479 31.992578 0.471876 33.240885 0.348958\n", "std 3.369578 31.972618 19.355807 15.952218 115.244002 7.884160 0.331329 11.760232 0.476951\n", "min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.078000 21.000000 0.000000\n", "25% 1.000000 99.000000 62.000000 0.000000 0.000000 27.300000 0.243750 24.000000 0.000000\n", "50% 3.000000 117.000000 72.000000 23.000000 30.500000 32.000000 0.372500 29.000000 0.000000\n", "75% 6.000000 140.250000 80.000000 32.000000 127.250000 36.600000 0.626250 41.000000 1.000000\n", "max 17.000000 199.000000 122.000000 99.000000 846.000000 67.100000 2.420000 81.000000 1.000000\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "R9B8FiPiyxL3" }, "source": [ "A partir da ajuda de saída anterior, podemos deduzir que não há valores ausentes (todas as colunas incluem o valor 768). No entanto, notamos alguns valores irrealistas (parece que alguém substituiu os valores ausentes por zeros). Por exemplo: um `BMI` = 0 significa que a pessoa tem uma altura infinita ou um peso zero, o que não é fisicamente possível.\n", "\n", "Esses erros são resumidos a seguir:\n", "\n", "* 5 pacientes com glicose de 0.\n", "\n", "* 11 pacientes com índice de massa corporal de 0.\n", "\n", "* 35 pacientes com pressão arterial diastólica de 0.\n", "\n", "* 227 pacientes com leituras de espessura de dobras cutâneas de 0.\n", "\n", "* 374 pacientes com níveis séricos de insulina de 0.\n", "\n", "Idealmente, poderíamos substituir esses valores 0 pelo valor médio desse recurso, mas vamos pular isso por enquanto." ] }, { "cell_type": "code", "metadata": { "id": "KHmhOA1XYbMI" }, "source": [ "y = diabetes.Outcome.values\n", "x = diabetes.drop(['Outcome'], axis=1)\n", "x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2,random_state=0)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "nctGr6Uf2cka", "outputId": "4b3a8b02-5fd1-418f-d381-da0e5bc19f6b", "colab": { "base_uri": "https://localhost:8080/", "height": 195 } }, "source": [ "x.head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "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", "
PregnanciesGlucoseBloodPressureSkinThicknessInsulinBMIDiabetesPedigreeFunctionAge
061487235033.60.62750
11856629026.60.35131
28183640023.30.67232
318966239428.10.16721
40137403516843.12.28833
\n", "
" ], "text/plain": [ " Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age\n", "0 6 148 72 35 0 33.6 0.627 50\n", "1 1 85 66 29 0 26.6 0.351 31\n", "2 8 183 64 0 0 23.3 0.672 32\n", "3 1 89 66 23 94 28.1 0.167 21\n", "4 0 137 40 35 168 43.1 2.288 33" ] }, "metadata": { "tags": [] }, "execution_count": 10 } ] }, { "cell_type": "code", "metadata": { "id": "sg-vDsjF2jVk", "outputId": "056a6c13-2de8-4f31-98cb-863e2bc79a43", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "print(\"x train: \",x_train.shape)\n", "print(\"x test: \",x_test.shape)\n", "print(\"y train: \",y_train.shape)\n", "print(\"y test: \",y_test.shape)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "x train: (614, 8)\n", "x test: (154, 8)\n", "y train: (614,)\n", "y test: (154,)\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "59lZaJ9ceTLc", "outputId": "02d5776e-9cc5-4cd8-ccb6-efdd7b94d2b0", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "logreg = LogisticRegression(max_iter=1000)\n", "logreg.fit(x_train,y_train)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, l1_ratio=None, max_iter=1000,\n", " multi_class='auto', n_jobs=None, penalty='l2',\n", " random_state=None, solver='lbfgs', tol=0.0001, verbose=0,\n", " warm_start=False)" ] }, "metadata": { "tags": [] }, "execution_count": 28 } ] }, { "cell_type": "code", "metadata": { "id": "QLamMYg43bNK" }, "source": [ "y_pred=logreg.predict(x_test)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "b8p0YBiRgkb1" }, "source": [ "### Métricas\n", "\n", "#### Matriz de confusão\n", "\n", "*Matriz de confusão* é uma medida de desempenho para o problema de classificação de aprendizado de máquina em que a saída pode ser duas ou mais classes. É uma tabela com 4 combinações diferentes de valores previstos e reais.\n", "\n", "\n", "|$\\downarrow$Prediction/Target $\\rightarrow$ | Positivo (1) |Negativo (0)| \n", "|:-----|:----|:------|\n", "|**Positivo (1)** |VP |FP |\n", "|**Negativo (0)** |FN |VN |\n", "\n", "Onde VP = verdadeiro positivo, FP = falso positivo, FN = falso negativo e VN = verdadeiro negativo. Veja que:\n", "* **Falsos negativos** e **falsos positivos** são exemplos classificados **incorretamente**.\n", "* **Verdadeiros negativos** e **verdadeiros positivos** são exemplos classificados **corretamente**.\n", "\n", "A partir dos erros e acertos mostrados na tabela pode-se definir o que é *acurácia* (accuracy, em inglês), *precisão* (*precision*, em inglês) e *revocação* ou *sensibilidade* (*recall*, ou *sensitivity* em inglês).\n", "Note que as previsões corretas são somente as VP e VN.\n", "\n", "#### Acurácia\n", "\n", "Acurácia indica uma performance geral do modelo. Dentre todas as classificações, quantas o modelo classificou corretamente. Sua fórmula é,\n", "$$\n", "A = \\frac{VP+VN}{VP+VN+FP+FN}\n", "$$\n", "\n", "#### Precisão\n", "\n", "Precisão é a fração dos resultados, entre os positivos detectados, que de fato são positivos.\n", "\n", "A precisão é calculada de acordo com a seguinte equação:\n", "$$\n", "P = \\frac{VP}{VP+FP}\n", "$$\n", "\n", "#### Revocação ou sensibilidade\n", "\n", "Revocação é a fração de positivos detectados dentre todos os positivos.\n", "\n", "$$\n", "R = \\frac{VP}{VP+FN}\n", "$$\n", "\n", "Precisão é a relação entre a fração de previstos como sendo $y = 1$, que de fato pertencem à classe $y = 1$, em relação ao número total de previstos com pertencendo à classe $y = 1$.\n", "\n", "Revocação é a relação entre o número total de previstos como pertencendo à classe $y = 1$, em relação ao número total de elementos que realmente pertencem a essa classe.\n", "\n", "O desejado em um problema de classificação binária é ter ambos precisão e revocação altas e iguais a 1, mas isso nem sempre é possível. Porque?\n", "\n", "**Porque existe um compromisso entre precisão e revocação.**\n", "\n", "Como visto, a saída de uma regressão logística em um problema de classificação binária é uma probabilidade, ié, um valor real entre 0 e 1 para cada caso analisado, que representa a probabilidade do caso pertencer a uma das classes.\n", "\n", "Também como já vimos, dado $0<\\hat{y}<1$, devemos decidir em qual classe esse caso pertence, ou seja:\n", "* Casos são previstos como sendo da classe $y = 1$, se $\\hat{y}\\ge limiar$;\n", "*Casos são previstos como sendo da classe $y = 0$, se $\\hat{y} < limiar$\n", "\n", "Dependendo do valor do limar utilizado teremos resultados diferentes para a precisão e a revocação. Portanto, existe um compromisso entre precisão e revocação que depende do que queremos e em função disso podemos escolher o valor do limiar.\n", "\n", "Por exemplo, se optamos por $limiar = 0.7$ teremos uma precisão maior, mas também teremos uma revocação menor. Por outro lado, um $limiar = 0.3$ teremos maior segurança na previsão, ou seja, teremos uma revocação alta, mas\n", "uma precisão baixa.\n", "\n", "__Concluindo:__\n", "* Quanto maior o limiar, maior a precisão e menor a revocação;\n", "* Quanto menor o limiar, maior a revocação e menor a precisão.\n", "\n", "#### Pontuação $F1$ (*$F1$ score*)\n", "\n", "Uma métrica melhor, que combina a precisão com a revocação é a pontuação $F1$. É a média harmônica entre precisão e revocação. \n", "\n", "A pontuação $F1$ é definida por:\n", "$$\n", "F1 = \\frac{2PR}{P+R}\n", "$$\n", "\n", "Observa-se que:\n", "* para a pontuação $F1$ ser alta, tanto a precisão quanto a revocação devem ser altas;\n", "* $F1 =1$ somente se $P$ e $R$ forem ambos iguais a $1$.\n", "* se $P$ ou $R$ for igual a $0$, então, $F1$ é igual a $0$.\n", "* pontuação $F1$ é uma forma de comparar precisão e revocação.\n", "\n", "Desse modo, a Pontuação $F1$ é a melhor métrica para problemas de classificação onde o número de exemplos de uma classe é desbalanceado.\n", "\n", "O Keras do TensorFlow não possui a métrica pontuação $F1$, mas ela pode ser facilmente calculada tendo a precisão e a revocação.\n", "\n", "### Curva ROC\n", "\n", "A Curva Característica de Operação do Receptor (Curva COR), ou, do inglês, *Receiver Operating Characteristic (ROC)* é uma curva de probabilidade. \n", "\n", "Ela é criada traçando a taxa de verdadeiros positivos (revocação) em função da taxa de falsos positivos para diferentes limites de classificação. Ou seja, número de vezes que o classificador acertou a predição contra o número de vezes que o classificador errou a predição.\n", "\n", "A taxa de falsos positivos é dada por,\n", "$$\n", "FPR = \\frac{FP}{FP+VN}\n", "$$\n", "\n", "A taxa de falsos positivos (FPR) também é conhecida como probabilidade de alarme falso (fall-out or probability of false alarm) e pode ser calculada como o complementar da taxa de verdadeiros negativos (VNR), ié, $(1 — VNR)$. VNR também é congecida como *especificidade* (*specificity* e inglês).\n", "\n", "Para simplificar a curva ROC, foi criada a AUC (*Area Under the Curve*). A AUC resume a curva ROC num único valor, calculando a *área sob a curva*.\n", "\n", "Quanto maior o AUC, melhor o modelo está em prever 0s como 0s e 1s como 1s. A pontuação $AUC = 1$ representa o classificador perfeito e $AUC = 0.5$ representa um classificador sem valor.\n", "\n", "Um modelo excelente tem AUC próximo de $1$, o que significa que tem uma boa medida de distinção das classes. Um modelo pobre tem AUC próximo de $0$, o que significa que tem a pior medida de separabilidade. Na verdade, significa que está retribuindo o resultado. Ele está prevendo 0s como 1s e 1s como 0s. E quando AUC é 0.5, significa que o modelo não tem valor nenhum, ié, não tem capacidade de separação de classes melhor que a aleatoriedade.\n" ] }, { "cell_type": "code", "metadata": { "id": "3LcTWHrBeeqy", "outputId": "c3479346-108c-4d74-8e85-b3ff4d1dd343", "colab": { "base_uri": "https://localhost:8080/", "height": 296 } }, "source": [ "confusion_matrix = pd.crosstab(y_test, y_pred, rownames=['Target'], colnames=['Predicted'])\n", "sn.heatmap(confusion_matrix, cmap=\"YlGnBu\" , annot=True)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 32 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "DCWoDe8-e0m7", "outputId": "8207e700-b617-4e43-b433-264156a03850", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "print('Acurácia : {:0.3f}'.format(metrics.accuracy_score(y_test, y_pred)))\n", "print('Precisão : {:0.3f}'.format(metrics.precision_score(y_test, y_pred)))\n", "print('Revocação: {:0.3f}'.format(metrics.recall_score(y_test, y_pred)))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Acurácia : 0.825\n", "Precisão : 0.763\n", "Revocação: 0.617\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "vTq5XRP1gqKV", "outputId": "e180423f-3d46-4b2e-f93c-e269fc978add", "colab": { "base_uri": "https://localhost:8080/", "height": 295 } }, "source": [ "y_pred_proba = logreg.predict_proba(x_test)[::,1]\n", "fpr, tpr, _ = metrics.roc_curve(y_test, y_pred_proba)\n", "auc = metrics.roc_auc_score(y_test, y_pred_proba)\n", "\n", "plt.plot(fpr, tpr, label='Regressão logística (area = {:0.3f}'.format(auc))\n", "plt.plot([0, 1], [0, 1],'r--')\n", "plt.xlim([0.0, 1.0])\n", "plt.ylim([0.0, 1.05])\n", "plt.xlabel('Taxa de Falsos Positivos')\n", "plt.ylabel('Taxa de Verdadeiros Positivos')\n", "plt.title('Curva ROC')\n", "plt.legend(loc=\"lower right\")\n", "plt.savefig('Log_ROC')\n", "plt.show()" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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RA4dOhR0KMbkeAULFqRcuXLky5cvy85pieJUqMKYMa70sGcP9O0LT/lZosOcisTERIoUKUJ8fDxinQGMSZeqsmvXLhITE6lYsWKWndfaKE7FZ5+5NSKqVIElS+DFF+HMDJfoMKfo0KFDxMXFWZIwJgMiQlxcXJaXvi1R+PXnn/Dtt+5x8+YwdaprtK5RI9i4cglLEsb4E4m/FUsUfnz+uUsIzZrB7t1uLESLFjaBnzEmV7BvunC2bHHjIZo3d43U06dDsWJBR2VMjrF7926GDx8edBgmwixRpGf7dqhWDT75BAYOhKVL4W9/CzoqE5C8efNSu3ZtatSowS233MLu3buDDum43377jWuvvZamTZvyVCY7VYwZM4bu3buf8nv37NmTGulUv+7evZs333zz+PbWrVtp3br1Kb9XqCFDhvD+++9nybkiYePGjTRo0IDKlStz5513cuTIkZOOSUpKon379lxyySVUrVqVF1544fhzu3fvpnXr1lSpUoWqVavy/fff/+W1r776KiLCzp07I/5ZwBLFybZscfelS8OAAbBiBTz5JOTPH2xcJlCFChUiISGBFStWUKJECYYNG3ba50xOTs6CyOCcc85h1qxZzJgxgwEDBmTJOf347bffaN26NVdffXWaz6dOFOeddx6TJ08+7fdNTk7mnXfeoW3btpl6TXbq27cvvXv3Zt26dRQvXpy33377pGMmTZrE4cOHWb58OYsWLWLkyJFs2rQJgF69etG0aVN+/PFHli5dStWqVY+/7pdffmHmzJlUqFAhuz6OdY89bs8e6NcPRo6EefPc9N89ewYdlUnl2ekrWbV1b5aes9p5RXnmluq+j7/iiitYtmwZAOvXr6dbt27s2LGDwoULM3r0aKpUqcL69etp164dBw4coGXLlgwZMoT9+/cze/ZsnnrqKYoXL86PP/7I6tWreeyxx5g9ezaHDx+mW7dudO3alW3btnHnnXeyd+9ekpOTGT58OFdeeSWdOnVi4cKFiAj33XcfvXv3ZvTo0YwaNYojR45QuXJlxo4dS+HChdm0aRP33XcfO3fupFSpUrz77rthv1zSOz69z3Lw4EGeeOIJWrRowcqVK+nYsSNHjhzh2LFjTJkyhaeeeor169dTu3ZtGjduTLdu3bj55ptZsWIFR48epW/fvsyYMYM8efLQuXNnevTowXPPPcf06dM5ePAgV155JSNHjjypcfabb76hbt26nHGG+/pK7/N36NCBggULsmTJEq666iq6deuW5r/V9OnTGThwIEeOHCEuLo5x48ZxzjnnnML/JEdV+eabbxg/fjwA7du3p3///jz44IN/OU5EOHDgAMnJyRw8eJD8+fNTtGhR9uzZw9y5cxkzZgwA+fPnJ3/ID9XevXszaNAgWrZsecoxZpaVKFTho4/cBH7DhsEDD0ClSkFHZXKoo0eP8vXXX9OiRQsAunTpwuuvv86iRYt45ZVXeOihhwD3i7BXr14sX76ccqkGYC5evJjXXnuNtWvX8vbbb3P22WezYMECFixYwOjRo9m4cSPjx4+nSZMmJCQksHTpUmrXrk1CQgJbtmxhxYoVLF++nI4dOwJw2223sWDBguO/PFN+vfbo0YP27duzbNky2rVrR88Mfvikd3y4z5JixIgR9OrVi4SEBBYuXEi5cuV48cUXqVSpEgkJCbz88st/OX7UqFFs2rSJhISE4+8H0L17dxYsWMCKFSs4ePAgn3zyyUnv9e2333LppZce307v84Mbg/Pdd98xePDgdP+tGjZsyLx581iyZAl33XUXgwYNOuk916xZQ+3atdO8pa6G3LVrF8WKFTueyMqVK8eWlJqKEK1bt+bMM8+kTJkyVKhQgUceeYQSJUqwceNGSpUqRceOHalTpw73338/Bw4cAGDq1KmULVuWWrVqpfnvEDGqGlW3Sy+9VFO7Y8R3eseI707an6Fjx1RvvVUVVOvWVV2wIPPnMBG3atWqoEPQPHnyaK1atbRkyZJ69dVXa3Jysu7bt08LFiyotWrVOn6rUqWKqqqWKFFCk5KSVFV1z549euaZZ6qq6qxZs7RRo0bHz9uqVSu98MILj78+Pj5ev/jiC50zZ45WqlRJn3nmGV2yZImqqv7+++96wQUXaPfu3fXzzz/Xo0ePqqrq7NmztWHDhlqjRg2Nj4/Xrl27qqpqXFycHjlyRFVVjxw5onFxcSd9rnfffVe7desW9vj0PsvGjRu1evXqqqo6btw4rVatmr744ou6du3ak55PvX3bbbfpzJkzT4pn8uTJWr9+fa1Ro4aed955+sILL5x0TOfOnfXDDz88vp3e52/fvr2OGTNGVTXsv9WyZcu0cePGWqNGDb3ooou0SZMmJ71nZuzYsUMrVap0fHvz5s1/uQ4p/ve//2nbtm31yJEj+ttvv+lFF12k69ev1wULFmjevHl13rx5qqras2dP7devnx44cEDr16+vu3fvVlXV888/X3fs2JFmDGn9zQAL9RS/d3NniSIpyd2LQMOGbirwH36AevWCjcvkWCltFD///DOqyrBhwzh27BjFihUjISHh+G316tUZnuvMkMGZqsrrr79+/PUbN27kxhtv5JprrmHu3LmULVuWDh068P7771O8eHGWLl1Ko0aNGDFiBPfffz8AHTp04I033mD58uU888wzgUx10rZtW6ZNm0ahQoVo3rw533zzTabPcejQIR566CEmT57M8uXL6dy5c5qfpVChQn/ZH+7zp1zrcP9WPXr0oHv37ixfvpyRI0em+Z6ZKVHExcWxe/fu4+0iiYmJlC1b9qRzjh8/nqZNm5IvXz5Kly7NVVdddbw0Vq5cORp4E4q2bt2axYsXs379ejZu3EitWrWIj48nMTGRunXr8uuvv2b2Umda7ksUs2dDzZpuwBzAww9Djx6QN2+gYZnoULhwYYYOHcqrr75K4cKFqVixIpMmTQLcl/7SpUsBuPzyy5kyZQoAEyZMSPd8TZo0Yfjw4SR5P17Wrl3LgQMH+PnnnznnnHPo3Lkz999/P4sXL2bnzp0cO3aMVq1aMXDgQBYvXgzAvn37KFOmDElJSYwbN+74ua+88srj7z1u3Lh0G50zOt7PZ9mwYQMXXHABPXv2pGXLlixbtowiRYqwb9++NI9v3LgxI0eOPP5l+vvvvx//gi5ZsiT79+9Pt+G7atWqrFu37vh2ep8/VNGiRdP9t9qzZ8/xL/L33nsvzddffPHFf0kyobdiqbrMiwjXXnvt8fjfe++9NNsTKlSocDyhHjhwgHnz5lGlShXOPfdcypcvz5o1awD4+uuvqVatGpdccgnbt29n06ZNbNq0iXLlyrF48WLOPffcNGPOSrknUezYAe3bw7XXupleixQJOiITperUqUPNmjX58MMPGTduHG+//Ta1atWievXqTPV+gAwZMoTBgwdTs2ZN1q1bx9lnn53mue6//36qVatG3bp1qVGjBl27diU5OZnZs2dTq1Yt6tSpw8SJE+nVqxdbtmyhUaNG1K5dm7vvvvt4d8oBAwbQoEEDrrrqKqpUqXL83K+//jrvvvsuNWvWZOzYsbz22mthP1d6x/v5LB999BE1atSgdu3arFixgnvvvZe4uDiuuuoqatSowaOPPnrS565QoQI1a9akVq1ajB8/nmLFitG5c2dq1KhBkyZNuOyyy9KMs1mzZsydO/f4dnqfP7X0/q369+/P7bffzqWXXkrJkiXDXiO/XnrpJQYPHkzlypXZtWsXnTp1AmDatGk8/fTTAHTr1o39+/dTvXp1LrvsMjp27EjNmjUB92/Rrl07atasSUJCAk888USWxHWqxFVdRY8S51fVxk+885d9q7btpVqZokzsekXaL/rwQ+jWDfbvdxP5PfkkFC6cDdGarLB69eq/dA+MBn/++SeFChVCRJgwYQIffvjh8S+maJMTP8vf//53Bg0axIW2rHCa0vqbEZFFqnpK9etR1z32YNLRk/ZVK1OUlrVPrgM8LjnZTcExYoQbRGdMhC1atIju3bujqhQrVox33nkn4xflUDnxs7z44ots27bNEkU2icoSxe8/Z9BgeOCAGyxXoQI89JDrAgu2XnWUisYShTFByuoSRey1UXzyCVSvDi+9BGvXun0iliSiXLT9oDEmKJH4W4mdRJGYCLfdBrfc4taGmDsXhgwJOiqTBQoWLMiuXbssWRiTAfUWLipYsGCWnjfq2ijStWEDfPEFvPAC9OljczPFkHLlypGYmMiOHTuCDsWYHC9lKdSsFN2J4ocf4PvvoVcvuOYa2LwZ4uKCjspksXz58mXpso7GmMyJaNWTiDQVkTUisk5EHkvj+QIiMtF7fr6IxPs68e7drpH68sth8GDXeA2WJIwxJgIilihEJC8wDGgGVAPaiEjqvqmdgD9UtTLwL+CljM571p973FrVI0e62V2XL7f1qo0xJoIiWaKoD6xT1Q2qegSYAKQex94SSBkzPxm4XjJY8LXUzl+hfHlYsMA1VhctmuWBG2OMOSGSbRRlgV9CthOBBukdo6rJIrIHiAP+smyTiHQBunibh2XhwhWETDOci5Uk1bXKxexanGDX4gS7FidcfKovjIrGbFUdBYwCEJGFpzpoJNbYtTjBrsUJdi1OsGtxgogsPNXXRrLqaQtQPmS7nLcvzWNE5AzgbGBXBGMyxhiTSZFMFAuAC0WkoojkB+4CpqU6ZhrQ3nvcGvhGbVSVMcbkKBGrevLaHLoDXwB5gXdUdaWIPIdbaWka8DYwVkTWAb/jkklGRkUq5ihk1+IEuxYn2LU4wa7FCad8LaJuUkBjjDHZK3bmejLGGBMRliiMMcaElWMTRcSm/4hCPq5FHxFZJSLLRORrETk/iDizQ0bXIuS4ViKiIhKzXSP9XAsRucP7v7FSRMZnd4zZxcffSAURmSUiS7y/k+ZBxBlpIvKOiGwXkRXpPC8iMtS7TstEpK6vE6tqjrvhGr/XAxcA+YGlQLVUxzwEjPAe3wVMDDruAK/FtUBh7/GDuflaeMcVAeYC84B6Qccd4P+LC4ElQHFvu3TQcQd4LUYBD3qPqwGbgo47QtfiGqAusCKd55sDnwMCXA7M93PenFqiiMj0H1Eqw2uhqrNU9U9vcx5uzEos8vP/AmAAbt6wQ9kZXDbzcy06A8NU9Q8AVd2ezTFmFz/XQoGU+X7OBrZmY3zZRlXn4nqQpqcl8L4684BiIlImo/Pm1ESR1vQfqRfF/sv0H0DK9B+xxs+1CNUJ94shFmV4LbyidHlV/TQ7AwuAn/8XFwEXici3IjJPRJpmW3TZy8+16A/cLSKJwGdAj+wJLcfJ7PcJECVTeBh/RORuoB7wt6BjCYKI5AEGAx0CDiWnOANX/dQIV8qcKyKXqOruQKMKRhtgjKq+KiJX4MZv1VDVY0EHFg1yaonCpv84wc+1QERuAJ4EWqjq4WyKLbtldC2KADWA2SKyCVcHOy1GG7T9/L9IBKapapKqbgTW4hJHrPFzLToBHwGo6vdAQdyEgbmNr++T1HJqorDpP07I8FqISB1gJC5JxGo9NGRwLVR1j6qWVNV4VY3Htde0UNVTngwtB/PzN/IfXGkCESmJq4rakJ1BZhM/12IzcD2AiFTFJYrcuLbuNOBer/fT5cAeVd2W0YtyZNWTRm76j6jj81q8DJwFTPLa8zeraovAgo4Qn9ciV/B5Lb4AbhSRVcBR4FFVjblSt89r8TAwWkR64xq2O8TiD0sR+RD346Ck1x7zDJAPQFVH4NpnmgPrgD+Bjr7OG4PXyhhjTBbKqVVPxhhjcghLFMYYY8KyRGGMMSYsSxTGGGPCskRhjDEmLEsUJqJEJE5EErzbryKyJWQ7fwTfd5M3dsDv8bO92UdTYmudwbFZPohPRBqJyB7v/VeLyDOncI4WKbOnisitIlIt5LnnvIGZxmRKjhxHYWKH12+/NoCI9Af2q+orgQaVvnY5YHDef1X1ZhE5E0gQkemqutjvi70xAynjSW4FPgFWec89neXRmlzBShQm24lIZxFZICJLRWSKiBT29k8VkXu9x11FZFy441OdM05EZnrrLryFm0Y55bm7ReQH75f6SBHJ6zPO4SKy0Dvns2k8n1dExojIChFZ7g3mQkRqe5PwLRORj0WkuLe/p5xYN2RCuPdW1QPAIqByZs4nIh1E5A0RuRJoAbzsfe5KXqytxa3dMCnkczQSkU+8x228z7JCRF4K9zlNLhL0/Ol2yz033AyejwBxIfsGAj28x+fgRoxejZuXqIS3P83jU517KPC09/gm3OjbkkBVYDqQz3vuTeDeNF4/G1gDJHi3uJD3z+s9XzPk2HrApcCXIeco5t0vA/7mPX4OGOI93goUCD02VQyNgE9SPjOwCaiemfPhJkR8w3s8Bmgdcv4xuOluzsBNaXGmt384cDdwnre/lHfMN7hSSZqf026552YlChOEGiLyXxFZDrTDfRmiqr8BTwOzgIdV9fdwx6dyDfCBd55PgT+8/dfjvugWiEiCt31BOnG1U9Xa3m0XcIeILMYt/lMdt+BNqA3ABSLyurgpvPeKyNm4L9I53jHvebGB+8IfJ26W3+R0YrhaRJYAM4EXcRP7nc75TqJuWv4ZwC3iJtS8CZgKXAbMVtUd3jHjvPc66XP6fS8TGyxRmCCMAbqr6iXAs7gJ2lJcgpsF+Dyfx2dEgPdCEsDFqto/wxeJVMSVfq5X1ZrAp6nfV92CQLVwJYwHgLcyOO1NwDDcCmQLvC/p1P6rqnVU9VJ1c/Oc7vnSMwG4A7gONx/SvvQOPIXPaWKMJQoThCLANhHJhyshACAi9YFmQB3gEe/LOt3jU5kLtPXO0wwo7u3/GmgtIqW950qIvzXFiwIHgD0ico4X1194varyqOoUoB9QV1X3AH+IyNXeYfcAc8StlVFeVWcBfXHT4p+VURCneb59uGuXljm4BNMZlzQAfgD+JiIlvXacNt57nfQ5M4rbxBbr9WSC8BQwHzfN83ygiIgUAEYDHVV1q4g8DLwjIteldXwa53wW+FBEVgLf4eraUdVVItIPmOl9uSYB3YCfwwWoqku9KqAfcSuCfZvGYWWBd73zAjzu3bcHRniN7htwM3TmBT7wqqYEGKr+FxDyfT7562rAE3AzpvbEtU2Efr6jXgN2B+/8qOo2cV1rZ3nn/FRVp4pIrXQ+p8klbPZYY4wxYVnVkzHGmLAsURhjjAnLEoUxxpiwLFEYY4wJyxKFMcaYsCxRGGOMCcsShTHGmLD+HwBvyOOOnPC4AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "D2Gr0ibijujt" }, "source": [ "A linha pontilhada vermelha representa a curva ROC de um classificador puramente aleatório; um bom classificador fica o mais longe possível dessa linha (em direção ao canto superior esquerdo)." ] }, { "cell_type": "markdown", "metadata": { "id": "XSvF4woo0InX" }, "source": [ "## Regressão logística multinomial\n", "\n", "A regressão Softmax (ou regressão logística multinomial) é uma generalização da regressão logística para o caso em que queremos lidar com várias classes. Na regressão logística assumimos que os rótulos eram binários: $y^{(i)} \\in \\{0,1\\}$. A regressão Softmax nos permite lidar com $y^{(i)} \\in \\{1,\\ldots,K\\}$ onde $K$ é o número de classes.\n", "\n", "Nesse caso, faz-se uma modificação da regressão logística usando a *função softmax* em vez da *função sigmóide*, a função de perda de entropia cruzada.\n", "\n", "### Softmax\n", "\n", "Dado uma entrada de teste $\\mathbf{x}$, queremos que nossa hipótese estime a probabilidade de que $P(y=k | \\mathbf{x})$ para cada valor de $k = 1, \\cdots, K$. Ou seja, queremos estimar a probabilidade do rótulo de classe assumir cada um dos $K$ diferentes valores possíveis. Assim, nossa hipótese produzirá um vetor K-dimensional (cujos elementos somam 1) dando-nos nossas $K$ probabilidades estimadas. Concretamente, nossa hipótese $h_{\\omega}(\\mathbf{x})$ assume a forma:\n", "\n", "\\begin{align}\n", "h_\\omega(\\mathbf{x}) =\n", "\\begin{bmatrix}\n", "P(y = 1 | \\mathbf{x}; \\boldsymbol\\omega) \\\\\n", "P(y = 2 | \\mathbf{x}; \\boldsymbol\\omega) \\\\\n", "\\vdots \\\\\n", "P(y = K | \\mathbf{x}; \\boldsymbol\\omega)\n", "\\end{bmatrix}\n", "=\n", "\\frac{1}{ \\sum_{j=1}^{K}{\\exp(\\boldsymbol\\omega^{(j)\\top} \\mathbf{x}) }}\n", "\\begin{bmatrix}\n", "\\exp(\\boldsymbol\\omega^{(1)\\top} \\mathbf{x} ) \\\\\n", "\\exp(\\boldsymbol\\omega^{(2)\\top} \\mathbf{x} ) \\\\\n", "\\vdots \\\\\n", "\\exp(\\boldsymbol\\omega^{(K)\\top} \\mathbf{x} ) \\\\\n", "\\end{bmatrix}\n", "\\end{align}\n", "\n", "Aqui $\\boldsymbol\\omega^{(1)}, \\boldsymbol\\omega^{(2)}, \\ldots, \\boldsymbol\\omega^{(K)} \\in \\Re^{n}$ são os parâmetros do nosso modelo. Observe que o termo $\\frac{1}{ \\sum_{j=1}^{K}{\\exp(\\boldsymbol\\omega^{(j)\\top} \\mathbf{x}) } }$ normaliza a distribuição, de modo que soma um.\n", "\n", "Por conveniência, também escreveremos $\\boldsymbol\\omega$ para denotar todos os parâmetros do nosso modelo. Quando você implementa a regressão softmax, geralmente é conveniente representar $\\boldsymbol\\omega$ como uma matriz n por K obtida pela concatenação de $$\\boldsymbol\\omega^{(1)}, \\boldsymbol\\omega^{(2)}, \\ldots, \\boldsymbol\\omega^{(K)} $ em colunas, de modo que\n", "\n", "$$\n", "\\boldsymbol\\omega = \\left[\\begin{array}{cccc}| & | & | & | \\\\\n", "\\boldsymbol\\omega^{(1)} & \\boldsymbol\\omega^{(2)} & \\cdots & \\boldsymbol\\omega^{(K)}\\\\\n", "| & | & | & |\n", "\\end{array}\\right].\n", "$$\n", "\n", "### Função de Custo\n", "\n", "A função de custo utilizada para a regressão softmax é dada por,\n", "\\begin{align}\n", "J(\\boldsymbol\\omega) = - \\left[ \\sum_{i=1}^{m} \\sum_{k=1}^{K} 1\\left\\{y^{(i)} = k\\right\\} \\log \\frac{\\exp(\\boldsymbol\\omega^{(k)\\top} \\mathbf{x}^{(i)})}{\\sum_{j=1}^K \\exp(\\boldsymbol\\omega^{(j)\\top} \\mathbf{x}^{(i)})}\\right]\n", "\\end{align}\n", "onde $1\\{\\cdot\\}$ é a *função indicadora*, de modo que $1\\{\\hbox{uma afirmação verdadeira}\\}=1$ e $1\\{\\hbox{uma afirmação falsa}\\}=0$. Por exemplo, $1\\{\\hbox{2 + 2 = 4}\\}$ é avaliado como 1; enquanto $1\\{\\hbox{1 + 1 = 5}\\}$ é avaliado como 0. Nossa função de custo será:\n", "\n", "\\begin{align}\n", "J(\\boldsymbol\\omega) = - \\left[ \\sum_{i=1}^{m} \\sum_{k=1}^{K} 1\\left\\{y^{(i)} = k\\right\\} \\log \\frac{\\exp(\\boldsymbol\\omega^{(k)\\top} \\mathbf{x}^{(i)})}{\\sum_{j=1}^K \\exp(\\boldsymbol\\omega^{(j)\\top} \\mathbf{x}^{(i)})}\\right]\n", "\\end{align}\n", "\n", "O gradiente utilizado no treinamento de parâmetros é dado por,\n", "\\begin{align}\n", "\\nabla_{\\boldsymbol\\omega^{(k)}} J(\\boldsymbol\\omega) = - \\sum_{i=1}^{m}{ \\left[ \\mathbf{x}^{(i)} \\left( 1\\{ y^{(i)} = k\\} - P(y^{(i)} = k | \\mathbf{x}^{(i)}; \\boldsymbol\\omega) \\right) \\right] }\n", "\\end{align}\n", "\n", "\n", "### One-vs-all ou one-vs-one\n", "\n", "Existem dois métodos comuns para realizar a classificação multiclasse usando o algoritmo de regressão logística de classificação binária: um-vs-todos (one-vs-all) e um-vs-um (one-vs-one). Em *um-vs-todos*, treinamos $K$ classificadores binários separados para cada classe e executamos todos esses classificadores em qualquer novo exemplo $\\mathbf{x}^{(i)}$ que desejamos prever e selecionamos a classe com a pontuação máxima. Em *um-vs-um*, treinamos $\\begin{pmatrix}\n", "K \\\\ 2\\end{pmatrix} = \\frac{K (K-1)}{2}$ combinações, ié, uma para cada par possível de classes, e escolhemos a classe com probabilidade máxima quando prevemos para um novo exemplo.\n", "\n", "#### Pros and cons\n", "Vamos falar sobre a função softmax usada no modelo multinomial. Ele comprime os valores de entrada de todas as classes entre 0 e 1 e retorna as probabilidades de cada classe. Mas softmax *não é uma função linear* e é não uniforme, o que causa problemas quando você está tentando encontrar o conjunto de pesos ideal para o seu classificador. \n", "De modo geral, porém, adaptar vários classificadores binários, como em *um-vs-um* ou *um-vs-todos*, nem sempre é a melhor maneira de lidar com um problema de classificação de várias classes.\n", "\n", "Se o seu conjunto de dados é aproximadamente com a hipótese linear, pode ser interessante usar uma regressão logística multinomial (também conhecida como classificador de Entropia Máxima).\n", "\n", "No caso de multiclasse, o pacote sklearn em python usa o esquema um-vs-todos*, ou *one-vs-rest* se a opção `multi_class` estiver definida como `ovr` e usa a perda de entropia cruzada se a opção `multi_class` estiver definida como `multinomial`, ainda `auto` (opção default) selecciona `ovr` se os dados são binários ou `solver=’liblinear’`, se não, seleciona `multinomial`." ] }, { "cell_type": "markdown", "metadata": { "id": "VpLJlqdf6nbV" }, "source": [ "### Exemplo\n", "\n", "O conjunto de dados de dígitos $0-9$ já está incorporado à biblioteca scikit-learn. Os dados de entrada `data` e de saída `target` podem ser carregados com a função:\n", "\n", "`load_digits()`\n", "\n", "No problema de classificação multivariáveis exemplificado aqui iremos treinar o modelo para distinguir entre dez classes distintas, ié, números de 0 a 9. " ] }, { "cell_type": "code", "metadata": { "id": "YqXBObCp6nNW", "outputId": "630428fb-473c-42ca-bf9b-8e27de6e21f3", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "from sklearn.datasets import load_digits\n", "digits = load_digits()\n", "# Print to show there are 1797 images (8 by 8 images for a dimensionality of 64)\n", "print('Forma dos dados de entrada', digits.data.shape)\n", "# Print to show there are 1797 labels (integers from 0–9)\n", "print('Forma dos dados de saída ', digits.target.shape)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Forma dos dados de entrada (1797, 64)\n", "Forma dos dados de saída (1797,)\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "p02loqr_7_Lc", "outputId": "105b48aa-ff2a-4bba-ed66-d13691a3dd30", "colab": { "base_uri": "https://localhost:8080/", "height": 190 } }, "source": [ "plt.figure(figsize=(20,4))\n", "for index, (image, label) in enumerate(zip(digits.data[0:5], digits.target[0:5])):\n", " plt.subplot(1, 5, index + 1)\n", " plt.imshow(np.reshape(image, (8,8)), cmap=plt.cm.gray)\n", " plt.title('Treinamento: %i\\n' % label, fontsize = 20)" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "PKSEbxqj8N3h" }, "source": [ "x_train, x_test, y_train, y_test = train_test_split(digits.data, digits.target, test_size=0.25, random_state=0)" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "8clKEF9t8Svi", "outputId": "82da8330-1ca9-440a-9cd4-3dbfa0791a69", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "logreg2 = LogisticRegression(max_iter = 10000)\n", "logreg2.fit(x_train, y_train)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,\n", " intercept_scaling=1, l1_ratio=None, max_iter=10000,\n", " multi_class='auto', n_jobs=None, penalty='l2',\n", " random_state=None, solver='lbfgs', tol=0.0001, verbose=0,\n", " warm_start=False)" ] }, "metadata": { "tags": [] }, "execution_count": 100 } ] }, { "cell_type": "code", "metadata": { "id": "rJNGrLeO9Sfe", "outputId": "2a8af3fb-e2b5-4441-a6ba-d4797e2e7192", "colab": { "base_uri": "https://localhost:8080/", "height": 392 } }, "source": [ "ex = 4\n", "print('Para a entrada {:2d} o primeira entrada do conjunto de teste:\\n'.format(ex))\n", "print('A previsão do modelo é:',logreg2.predict(x_test[ex].reshape(1,-1))[0])\n", "print('O valor correto é :', y_test[ex])\n", "plt.figure(figsize=(20,4))\n", "plt.imshow(np.reshape(x_test[ex], (8,8)), cmap=plt.cm.gray)\n", "plt.title('Treinamento: %i\\n' % y_test[ex], fontsize = 20)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Para a entrada 4 o primeira entrada do conjunto de teste:\n", "\n", "A previsão do modelo é: 6\n", "O valor correto é : 6\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "Text(0.5, 1.0, 'Treinamento: 6\\n')" ] }, "metadata": { "tags": [] }, "execution_count": 74 }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "UUHTV-Nv_15A", "outputId": "54cb5433-bf97-407a-cfc2-c9c7aff5d2e5", "colab": { "base_uri": "https://localhost:8080/", "height": 296 } }, "source": [ "predictions = logreg2.predict(x_test)\n", "confusion_matrix = pd.crosstab(y_test, predictions, rownames=['Target'], colnames=['Predicted'])\n", "sn.heatmap(confusion_matrix, cmap=\"YlGnBu\" , annot=True)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "" ] }, "metadata": { "tags": [] }, "execution_count": 75 }, { "output_type": "display_data", "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAWgAAAEGCAYAAABIGw//AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3de5xN9f7H8ddnzxiXGSQhEXLrplKGiBiDJFSK7h11qqnzO11wKkqdjjrdL6rTzaQ6KhWKkzgVoaTcQkIkpI7bJBSRy8x8fn/sNRqamb1nrLVmzZrPs8d62LNm9nqvtff0sXz3Wt+PqCrGGGOCJ1LaO2CMMaZgVqCNMSagrEAbY0xAWYE2xpiAsgJtjDEBlVjaO1CYxn8Z78vlJWueb+FHjDHGU83lULdQucGlcdec335485Dz4hHYAm2MMWWViKwFdgA5QLaqporI4cAYoBGwFrhIVbcVtR0b4jDGGEAkEvcSp86q2lJVU52vhwDTVLUZMM35ukhWoI0xBohIYtxLCZ0HjHIejwLOj7lPJU0yxpgwcfkMWoEpIrJARDKcdXVUdaPzeBNQJ9ZGbAzaGGMAkfg/93OKbka+VZmqmpnv6w6qul5EagNTRWRF/uerqopIzA8lrUAbYwxQnAEFpxhnFvH99c6fP4rIBKANkCUidVV1o4jUBX50b48CJikxwoTBaUwems4Hd3dlQK/jARjzt45MujOdSXemM/vBHrxwfVvXs2fOXED37jfQrVsGmZnjXN9+aWSF8Zgsq+zk+J1VELeGOEQkWUSq5j0GzgKWAhOB/s6P9QfejbVPZfYMem92Lpc/+Sm79uSQGBHG3tqJj5dt4uLHZ+7/mecyTmfq4o1FbKX4cnJyuPfeF3jllfuoU6cmffsOIj39dJo2beBqjp9ZYTwmyyo7OX5nFaYYV2fEUgeY4AyZJAJvqOoHIjIfGCsi1wDfAxfF2pBnZ9AicpyIDBaRp51lsIgc72bGrj05ACQmREhMiJB/5tSUSom0O7YWUxdvcDOSr776loYN63L00UeSlFSBnj07Mm3aXFcz/M4K4zFZVtnJ8TurMG5dxaGqa1T1FGc5UVXvd9ZvUdUuqtpMVbuq6taY++TSsR1ARAYDbwECzHMWAd4UkZjX/sUrIjDpznTmP9KTz5ZnsXjt79d8dzvlKD5fsZlfd2e7FQdAVtYWjjzyiP1f16lTk6ysLa5m+J0VxmOyrLKT43dWYTy4DvqQeTXEcQ1woqruy79SRJ4AlgEPFfSk/J+M1ux4PdVOOKvIkFyFXg9Mp2rlCrxwfVuaH1WNlRu2A9C7dX3Gfrb2kA/EGFM++Fl44+XVHuUCRxWwvq7zvQKpaqaqpqpqaqzinN+O3/YxZ+VmOp4QvaywRnISpzSswfQlm4q527HVqVOTTZt+2v91VtYW6tSp6XqOn1lhPCbLKjs5fmcVRorxn1+8KtADgGki8r6IZDrLB0Rvb7zFjYDDU5KoWrkCABUrROhwfG3WbNoBQI/T6jF96Sb2Zhf6d0GJnXRSM9au3cD//reJvXv3MXnyTNLT27ie42dWGI/JsspOjt9ZhSk3QxzOJ5bNiV77V89ZvR6Yr6o5bmTUrl6JR/unkiCCROC/C9YzfWn0jLlXan1e+HClGzF/kJiYwN//fgPXXnsPOTm5XHhhV5o1a1ims8J4TJZVdnL8zipMJBK8i9okqE1jbbpRY0z8Dn260SNPuCPumrPp6wdtulFjjPFLED8ktAJtjDFYgTbGmMCSAM58YQXaGGOwM2hjjAmsSCShtHfhD6xAG2MMNsRRLH5d/tb0wnm+5ACsesffC++NOdje3B2+ZSVIRR+zDn0bNsRhjDEBZQXaGGMCyoY4jDEmoCSAt3oHb4+MMaYUFKdprF+sQBtjDDbEYYwxgRXEDwmDt0cl5EdH4EhEmPjoOWTekQZA/drJvP3g2Ux75jyeGtSBConuv5zWvdmySitr08Yt/Ln/Pzmv122c3+s2Xn/1fU9y8gy981k6nHE15/Ye4GlOoUTiX3wSigKd1xF45Mh/MHnys0yaNJNVq35wPeeqnsexav0v+7++/crTeGXScrrc+C6//LqXfl2auJrn13H5lWNZZSsrISHCrbdfzruTHmX0mHt5642prF61zvWcPH36pJH54t2ebT+mSDEWH3epzPOjI/CRh1ch7bSjGPvRqv3r2raowwezo/9jTPh4Dd3aHO1qpnVvtqzSzKpVuwYnnHgMAMnJlTmmST2ysrbFeFbJpbY+kerVUzzbfkyRSPyLX7vkW5JDRK52e5t+dAS+68+tePi1ReT1N6hRtSI7du4jJze6YtOWXdQ5vIqrmda92bJKOyvP+vWbWbF8LSef4u6/EgPFzqABGFbYN0QkQ0S+EJEvMjPH+LlPRercqh5bftnNsjVbS3tXjPHdrp27GXjzcAYPuZKUFHdPQoJEReJe/OLJVRwi8lVh3wLqFPY8Vc0EMqNfrYy7/YzXHYFbHVeLLq3r0+m0elSskEBKlQrc9edUqiZXICEi5OQqR9asQtbWXa5lgnVvtqzSz9q3L5uBtwynZ+/2dD0r5HPJBO8yaM/OoOsAfwJ6F7C4/m8xrzsCPzb6SzpkTCDtL/9hwPBZzF6yib899Rlzl2ZxdrsGAPRJa8xH89z9AMW6N1tWaWapKvfclUnjxvXof1VP17cfOBGJf/GJV9dBTwJSVPXLg78hIh+7HVZaHYEfeX0RTw7swKBLW/L1d1sZN21V7CcVg3VvtqzSzFq08BvemziLZs2Ppm+fOwC4ecBFdOx0qutZALcOeoJ585fx87YddO50HTfedDEX9u3qSVaBAngnYWC7ehdniONQ2HSjpjwJ73SjLQ65ujbrOjLumvPtR9daV29jjPFNAM+grUAbYwwE8kNCK9DGGAO+fvgXLyvQxhgDdgZtjDFBpQnBm/mi3BdoP6+saNr7c9+ylv7nWN+yKiV4c5OEcV9SpGpp70JwBfAMOnh/ZRhjTGlwebpREUkQkUUiMsn5+hgRmSsiq0RkjIgkxdqGFWhjjAEv7iS8BVie7+uHgeGq2hTYBlwTc5eKfRDGGBNGUowl1qZE6gM9gZHO1wKkA287PzIKOD/WdqxAG2MMFGuII//Mm86ScdDWngRuB3Kdr2sCP6tqtvP1OqBerF0q9x8SGmMMAAnxf0p44MybBxKRXsCPqrpARNIOZZesQBtjDLh5q3d74FwROQeoBFQDngIOE5FE5yy6PrA+1oZsiMMYY8C1MWhVvUNV66tqI+ASYLqqXg7MAPo6P9YfeDfWLoWmQIepo3IkIkx8sjeZf+8CwJU9j2PaiAtY9d5V1KjmzQxhe/bs5bKLh9Gvz9306X0nz/1rgic5EK73KuxZYTymwmhE4l5KaDAwSERWER2TfinWE0JRoMPWUfmq3sezat3v3cMXLP+RP909hXVZv7qak19SUgVGvjyYcRPuY+z4e/ls1hK+Wuzu/NYQvvcqzFlhPKYiuXwdNICqfqyqvZzHa1S1jao2VdV+qron1vM9K9AicpyIdBGRlIPWn+12Vpg6Kh9ZswppreszdsrK/eu+XrOV9T96V5wBRIQqyZUAyM7OITs7By9urQrTexX2rDAeU5FcvMzOLZ4UaBG5mej4yk3AUhE5L9+3H3A7L0wdle+6rg0Pv7IAzY39s27Lycnloj5307nDzbQ940RPOjiH6b0Ke1YYj6lICZH4F594lXQd0EpVzwfSgLtF5Bbne4X+/RPUrt5+6dy6frR7+GqffzEdCQkRxk64jykznmDpkjV8+627PRaNCbQAnkF7dZldRFV/BVDVtc61gG+LSEOKOLygdvX2K6vV8bXp0uZoOrWqT8WkaPfwxwedyd+e+NSV7cerWrVkWrc5ns8/XUKzZvVd3XZY3qvykBXGYypSAOeD9uoMOktEWuZ94RTrXsARwEluh4Wlo/Jjry6kw9XjSLv2bQY88gmzv9roW3HeunU727fvBGD37r3M+XwZjRrXdT0nLO9VecgK4zEVqRx19f4TkJ1/hXNx9p9EZITbYWHsqJzfn3ofT8YFLTiiRmUmPX0enyxYx53/cnfq0p82/8Jdd7xIbm4uubnKWWe3oVNay9hPLKawvldhzArjMRVFg3cCbV29/WTzQRvjleaHXF4bX/9O3DVnzYgLrau3Mcb4JoBj0FagjTEGAnnbnhVoY4wBNydLco0VaGOMARviMMaYoFI7gy7fVr13hm9ZzdtN8y1r5ewuvmWZQ5Oje33LSojdEzVYEq1AG2NMMNkZtDHGBJSNQRtjTEAFrz5bgTbGGOBQOqV4xgq0McaADXEYY0xgJQSvQAfw5saSCWtzSz8a1P5nVF9GPNbjgPV3DWzPomnXup4H4Xr9wp419M5n6XDG1Zzbe4BnGXlKu2msFz0JD1UoCnRYm1v6kdX/opNYvfbnA9a1OK4W1at60z08bK9f2LP69Ekj88W7Pdl2foFoGhvA+aBDUaDD2tzS66w6tZJJa9+QcROX718XiQi339iOR56d41pOfmF6/cpDVmrrE6lePSX2Dx6iQDSNLU8FWkTaiEhr5/EJIjJIRM7xIiuszS29zho6oD2PPDOb3Nzfp8G9om8Lps9ay+Ytu1zLyS9Mr195yPJLEI5JReJe/OJVV+97gKeB50XkQeAZIBkYIiJDi3heuW4a66e09g3Zsu03ln3zex+42kdUoUd6E14bt6QU98yYUpIg8S8+8eoqjr5AS6AisAmor6rbReQxYC5wf0FPKu9NY/3ManXykXQ5sxGdzmhAxaREUpIrMHn0Jezdl8PUcZcBULlSIlPHXUa3fm+4kgnhef3KS5ZfAnFMAbzMzqshjmxVzVHVXcBqVd0OoKq/Abluh4W1uaWXWY8/P5eO571G+gWjGXj3VOYsWE/r7i/Tvtco0i8YTfoFo/ltd7arxRnC8/qVlyy/BOKYAjgG7dUZ9F4RqeIU6FZ5K0WkOh4U6LA2twxCI023hfX1C2vWrYOeYN78Zfy8bQedO13HjTddzIV9u7qeE4jf9eCdQHvTNFZEKqrqngLWHwHUVdU4BjnD1zTWTzbdqClIeKcbPfSmsQ2emBF3zflhUOey2zS2oOLsrP8J+Kmg7xljTKmy6UaNMSagAnirtxVoY4wBIgG8bc8KtDHGEMgRDivQxhgDVqCNMSawJIAV2gp0SPl56Vvjvyz1LWvN8y18y/JLeC99K1vcGoMWkUrATKJ3UicCb6vqPSJyDPAWUBNYAFypWvSbH8BhcWOM8Z9E4l9i2AOkq+opRKe8OFtE2gIPA8NVtSmwDbgm1oasQBtjDO7N169RvzpfVnAWBdKBt531o4DzY+2TFWhjjKF4U3Hkn3nTWTLyb0tEEkTkS+BHYCqwGvhZVbOdH1kH1Iu1TzYGbYwxFO8qjgNn3izw+zlASxE5DJgAHFeSfbICbYwxeHOZnar+LCIzgHbAYSKS6JxF1wfWx3q+DXEYYwwQSZC4l6KISC3nzBkRqQx0A5YDM4jOlQ/QH3g31j6F5gx65swF3H//i+Tm5tKvXzcyMvpZVkBykhIjjPlbR5ISIyREInywaD1PTlrOmL91JLli9FewZtWKLF67jRtGuNsLMYzv1dA7n+WTj7/g8JrVmfjek55k5Anj61cYF8+g6wKjRCSB6EnwWFWdJCJfA2+JyD+BRcBLsTYUs0CLyMOqOjjWutKU1xH4lVfuo06dmvTtO4j09NNp2rSBZQUgZ292Lpc/+Sm79uSQGBHG3tqJj5dt4uLHZ+7/mecyTmfq4o2u5OUJ43sF0U7bl1/egyFDnnZ92/mF9fUrjFsFWlW/Ak4tYP0aoFhdCOIZ4uhWwLoexQkBEJFXi/uceIW1o7JfWX7k7NqTA0BiQoTEhAj5pyFPqZRIu2NrMXXxBlczw/heQTg7bQehq7dbl9m5qdAzaBH5C/B/QGMR+Srft6oCnxW1URGZePAqoHPeuIyqnluy3S1YQR2Bv/pqpZsRoc7yIyciMPGOdBrWSuH1T1azeO22/d/rdspRfL5iM7/uzi5iC8UXxvfKT+Xt9QtgS8IihzjeAN4HHgSG5Fu/Q1W3xthufeBrYCTRC7QFSAUeL+pJzrWEGQAjRtxLRsbFMWJMWZGr0OuB6VStXIEXrm9L86OqsXLDdgB6t67P2M/Wlu4OmnIvgFNxFD7Eoaq/qOpaVb0UOJrorYvfAxHnnvKipBK913wo8Iuqfgz8pqqfqOonRWRmqmqqqqYWpziHtaOyX1l+HtOO3/YxZ+VmOp5QB4AayUmc0rAG05dscj0rjO+Vn8rb6+fWVRyu7lOsHxCRe4DBwB3OqiTg9aKeo6q5qjocuBoYKiLP4OEVI2HtqOxXltc5h6ckUbVyBQAqVojQ4fjarNm0A4Aep9Vj+tJN7M12vZdwKN8rP5W3169MjUHn04foJ5ILAVR1g4hUjWfjqroO6CciPYHtJd7LGMLaUdmvLK9zalevxKP9U0kQQSLw3wXrmb40esbcK7U+L3zozVhjGN8rCGen7SB09Q7iEEfMrt4iMk9V24jIQlU9TUSSgdmqerK3u2ZdvcsKm2700Nh0o2449K7ebd+ZFXfNmXNhB1/KeTyX2Y0VkRFEb1O8DvgIeNHb3TLGGH8VZ7Ikv8Qc4lDVx0SkG9EhimOBv6vqVM/3zBhjfBRJKO09+KO4PrhzCrIVZWNMaAVxDDqeW713EL2WOb9fgC+Avzm3LxpjTJlWVnsSPkl0cuk3iN5wcgnQhOhVHS8DaV7tnDHG+CWA9TmuDwnPVdURqrpDVbc7E1V3V9UxQA2P988YY3xRVq+D3iUiF/F7L62+wG7nsV0KZ3y99K1Ry/G+5Kz98gJfciC8l77tzd3hW1aSCzPbB/EMOp4CfTnwFPAc0YI8B7jCmYj6Rg/3zRhjfJMYwPYlRRZoZ8Lp/1PV3oX8yCz3d8kYY/wXkeANCBRZoFU1R0Q6+LUzxhhTWsradKN5FjnzO48DduatVFV/BgONMcYHARzhiKtAVwK2AOn51ilgBdoYExplbogDQFWv9mNHjDGmNAVxiCOe+aArichfReQ5EXk5b/Fj54pj5swFdO9+A926ZZCZOc6yAprjV1YkIkx+62peerrv/nW33tiR6e9m8NH4a7nq0lauZ4btNfQzZ9PGLfy5/z85r9dtnN/rNl5/9X3PsgqTKPEvvu1THD/zGrAC6A7cS/Syu+Ve7lRxhbX7cFi6epdG1tWXpbLqu59ISa4IQL/zTqJunWp0OT8TVahZo4qreWF8Df08poSECLfefjknnHgMO3f+xsUXDqXdGSfRpGl917MKIwEc4ij0DFpE8op3U1W9G9ipqqOAnsDpxQkRkQ4iMkhEzir5rhYurN2Hw9TV28+sI2tXJf3MJrw1/vdex5f3O5WnM2ft7ya+ZdsuVzPD9hr6mQNQq3YNTjgx2kkvObkyxzSpR1bWthjPclcQpxstaohjnvPnPufPn0WkBVAdqF3URkVkXr7H1wHPEO0Gfo+IDCn0iSVUUEfgrKwtbseENitsx/T327rw4JMzyN+MomH9GvTqfjwTR/fn38/0o1EDd2cpCNtr6GfOwdav38yK5Ws5+ZQmnmflFynG4uc+xZIpIjWAu4CJRLt1PxzjORXyPc4AuqnqMOAsokMkBRKRDBH5QkS+yMwcE8euGXOg9DObsGXbLpYuzzpgfVJSAnv25HDu5aN4c/xiHvnHOaW0h6You3buZuDNwxk85EpSUtwdhoolIhr34peixqBri8gg53HelRzPOn8mx9huxCnqEaJttTYDqOpOEcku7EnOREyZ0a/ib3kV1u7DYezq7XVWasv6dO3UlM4dmlAxKYGU5IoMv78Xm7J28MG0bwD4cPpKHh3mboEO02vod06effuyGXjLcHr2bk/Xs/xvuOvnh3/xKuoMOgFIITo0kbek5FuKUh1YQHTO6MNFpC6AiKQQnbLUVWHtPhyWrt5+Zj3yr09o1/05OpzzPDcNmcjn879n4NBJTJmxknato01I26Y24Lsf3B3fDNNr6HcOgKpyz12ZNG5cj/5X9fQkI5YgjkEXdQa9UVXvLclGVbVRId/KJdol3FVh7T4clq7epZWV3/OvzOHJB3pzzRWp7Nq1jyHD3L2MK4yvoZ/HtGjhN7w3cRbNmh9N3z53AHDzgIvo2OlUT/IKEsQbVQrt6i0ii1TVv1fnD6yrt/mjME43Glb+Tjfa6pDPa6+d9XHcNWdkhzRfzqOLOoPu4scOGGNMEJSpuThUdaufO2KMMaUpiEMccXX1NsaYsCtzE/YbY0x5EcD6HMh9MsYY37l1o4qIHC0iM0TkaxFZJiK3OOsPF5GpIvKt82fM21ntDBrI0b2+5IS1Oaif/Lq6onKDe3zJAfjth2G+ZfkpKVK1tHehWFy8vjkb+JuqLhSRqsACEZkKXAVMU9WHnCkvhgCDi9wn13apjPKrOBtjgs2tuThUdaOqLnQe7yA6+2c94DxglPNjo4DzY+2TnUEbYwze3CEoIo2AU4G5QB1V3eh8axNQJ9bzrUAbYwyQEIn/MjsRySA6EVyeTGcuofw/kwK8AwxQ1e0iv/8NoKoqcUxAbQXaGGMo3njvgRO7/ZGIVCBanEfna7CdJSJ1VXWjMz/Rj27ukzHGhJaLV3EI8BKwXFWfyPetiUB/53F/4N1Y+2Rn0MYYg6tj0O2BK4ElIvKls+5O4CFgrIhcA3wPXBRrQ1agjTEG9wq0qs6i8GmVizXHUWiGOPzqPjz0zmfpcMbVnNt7gGcZ+YWte3PYslZ89jTzpzzMnPcfZNak+wG4oOfpLPjoUXauHc1pJzd2PRPs98ILFUTjXvwSigKd13145Mh/MHnys0yaNJNVq37wJKtPnzQyX7zbk20fzK/j8vP1C2PW2Rf/k7Y97qBDr6EALPvmf1yS8QSz5q5wPQvs98IrQZyw35MCLSKni0g153FlERkmIu+JyMMiUt3tPD+7D6e2PpHq1WM1lHFHGLs3hzUrv29WbeDbNRtj/2AJ2e+FN8pNgQZeBvL62j9FtAXWw866V9wOK63uw14LY/fmsGWpKu+9fgefTb6fP1+W7uq2C2O/F95IkPgXv3j1IWFEVfOaw6aq6mnO41n5PtX8g/wXf48YcS8ZGRd7tHvGuKPLhf9gQ9Y2atWsxqTRd/LNqg18Ns+boQ3jLT/PjOPl1Rn0UhHJ6wS+WERSAUSkObCvsCepaqaqpqpqanGKs9/dh/0Sxu7NYcvakBVtPrt5y3Ymfjif1i2buLr9gtjvhTfcug7a1X3yaLvXAp1EZDVwAjBbRNYALzrfc5Wf3Yf9FMbuzWHKqlK5IinJlfY/7nrmySz7Zp1r2y+M/V54o4LEv/jFkyEOVf0FuMr5oPAYJ2edqmZ5kedn9+FbBz3BvPnL+HnbDjp3uo4bb7qYC/t29SQrjN2bw5RVu1Z1xmQO2p815j+fMfWTxZzbPZUn7r2KIw6vxvhXbuerr9dy7pUPuZZrvxfeCOIQR6FdvUufP129/Zxu1OaDLjtsPuiypvkhl9fMFR/GXXMyjute6l29jTGm3PDz6ox4WYE2xhiCOcRhBdoYY7Cu3sYYE1gJPl4+Fy8r0MYYQzAnJir3BTqsV1aEtRmuX++Xn1dWNGo5PvYPucSvruhlkY1BG2NMQFmBNsaYgLIxaGOMCSi7isMYYwLKhjiMMSag7E5CY4wJKD+nEY1XAEddSiaszS3D2AzXz6wwvVeRiDD5rat56em++9fdemNHpr+bwUfjr+WqS1u5nhmm1y+WSDEWP/epzAtrc8uwNsP1Kyts79XVl6Wy6rvfJ7Xvd95J1K1TjS7nZ9L1gpG898FyV/PC9vrFUp56EvoqrM0tw9oM16+sML1XR9auSvqZTXhr/Ff7113e71SezpxF3ozBW7btKuTZJROm1y8eFSIa9+IXr7p63ywiR3ux7YKEtbllEBpplmVheq/+flsXHnxyBvnnb29Yvwa9uh/PxNH9+fcz/WjUoIZreRCu1y8e5ekM+j5groh8KiL/JyK14nmSiGSIyBci8kVm5hiPds2YsiX9zCZs2baLpcsPbEiUlJTAnj05nHv5KN4cv5hH/nFOKe1hOASxQHt1FccaoBXQFbgYGCYiC4A3gfGquqOgJ6lqJpAZ/Sr+jiphbW4ZhEaaZVlY3qvUlvXp2qkpnTs0oWJSAinJFRl+fy82Ze3gg2nfAPDh9JU8OszdAh2W1y9eQRzv9WqfVFVzVXWKql4DHAU8B5xNtHi7KqzNLYPQSLMsC8t79ci/PqFd9+focM7z3DRkIp/P/56BQycxZcZK2rWO9u1rm9qA737Y5kpenrC8fvESiX/xi1dn0AccgqruAyYCE0WkitthYW1uGdZmuH5lhfW9yvP8K3N48oHeXHNFKrt27WPIsPdd3X7YX7+DBfFOQk+axopIc1VdeWhb8adpbFjZdKNlh0036oZDbxq78KfJcdec047oWXabxh56cTbGGH9JAO8ktFu9jTGGg8ZlA8IKtDHG4O+Hf/GyAm2MMQTzDDqIl/4ZY4zvEiT+JRYReVlEfhSRpfnWHS4iU0XkW+fPmLd+WoE2xhhcvw7630Tv+8hvCDBNVZsB05yvi1Tuhzh25/h3v3+FSFXfssJ4OZqf/LxM0c9L35qlfexb1rcfp/mW5QY3hzhUdaaINDpo9XlAmvN4FPAxMLio7dgZtDHGEC3QcS/55g1ylow4Iuqo6kbn8SagTqwnlPszaGOMgeLdSXjgvEHFp6oqcVx4bWfQxhhD8c6gSyhLROoCOH/+GOsJVqCNMYZoT8J4lxKaCPR3HvcH3o25TyVNMsaYMHHzKg4ReROYDRwrIutE5BrgIaCbiHxLdCrmh2Jtx8agjTEGd89WVfXSQr7VpTjbCc0ZtF8dgffs2ctlFw+jX5+76dP7Tp771wTPsqz7ddnJ8vO9An86iL/74gVkPtgdgAdu68jEkRfy3ksX8q9hXalS2f1zu9Lu6h3E+aBDUaD97AiclFSBkS8PZtyE+xg7/l4+m7WErxav8iTLul+XnSw/u6L7cVz9L2zB6u9/3v/1A8/O5txr36H3Ne+wIetXruhzoqt5Qejq7cOHhMXmVdPYJBH5k4h0db6+TFn6hU0AAAxmSURBVESeEZG/ikgFt/P87AgsIlRJrgRAdnYO2dk5ePWWWffrspPlZ1d0zzuI10omrW0Dxk5esX/dr7v27X9cqWIiuDwzZxC6egexJ6FXZ9CvAD2BW0TkNaAfMBdoDYx0O8zvjsA5Oblc1OduOne4mbZnnMjJpzTxLMsPYe3eHIRO0V7w+riG3tiOR0bMJfegZh4PDe7E7PFX0LjBYbw6fmkhzy6ZILxX5alAn6SqFwN9gLOAvqr6GnA1cGphTyorXb0TEiKMnXAfU2Y8wdIla/j223WlvUvGuKJzuwZs2fYby1b+9IfvDXn4E9r3Hc3q77fRs3PZPikpSBCHOLy6iiMiIklAMlAFqA5sBSoChQ5xlIWu3vlVq5ZM6zbH8/mnS2jWrL7neV4Ja/fmIHSK9oKXx3Vaizp0ad+QTm0bRDuIV0nisaGdufX+GQDk5iqTp6/muktP4Z0P3GucFIT3KogdVbw6g34JWAF8CQwFxonIi8B84C23w/zsCLx163a2b98JwO7de5nz+TIaNa7rSZZfwtq9OQidor3g5XE9/uJ8zuz3Bp0veZMB905jzqL13Hr/DBrUq7b/Z9LbN2T1Dz8XsZXiC8J7VW7OoFV1uIiMcR5vEJFXiV6Y/aKqznM7z8+OwD9t/oW77niR3NxccnOVs85uQ6e0lp5kWffrspPlZ1d0vztgi8AjQ9JISU5CBFas2sI9w2e5mhGErt5B7KjiSVdvd/jT1dumGzUF8XO6UT/fq/BON3roXb237J4Yd82pWelcX8q53UlojDEE8wzaCrQxxgBB7EpoBdoYYwCxAm2MMcEkEryZL6xAG2MMYEMcxhgTUBLAuePKfYGulFD27ywrT/y6/C2slykum97Kt6zm7ab5lrVydvND3oYNcRhjTGDZEIcxxgSSXcVhjDEBZQXaGGMCSiShtHfhD6xAG2MMYGPQxhgTUEEc4gjedSUlFMZO0X5mhfGYwtZp2++sTRu38Of+/+S8Xrdxfq/beP3V9z3JiUSE/4zqy4jHehyw/q6B7Vk07VpPMgvZk2Is/u1RmRfWTtF+ZYXxmCB8nbb9zkpIiHDr7Zfz7qRHGT3mXt56YyqrV7nf3q3/RSexeu2BDQBaHFeL6lUrup5VFCnGf37xrECLSGMRuVVEnhKRJ0TkBhGpFvuZxRfWTtF+ZYXxmCBcnbZLI6tW7RqccOIxACQnV+aYJvXIytrmakadWsmktW/IuInL96+LRITbb2zHI8/OcTUrFhGJe/GLJwVaRG4GXgAqEe3kXRE4GpgjImlu54W1U7RfWWE8Jr+F/TVcv34zK5avdb2D/dAB7Xnkmdnk5v4+V/4VfVswfdZaNm/Z5WpWLEJC3ItfvDqDvg7ooar/JNrq6kRVHQqcDQwv7Ellpau3MeXJrp27GXjzcAYPuZKUlCqubTetfcNoB/Fvfm8WW/uIKvRIb8Jr45a4lhO/4HUl9PIqjkQgh+jZcwqAqv4gImW6q3cYs8J4TH4L62u4b182A28ZTs/e7el6lrtNXFudfCRdzmxEpzMaUDEpkZTkCkwefQl79+UwddxlAFSulMjUcZfRrd8brmYXxM+hi3h5dQY9EpjvdPKeDTwLICK1gK1uh4W1U7RfWWE8Jr+F8TVUVe65K5PGjevR/6qerm//8efn0vG810i/YDQD757KnAXrad39Zdr3GkX6BaNJv2A0v+3O9qU4R5WTM2hVfUpEPgKOBx5X1RXO+s1AR7fzwtop2q+sMB4ThLfTtl9ZixZ+w3sTZ9Gs+dH07XMHADcPuIiOnU51PSsIgjjdaLnv6m3KFptu9NDszd3hW1aL9vN8y1o5+y+HfFq7L/fLuGtOhUhL6+ptjDF+idh80MYYE1RWoI0xJpBsLg5jjAks967iEJGzReQbEVklIkNKukd2Bm2MMbh3HbREJ5Z+FugGrCN6yfFEVf26uNuyAm2MMeDmLdxtgFWqugZARN4CzgOKXaBR1VAtQEaYciyrbGWF8ZjCnHUo+wh8kW/JyPe9vsDIfF9fCTxTkpwwjkFnhCzHsspWVhiPKcxZJaKqmaqamm/J9CInjAXaGGNK03qis3fmqe+sKzYr0MYY4675QDMROUZEkoBLgIkl2VAYPyT05J8apZhjWWUrK4zHFOYs16lqtojcCHwIJAAvq+qykmwrwHNxGGNM+WZDHMYYE1BWoI0xJqBCU6DdurUyjpyXReRHEVnqVUa+rKNFZIaIfC0iy0TkFg+zKonIPBFZ7GQN8yrLyUsQkUUiMsnjnLUiskREvhSRLzzOOkxE3haRFSKyXETaeZRzrHM8ect2ERngUdZA5/dhqYi8KSKVvMhxsm5xcpZ5dTxlTmlf8O3SReMJwGqgMZAELAZO8CirI3AasNSH46oLnOY8rgqs9PC4BEhxHlcA5gJtPTy2QcAbwCSPX8O1wBFev1dO1ijgWudxEnCYD5kJwCagoQfbrgd8B1R2vh4LXOXRcbQAlgJViF688BHQ1I/3LchLWM6g999aqap7gbxbK12nqjPxoG1XIVkbVXWh83gHsJzo/zReZKmq/up8WcFZPPkEWUTqAz2JtkYLBRGpTvQv75cAVHWvqv7sQ3QXYLWqfu/R9hOByiKSSLR4bvAo53hgrqruUtVs4BPgAo+yyoywFOh6wP/yfb0OjwpZaRGRRsCpRM9svcpIEJEvgR+BqarqVdaTwO1Arkfbz0+BKSKyQES8vEPtGGAz8IozdDNSRJI9zMtzCfCmFxtW1fXAY8APwEbgF1Wd4kUW0bPnM0WkpohUAc7hwJs9yqWwFOhQE5EU4B1ggKpu9ypHVXNUtSXRO5/aiEgLtzNEpBfwo6oucHvbheigqqcBPYC/iojrPTEdiUSHvp5X1VOBnYBnn4UAODdBnAuM82j7NYj+S/QY4CggWUSu8CJLVZcDDwNTgA+AL4EcL7LKkrAUaNdurQwaEalAtDiPVtXxfmQ6/zSfAZztwebbA+eKyFqiQ1HpIvK6BznA/rNAVPVHYALR4TAvrAPW5ftXx9tEC7aXegALVTXLo+13Bb5T1c2qug8YD5zhURaq+pKqtlLVjsA2op+5lGthKdCu3VoZJBKdoPYlYLmqPuFxVi0ROcx5XJnoXLYr3M5R1TtUtb6qNiL6Pk1XVU/OykQkWUSq5j0GziL6T2nXqeom4H8icqyzqgslmV6yeC7Fo+ENxw9AWxGp4vwudiH6OYgnRKS282cDouPPb3iVVVaE4lZvdfHWylhE5E0gDThCRNYB96jqS15kET3bvBJY4owNA9ypqv/1IKsuMMqZbDwCjFVVTy+B80EdYIIzEXsi8IaqfuBh3k3AaOckYQ1wtVdBzl843YDrvcpQ1bki8jawEMgGFuHtbdjviEhNYB/wV58+ZA00u9XbGGMCKixDHMYYEzpWoI0xJqCsQBtjTEBZgTbGmICyAm2MMQFlBdp4QkRynJnWlorIOOf23ZJu698i0td5PFJETijiZ9NEpNg3Uziz3h1R0n00xgtWoI1XflPVlqraAtgL3JD/m87kO8WmqteqalE3gKTh4d1uxvjJCrTxw6dAU+fs9lMRmQh87UzO9KiIzBeRr0TkeojeQSkizzjze38E1M7bkIh8LCKpzuOzRWShM4f1NGdCqRuAgc7Z+5nOHZLvOBnzRaS989yaIjLFmXt4JNHpVo0JlFDcSWiCyzlT7kF0AhyIzk/RQlW/c2aX+0VVW4tIReAzEZlCdNa+Y4ETiN4N+DXw8kHbrQW8CHR0tnW4qm4VkReAX1X1Mefn3gCGq+os5xbiD4lObXkPMEtV7xWRnsA1nr4QxpSAFWjjlcr5bk//lOicImcA81T1O2f9WcDJeePLQHWgGdF5ld9U1Rxgg4hML2D7bYGZedtS1cLm6O4KnODc7g1QzZkdsCPOfMOqOllEtpXwOI3xjBVo45XfnKlL93OK5M78q4CbVPXDg37uHBf3I0K0M8zuAvbFmECzMWhTmj4E/uJMqYqINHcmAZoJXOyMUdcFOhfw3DlARxE5xnnu4c76HUTbg+WZQnQSI5yfy/tLYyZwmbOuB1DDtaMyxiVWoE1pGkl0fHmhRJvwjiD6r7oJwLfO914FZh/8RFXdDGQA40VkMTDG+dZ7QJ+8DwmBm4FU50PIr/n9apJhRAv8MqJDHT94dIzGlJjNZmeMMQFlZ9DGGBNQVqCNMSagrEAbY0xAWYE2xpiAsgJtjDEBZQXaGGMCygq0McYE1P8DwP5naEiztJwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "cHK0IuKn_uKn", "outputId": "8ff3a624-ed05-4225-e780-5feb34385f08", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "print('Acurácia : {:0.3f}'.format(metrics.accuracy_score(y_test, predictions)))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Acurácia : 0.953\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "noqmVMx-9HUx", "outputId": "03192199-1e06-406c-f7a5-0b8f78059e6e", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "print(logreg2.predict(x_test[0:10]))\n", "print(y_test[0:10])" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "[2 8 2 6 6 7 1 9 8 5]\n", "[2 8 2 6 6 7 1 9 8 5]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "X8qTUoDvgCTu" }, "source": [ "### Vantagens e desvantagens da regressão logística\n", "\n", "Devido à sua natureza eficiente e direta, não requer alto poder de computação, fácil de implementar, facilmente interpretável, amplamente utilizado por analistas de dados e cientistas. Além disso, não requer dimensionamento de recursos. A regressão logística fornece uma pontuação de probabilidade para observações.\n", "\n", "Porém, a regressão logística não é capaz de lidar com um grande número de características/variáveis categóricas. É vulnerável a overfitting. Para resolver o problema não lineares, a regressão logística requer uma transformação de recursos, conforme visto em regressão polinomial. A regressão logística não terá um bom desempenho com variáveis independentes que não estão correlacionadas com a variável de destino e são muito semelhantes ou correlacionadas entre si." ] }, { "cell_type": "markdown", "metadata": { "id": "edhSoRvATNhe" }, "source": [ "## Classificação binária por redes neurais\n", "\n", "\n", "\n", "O conjunto de dados usados é o [Detecção de fraude de cartão de crédito](https://www.kaggle.com/mlg-ulb/creditcardfraud) do Kaggle. O objetivo desses dados é detectar apenas 492 transações fraudulentas de um total de 284.807 transações. Deve-se ressaltar que, neste caso, o conjunto de dados é altamente desbalanceado, ié, o número de exemplos de uma classe supera em muito os exemplos da outra. \n", "\n", "As tarefas realizadas são:\n", "\n", "* Carregar um arquivo tipo CSV usando o Pandas;\n", "* Criar conjuntos de treinamento, validação e teste;\n", "* Definir e treinar um modelo com definição de pesos de classe;\n", "* Avaliar o modelo usando várias métricas, incluindo precisão, revocação e F1." ] }, { "cell_type": "markdown", "metadata": { "id": "WM3uuOE2Tn6h" }, "source": [ "### Carregar dados (\"Credit Card Fraud dataset\")\n", "\n", "Para carregar dados de arquivos tipo CSV a melhor ferramenta é o Pandas. O Pandas possui muitas funções úteis para processar dados estruturados." ] }, { "cell_type": "code", "metadata": { "id": "tgYAzt_OZF96" }, "source": [ "raw_df = pd.read_csv('https://storage.googleapis.com/download.tensorflow.org/data/creditcard.csv')" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "YdiiM55fZPog", "outputId": "d15a63f6-af71-441a-e53b-77dc3d1f1533", "colab": { "base_uri": "https://localhost:8080/", "height": 215 } }, "source": [ "raw_df.head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "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", " \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", " \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", "
TimeV1V2V3V4V5V6V7V8V9V10V11V12V13V14V15V16V17V18V19V20V21V22V23V24V25V26V27V28AmountClass
00.0-1.359807-0.0727812.5363471.378155-0.3383210.4623880.2395990.0986980.3637870.090794-0.551600-0.617801-0.991390-0.3111691.468177-0.4704010.2079710.0257910.4039930.251412-0.0183070.277838-0.1104740.0669280.128539-0.1891150.133558-0.021053149.620
10.01.1918570.2661510.1664800.4481540.060018-0.082361-0.0788030.085102-0.255425-0.1669741.6127271.0652350.489095-0.1437720.6355580.463917-0.114805-0.183361-0.145783-0.069083-0.225775-0.6386720.101288-0.3398460.1671700.125895-0.0089830.0147242.690
21.0-1.358354-1.3401631.7732090.379780-0.5031981.8004990.7914610.247676-1.5146540.2076430.6245010.0660840.717293-0.1659462.345865-2.8900831.109969-0.121359-2.2618570.5249800.2479980.7716790.909412-0.689281-0.327642-0.139097-0.055353-0.059752378.660
31.0-0.966272-0.1852261.792993-0.863291-0.0103091.2472030.2376090.377436-1.387024-0.054952-0.2264870.1782280.507757-0.287924-0.631418-1.059647-0.6840931.965775-1.232622-0.208038-0.1083000.005274-0.190321-1.1755750.647376-0.2219290.0627230.061458123.500
42.0-1.1582330.8777371.5487180.403034-0.4071930.0959210.592941-0.2705330.8177390.753074-0.8228430.5381961.345852-1.1196700.175121-0.451449-0.237033-0.0381950.8034870.408542-0.0094310.798278-0.1374580.141267-0.2060100.5022920.2194220.21515369.990
\n", "
" ], "text/plain": [ " Time V1 V2 V3 ... V27 V28 Amount Class\n", "0 0.0 -1.359807 -0.072781 2.536347 ... 0.133558 -0.021053 149.62 0\n", "1 0.0 1.191857 0.266151 0.166480 ... -0.008983 0.014724 2.69 0\n", "2 1.0 -1.358354 -1.340163 1.773209 ... -0.055353 -0.059752 378.66 0\n", "3 1.0 -0.966272 -0.185226 1.792993 ... 0.062723 0.061458 123.50 0\n", "4 2.0 -1.158233 0.877737 1.548718 ... 0.219422 0.215153 69.99 0\n", "\n", "[5 rows x 31 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 3 } ] }, { "cell_type": "code", "metadata": { "id": "h5ASvEetZUAs", "outputId": "b3aaba2c-be30-4f78-e3d3-6c9069a11111", "colab": { "base_uri": "https://localhost:8080/", "height": 304 } }, "source": [ "raw_df[['Time', 'V1', 'V2', 'V3', 'V4', 'V5', 'V26', 'V27', 'V28', 'Amount', 'Class']].describe()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "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", " \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", "
TimeV1V2V3V4V5V26V27V28AmountClass
count284807.0000002.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+052.848070e+05284807.000000284807.000000
mean94813.8595753.919560e-155.688174e-16-8.769071e-152.782312e-15-1.552563e-151.699104e-15-3.660161e-16-1.206049e-1688.3496190.001727
std47488.1459551.958696e+001.651309e+001.516255e+001.415869e+001.380247e+004.822270e-014.036325e-013.300833e-01250.1201090.041527
min0.000000-5.640751e+01-7.271573e+01-4.832559e+01-5.683171e+00-1.137433e+02-2.604551e+00-2.256568e+01-1.543008e+010.0000000.000000
25%54201.500000-9.203734e-01-5.985499e-01-8.903648e-01-8.486401e-01-6.915971e-01-3.269839e-01-7.083953e-02-5.295979e-025.6000000.000000
50%84692.0000001.810880e-026.548556e-021.798463e-01-1.984653e-02-5.433583e-02-5.213911e-021.342146e-031.124383e-0222.0000000.000000
75%139320.5000001.315642e+008.037239e-011.027196e+007.433413e-016.119264e-012.409522e-019.104512e-027.827995e-0277.1650000.000000
max172792.0000002.454930e+002.205773e+019.382558e+001.687534e+013.480167e+013.517346e+003.161220e+013.384781e+0125691.1600001.000000
\n", "
" ], "text/plain": [ " Time V1 ... Amount Class\n", "count 284807.000000 2.848070e+05 ... 284807.000000 284807.000000\n", "mean 94813.859575 3.919560e-15 ... 88.349619 0.001727\n", "std 47488.145955 1.958696e+00 ... 250.120109 0.041527\n", "min 0.000000 -5.640751e+01 ... 0.000000 0.000000\n", "25% 54201.500000 -9.203734e-01 ... 5.600000 0.000000\n", "50% 84692.000000 1.810880e-02 ... 22.000000 0.000000\n", "75% 139320.500000 1.315642e+00 ... 77.165000 0.000000\n", "max 172792.000000 2.454930e+00 ... 25691.160000 1.000000\n", "\n", "[8 rows x 11 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 4 } ] }, { "cell_type": "code", "metadata": { "id": "VyzCquGrUW-J", "outputId": "ec21eb7c-e4a8-4a06-a313-d15865171068", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "print('Dimensões dos dados =', raw_df.shape)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Dimensões dos dados = (284807, 31)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "SYvmRpCLZdao" }, "source": [ "### Verificar o desbalanceamento dos dados\n", "\n", "O resultado a seguir mostra a pequena fração dos dados da classe positiva (dados fraudulentos)." ] }, { "cell_type": "code", "metadata": { "id": "mJII4SjCZcAO", "outputId": "e713c9f4-7769-45cb-8feb-b3a9fccb56ec", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "neg, pos = np.bincount(raw_df['Class'])\n", "total = neg + pos\n", "print('Examples:\\n Total: {}\\n Positive: {} ({:.2f}% of total)\\n'.format(\n", " total, pos, 100 * pos / total))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Examples:\n", " Total: 284807\n", " Positive: 492 (0.17% of total)\n", "\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "dJ0dXAEXZyfk" }, "source": [ "### Limpeza inicial dos dados\n", "\n", "Esses dados apresentam alguns problemas. Primeiro, as colunas `Time` e `Amount` apresentam grandes variações para serem usadas diretamente. Assim, vamos elimine a coluna `Time` (uma vez que não está claro o que significa) e vamos calcular o logaritmo da coluna `Amount` para reduzir seu intervalo de variação." ] }, { "cell_type": "code", "metadata": { "id": "4NLTivk3Z07W", "outputId": "d60360d9-3413-4070-e10d-06af02a626a4", "colab": { "base_uri": "https://localhost:8080/", "height": 215 } }, "source": [ "cleaned_df = raw_df.copy()\n", "\n", "# Eliminação da coluna Time\n", "cleaned_df.pop('Time')\n", "\n", "# Cálculo do log da coluna Amount\n", "eps=0.001 # deve-se somar um número pequeno para evitar calcular log de zero\n", "cleaned_df['LogAmmout'] = np.log(cleaned_df.pop('Amount')+eps)\n", "cleaned_df.head()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "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", " \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", " \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", "
V1V2V3V4V5V6V7V8V9V10V11V12V13V14V15V16V17V18V19V20V21V22V23V24V25V26V27V28ClassLogAmmout
0-1.359807-0.0727812.5363471.378155-0.3383210.4623880.2395990.0986980.3637870.090794-0.551600-0.617801-0.991390-0.3111691.468177-0.4704010.2079710.0257910.4039930.251412-0.0183070.277838-0.1104740.0669280.128539-0.1891150.133558-0.02105305.008105
11.1918570.2661510.1664800.4481540.060018-0.082361-0.0788030.085102-0.255425-0.1669741.6127271.0652350.489095-0.1437720.6355580.463917-0.114805-0.183361-0.145783-0.069083-0.225775-0.6386720.101288-0.3398460.1671700.125895-0.0089830.01472400.989913
2-1.358354-1.3401631.7732090.379780-0.5031981.8004990.7914610.247676-1.5146540.2076430.6245010.0660840.717293-0.1659462.345865-2.8900831.109969-0.121359-2.2618570.5249800.2479980.7716790.909412-0.689281-0.327642-0.139097-0.055353-0.05975205.936641
3-0.966272-0.1852261.792993-0.863291-0.0103091.2472030.2376090.377436-1.387024-0.054952-0.2264870.1782280.507757-0.287924-0.631418-1.059647-0.6840931.965775-1.232622-0.208038-0.1083000.005274-0.190321-1.1755750.647376-0.2219290.0627230.06145804.816249
4-1.1582330.8777371.5487180.403034-0.4071930.0959210.592941-0.2705330.8177390.753074-0.8228430.5381961.345852-1.1196700.175121-0.451449-0.237033-0.0381950.8034870.408542-0.0094310.798278-0.1374580.141267-0.2060100.5022920.2194220.21515304.248367
\n", "
" ], "text/plain": [ " V1 V2 V3 V4 ... V27 V28 Class LogAmmout\n", "0 -1.359807 -0.072781 2.536347 1.378155 ... 0.133558 -0.021053 0 5.008105\n", "1 1.191857 0.266151 0.166480 0.448154 ... -0.008983 0.014724 0 0.989913\n", "2 -1.358354 -1.340163 1.773209 0.379780 ... -0.055353 -0.059752 0 5.936641\n", "3 -0.966272 -0.185226 1.792993 -0.863291 ... 0.062723 0.061458 0 4.816249\n", "4 -1.158233 0.877737 1.548718 0.403034 ... 0.219422 0.215153 0 4.248367\n", "\n", "[5 rows x 30 columns]" ] }, "metadata": { "tags": [] }, "execution_count": 6 } ] }, { "cell_type": "markdown", "metadata": { "id": "TLI-6Cr8aNB6" }, "source": [ "### Divisão do conjunto de dados\n", "\n", "Vamos dividir o conjunto de dados em conjuntos de treinamento, validação e teste. O conjunto de validação é usado durante o ajuste do modelo para avaliar a função de custo e outras métricas, no entanto, o modelo não se ajusta a esses dados. O conjunto de teste não é usado durante a fase de treinamento e só é usado no final para avaliar quão bem o modelo generaliza para novos dados. Isso é especialmente importante com conjuntos de dados desequilibrados, onde o sobreajuste é uma preocupação significativa devido à falta de dados de treinamento." ] }, { "cell_type": "code", "metadata": { "id": "xLBC8p6LaMst" }, "source": [ "# Usaremos a função split da biblioteca sklearn para divir os dados\n", "train_df, test_df = train_test_split(cleaned_df, test_size=0.2)\n", "train_df, val_df = train_test_split(train_df, test_size=0.2)\n", "\n", "# Separa as saídas dos dados de entrada e as transforma em tensores Numpy\n", "train_labels = np.array(train_df.pop('Class'))\n", "val_labels = np.array(val_df.pop('Class'))\n", "test_labels = np.array(test_df.pop('Class'))\n", "\n", "# Transforma os dados de entrada em tensores Numpy\n", "train_features = np.array(train_df)\n", "val_features = np.array(val_df)\n", "test_features = np.array(test_df)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "3FfPEj0YaUpy" }, "source": [ "### Normalização dos dados de entrada\n", "\n", "Os dados de entrada serão normalizados para que cada característica (coluna) tenha média zero e desvio padrão igual a um.\n", "\n", "As médias e desvios padrões de cada característica são calculados usando somente o conjunto de dados de treinamento e esses valores são usados para normalizar também os dados de validação e teste. Isso deve ser feito porque nenhum ainformação dos dados de validação e teste devem ser utilizados no treinamento." ] }, { "cell_type": "code", "metadata": { "id": "jQsxpRZ6aXLi", "outputId": "07838504-9ff4-4cfd-acdc-749ac614ffc4", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "# Calcula média e desvio padrão de cada coluna dos dados de treinamento\n", "mean = np.mean(train_features, axis=0)\n", "std = np.std(train_features, axis=0)\n", "\n", "# Normaliza dados de treinamento, validação e teste usando média e desvio padrão dos dados de treinamento\n", "train_features = (train_features - mean)/std\n", "val_features = (val_features - mean)/std\n", "test_features = (test_features - mean)/std\n", "\n", "print('Dimensão das saídas de treinamento:', train_labels.shape)\n", "print('Dimensão das saídas de validação:', val_labels.shape)\n", "print('Dimensão das saídas de teste:', test_labels.shape)\n", "\n", "print('Dimensão das entradas de treinamento:', train_features.shape)\n", "print('Dimensão das entradas de validação:', val_features.shape)\n", "print('Dimensão das entradas de teste:', test_features.shape)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Dimensão das saídas de treinamento: (182276,)\n", "Dimensão das saídas de validação: (45569,)\n", "Dimensão das saídas de teste: (56962,)\n", "Dimensão das entradas de treinamento: (182276, 29)\n", "Dimensão das entradas de validação: (45569, 29)\n", "Dimensão das entradas de teste: (56962, 29)\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "jSidxArVas2V" }, "source": [ "### Definição da RNA e das métricas\n", "\n", "Vamos definir uma função que cria uma rede neural simples com uma camada oculta tipo densa e uma camada de saída com um único neurônio com função de ativação sigmóide, que retorna a probabilidade de uma transação ser fraudulenta." ] }, { "cell_type": "code", "metadata": { "id": "cPbmUq_aaeUA" }, "source": [ "# Define métricas \n", "METRICS = [\n", " keras.metrics.TruePositives(name='tp'),\n", " keras.metrics.FalsePositives(name='fp'),\n", " keras.metrics.TrueNegatives(name='tn'),\n", " keras.metrics.FalseNegatives(name='fn'), \n", " keras.metrics.BinaryAccuracy(name='accuracy'),\n", " keras.metrics.Precision(name='precision'),\n", " keras.metrics.Recall(name='recall'),\n", " keras.metrics.AUC(name='auc')]\n", "\n", "\n", "# Função que cria e compila a RN\n", "def make_model(METRICS, INPUT_DIM):\n", " # Configuração da rede\n", " rna = Sequential()\n", " rna.add(Dense(units=32, activation='relu', input_dim=INPUT_DIM))\n", " rna.add(Dense(units=1, activation='sigmoid'))\n", " \n", " rna.compile(optimizer=keras.optimizers.Adam(lr=1e-3),\n", " loss=keras.losses.BinaryCrossentropy(),\n", " metrics=METRICS)\n", "\n", " return rna" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "7ZwNkMxOb9jy", "outputId": "2454f2e1-1f1c-45b8-d85e-a0f1b2470d2d", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "# Determina número de carateríticas\n", "features_shape = train_features.shape[1]\n", "print('Dimensão dos dados de entrada =', features_shape)\n", "\n", "# Cria RN já compilada\n", "rna = make_model(METRICS, features_shape)\n", "rna.summary()" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Dimensão dos dados de entrada = 29\n", "Model: \"sequential\"\n", "_________________________________________________________________\n", "Layer (type) Output Shape Param # \n", "=================================================================\n", "dense (Dense) (None, 32) 960 \n", "_________________________________________________________________\n", "dense_1 (Dense) (None, 1) 33 \n", "=================================================================\n", "Total params: 993\n", "Trainable params: 993\n", "Non-trainable params: 0\n", "_________________________________________________________________\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "mw4LDZZhbjw2" }, "source": [ "### Treinamento da RN\n", "\n", "Agora vamos treinar a RNA que foi definida anteriormente. Observe que o tamanho do lote de 2048 é bem maior do que o padrão de 32. Nesse tipo de problema isso é importante para garantir que cada lote tenha uma alguma chance de conter algumas amostras positivas. Se o tamanho do lote for muito pequeno, eles provavelmente não teriam transações fraudulentas com as quais aprender.\n", "\n", "**Observação:** essa RNA não conseguirá lidar bem com o desequilíbrio de classe. Para melhorar esse resultado, estude sobre *pesos para as classes*." ] }, { "cell_type": "code", "metadata": { "id": "dfSH9lbDbuZp", "outputId": "fe4833fc-1f3f-4111-8a63-06a875b67e6a", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "EPOCHS = 100\n", "BATCH_SIZE = 2048\n", "\n", "# Define callback para parada \n", "early_stopping = tf.keras.callbacks.EarlyStopping(\n", " monitor='val_auc', \n", " verbose=1,\n", " patience=10,\n", " mode='max',\n", " restore_best_weights=True)\n", "\n", "# Treinamento da RN\n", "history = rna.fit(train_features, train_labels, epochs=EPOCHS, batch_size=BATCH_SIZE, \n", " validation_data=(val_features, val_labels), verbose=1, callbacks=[early_stopping])" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Epoch 1/100\n", "90/90 [==============================] - 2s 18ms/step - loss: 0.6621 - tp: 276.0000 - fp: 69329.0000 - tn: 112633.0000 - fn: 38.0000 - accuracy: 0.6194 - precision: 0.0040 - recall: 0.8790 - auc: 0.8911 - val_loss: 0.3196 - val_tp: 51.0000 - val_fp: 588.0000 - val_tn: 44907.0000 - val_fn: 23.0000 - val_accuracy: 0.9866 - val_precision: 0.0798 - val_recall: 0.6892 - val_auc: 0.8134\n", "Epoch 2/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.2020 - tp: 241.0000 - fp: 521.0000 - tn: 181441.0000 - fn: 73.0000 - accuracy: 0.9967 - precision: 0.3163 - recall: 0.7675 - auc: 0.8750 - val_loss: 0.1219 - val_tp: 44.0000 - val_fp: 24.0000 - val_tn: 45471.0000 - val_fn: 30.0000 - val_accuracy: 0.9988 - val_precision: 0.6471 - val_recall: 0.5946 - val_auc: 0.7828\n", "Epoch 3/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0859 - tp: 203.0000 - fp: 51.0000 - tn: 181911.0000 - fn: 111.0000 - accuracy: 0.9991 - precision: 0.7992 - recall: 0.6465 - auc: 0.8688 - val_loss: 0.0599 - val_tp: 43.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 31.0000 - val_accuracy: 0.9992 - val_precision: 0.8776 - val_recall: 0.5811 - val_auc: 0.7799\n", "Epoch 4/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0459 - tp: 192.0000 - fp: 30.0000 - tn: 181932.0000 - fn: 122.0000 - accuracy: 0.9992 - precision: 0.8649 - recall: 0.6115 - auc: 0.8798 - val_loss: 0.0355 - val_tp: 42.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 32.0000 - val_accuracy: 0.9992 - val_precision: 0.8750 - val_recall: 0.5676 - val_auc: 0.7939\n", "Epoch 5/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0287 - tp: 191.0000 - fp: 29.0000 - tn: 181933.0000 - fn: 123.0000 - accuracy: 0.9992 - precision: 0.8682 - recall: 0.6083 - auc: 0.8886 - val_loss: 0.0239 - val_tp: 44.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8800 - val_recall: 0.5946 - val_auc: 0.8015\n", "Epoch 6/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0201 - tp: 200.0000 - fp: 30.0000 - tn: 181932.0000 - fn: 114.0000 - accuracy: 0.9992 - precision: 0.8696 - recall: 0.6369 - auc: 0.8949 - val_loss: 0.0176 - val_tp: 44.0000 - val_fp: 5.0000 - val_tn: 45490.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8980 - val_recall: 0.5946 - val_auc: 0.8154\n", "Epoch 7/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0151 - tp: 207.0000 - fp: 29.0000 - tn: 181933.0000 - fn: 107.0000 - accuracy: 0.9993 - precision: 0.8771 - recall: 0.6592 - auc: 0.9049 - val_loss: 0.0139 - val_tp: 44.0000 - val_fp: 5.0000 - val_tn: 45490.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8980 - val_recall: 0.5946 - val_auc: 0.8302\n", "Epoch 8/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0120 - tp: 212.0000 - fp: 28.0000 - tn: 181934.0000 - fn: 102.0000 - accuracy: 0.9993 - precision: 0.8833 - recall: 0.6752 - auc: 0.9146 - val_loss: 0.0115 - val_tp: 44.0000 - val_fp: 5.0000 - val_tn: 45490.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8980 - val_recall: 0.5946 - val_auc: 0.8372\n", "Epoch 9/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0099 - tp: 210.0000 - fp: 28.0000 - tn: 181934.0000 - fn: 104.0000 - accuracy: 0.9993 - precision: 0.8824 - recall: 0.6688 - auc: 0.9167 - val_loss: 0.0098 - val_tp: 44.0000 - val_fp: 5.0000 - val_tn: 45490.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8980 - val_recall: 0.5946 - val_auc: 0.8368\n", "Epoch 10/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0085 - tp: 223.0000 - fp: 29.0000 - tn: 181933.0000 - fn: 91.0000 - accuracy: 0.9993 - precision: 0.8849 - recall: 0.7102 - auc: 0.9214 - val_loss: 0.0086 - val_tp: 44.0000 - val_fp: 5.0000 - val_tn: 45490.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8980 - val_recall: 0.5946 - val_auc: 0.8430\n", "Epoch 11/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0074 - tp: 218.0000 - fp: 27.0000 - tn: 181935.0000 - fn: 96.0000 - accuracy: 0.9993 - precision: 0.8898 - recall: 0.6943 - auc: 0.9227 - val_loss: 0.0078 - val_tp: 44.0000 - val_fp: 5.0000 - val_tn: 45490.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8980 - val_recall: 0.5946 - val_auc: 0.8528\n", "Epoch 12/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0067 - tp: 223.0000 - fp: 25.0000 - tn: 181937.0000 - fn: 91.0000 - accuracy: 0.9994 - precision: 0.8992 - recall: 0.7102 - auc: 0.9297 - val_loss: 0.0071 - val_tp: 44.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8800 - val_recall: 0.5946 - val_auc: 0.8621\n", "Epoch 13/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0061 - tp: 224.0000 - fp: 27.0000 - tn: 181935.0000 - fn: 90.0000 - accuracy: 0.9994 - precision: 0.8924 - recall: 0.7134 - auc: 0.9295 - val_loss: 0.0066 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.8692\n", "Epoch 14/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0056 - tp: 226.0000 - fp: 26.0000 - tn: 181936.0000 - fn: 88.0000 - accuracy: 0.9994 - precision: 0.8968 - recall: 0.7197 - auc: 0.9294 - val_loss: 0.0062 - val_tp: 44.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8627 - val_recall: 0.5946 - val_auc: 0.8803\n", "Epoch 15/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0052 - tp: 228.0000 - fp: 26.0000 - tn: 181936.0000 - fn: 86.0000 - accuracy: 0.9994 - precision: 0.8976 - recall: 0.7261 - auc: 0.9303 - val_loss: 0.0059 - val_tp: 43.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 31.0000 - val_accuracy: 0.9992 - val_precision: 0.8776 - val_recall: 0.5811 - val_auc: 0.8842\n", "Epoch 16/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0048 - tp: 227.0000 - fp: 26.0000 - tn: 181936.0000 - fn: 87.0000 - accuracy: 0.9994 - precision: 0.8972 - recall: 0.7229 - auc: 0.9278 - val_loss: 0.0056 - val_tp: 45.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 29.0000 - val_accuracy: 0.9992 - val_precision: 0.8654 - val_recall: 0.6081 - val_auc: 0.8872\n", "Epoch 17/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0046 - tp: 229.0000 - fp: 27.0000 - tn: 181935.0000 - fn: 85.0000 - accuracy: 0.9994 - precision: 0.8945 - recall: 0.7293 - auc: 0.9291 - val_loss: 0.0053 - val_tp: 44.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8800 - val_recall: 0.5946 - val_auc: 0.8894\n", "Epoch 18/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0044 - tp: 227.0000 - fp: 27.0000 - tn: 181935.0000 - fn: 87.0000 - accuracy: 0.9994 - precision: 0.8937 - recall: 0.7229 - auc: 0.9318 - val_loss: 0.0051 - val_tp: 44.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8627 - val_recall: 0.5946 - val_auc: 0.8912\n", "Epoch 19/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0042 - tp: 230.0000 - fp: 26.0000 - tn: 181936.0000 - fn: 84.0000 - accuracy: 0.9994 - precision: 0.8984 - recall: 0.7325 - auc: 0.9357 - val_loss: 0.0049 - val_tp: 44.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8800 - val_recall: 0.5946 - val_auc: 0.8925\n", "Epoch 20/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0040 - tp: 230.0000 - fp: 26.0000 - tn: 181936.0000 - fn: 84.0000 - accuracy: 0.9994 - precision: 0.8984 - recall: 0.7325 - auc: 0.9393 - val_loss: 0.0048 - val_tp: 45.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 29.0000 - val_accuracy: 0.9992 - val_precision: 0.8654 - val_recall: 0.6081 - val_auc: 0.8933\n", "Epoch 21/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0038 - tp: 232.0000 - fp: 28.0000 - tn: 181934.0000 - fn: 82.0000 - accuracy: 0.9994 - precision: 0.8923 - recall: 0.7389 - auc: 0.9414 - val_loss: 0.0046 - val_tp: 44.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 30.0000 - val_accuracy: 0.9992 - val_precision: 0.8800 - val_recall: 0.5946 - val_auc: 0.9074\n", "Epoch 22/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0037 - tp: 235.0000 - fp: 28.0000 - tn: 181934.0000 - fn: 79.0000 - accuracy: 0.9994 - precision: 0.8935 - recall: 0.7484 - auc: 0.9402 - val_loss: 0.0045 - val_tp: 45.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 29.0000 - val_accuracy: 0.9992 - val_precision: 0.8824 - val_recall: 0.6081 - val_auc: 0.9147\n", "Epoch 23/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0036 - tp: 238.0000 - fp: 29.0000 - tn: 181933.0000 - fn: 76.0000 - accuracy: 0.9994 - precision: 0.8914 - recall: 0.7580 - auc: 0.9468 - val_loss: 0.0043 - val_tp: 45.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 29.0000 - val_accuracy: 0.9992 - val_precision: 0.8824 - val_recall: 0.6081 - val_auc: 0.9154\n", "Epoch 24/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0035 - tp: 238.0000 - fp: 28.0000 - tn: 181934.0000 - fn: 76.0000 - accuracy: 0.9994 - precision: 0.8947 - recall: 0.7580 - auc: 0.9486 - val_loss: 0.0043 - val_tp: 45.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 29.0000 - val_accuracy: 0.9992 - val_precision: 0.8824 - val_recall: 0.6081 - val_auc: 0.9159\n", "Epoch 25/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0034 - tp: 239.0000 - fp: 27.0000 - tn: 181935.0000 - fn: 75.0000 - accuracy: 0.9994 - precision: 0.8985 - recall: 0.7611 - auc: 0.9456 - val_loss: 0.0041 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9162\n", "Epoch 26/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0033 - tp: 239.0000 - fp: 27.0000 - tn: 181935.0000 - fn: 75.0000 - accuracy: 0.9994 - precision: 0.8985 - recall: 0.7611 - auc: 0.9474 - val_loss: 0.0040 - val_tp: 47.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 27.0000 - val_accuracy: 0.9992 - val_precision: 0.8545 - val_recall: 0.6351 - val_auc: 0.9231\n", "Epoch 27/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0032 - tp: 242.0000 - fp: 28.0000 - tn: 181934.0000 - fn: 72.0000 - accuracy: 0.9995 - precision: 0.8963 - recall: 0.7707 - auc: 0.9461 - val_loss: 0.0040 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9101\n", "Epoch 28/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0031 - tp: 241.0000 - fp: 28.0000 - tn: 181934.0000 - fn: 73.0000 - accuracy: 0.9994 - precision: 0.8959 - recall: 0.7675 - auc: 0.9462 - val_loss: 0.0039 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9167\n", "Epoch 29/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0030 - tp: 239.0000 - fp: 26.0000 - tn: 181936.0000 - fn: 75.0000 - accuracy: 0.9994 - precision: 0.9019 - recall: 0.7611 - auc: 0.9464 - val_loss: 0.0038 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9305\n", "Epoch 30/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0030 - tp: 242.0000 - fp: 29.0000 - tn: 181933.0000 - fn: 72.0000 - accuracy: 0.9994 - precision: 0.8930 - recall: 0.7707 - auc: 0.9479 - val_loss: 0.0038 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9305\n", "Epoch 31/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0029 - tp: 243.0000 - fp: 26.0000 - tn: 181936.0000 - fn: 71.0000 - accuracy: 0.9995 - precision: 0.9033 - recall: 0.7739 - auc: 0.9481 - val_loss: 0.0037 - val_tp: 50.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 24.0000 - val_accuracy: 0.9993 - val_precision: 0.8772 - val_recall: 0.6757 - val_auc: 0.9307\n", "Epoch 32/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0029 - tp: 245.0000 - fp: 28.0000 - tn: 181934.0000 - fn: 69.0000 - accuracy: 0.9995 - precision: 0.8974 - recall: 0.7803 - auc: 0.9497 - val_loss: 0.0037 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9308\n", "Epoch 33/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0028 - tp: 244.0000 - fp: 28.0000 - tn: 181934.0000 - fn: 70.0000 - accuracy: 0.9995 - precision: 0.8971 - recall: 0.7771 - auc: 0.9498 - val_loss: 0.0037 - val_tp: 46.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 28.0000 - val_accuracy: 0.9992 - val_precision: 0.8679 - val_recall: 0.6216 - val_auc: 0.9309\n", "Epoch 34/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0028 - tp: 245.0000 - fp: 26.0000 - tn: 181936.0000 - fn: 69.0000 - accuracy: 0.9995 - precision: 0.9041 - recall: 0.7803 - auc: 0.9498 - val_loss: 0.0036 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9310\n", "Epoch 35/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0027 - tp: 244.0000 - fp: 26.0000 - tn: 181936.0000 - fn: 70.0000 - accuracy: 0.9995 - precision: 0.9037 - recall: 0.7771 - auc: 0.9514 - val_loss: 0.0036 - val_tp: 49.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8596 - val_recall: 0.6622 - val_auc: 0.9311\n", "Epoch 36/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0027 - tp: 246.0000 - fp: 30.0000 - tn: 181932.0000 - fn: 68.0000 - accuracy: 0.9995 - precision: 0.8913 - recall: 0.7834 - auc: 0.9499 - val_loss: 0.0036 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9311\n", "Epoch 37/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0026 - tp: 242.0000 - fp: 23.0000 - tn: 181939.0000 - fn: 72.0000 - accuracy: 0.9995 - precision: 0.9132 - recall: 0.7707 - auc: 0.9515 - val_loss: 0.0035 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9378\n", "Epoch 38/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0026 - tp: 246.0000 - fp: 23.0000 - tn: 181939.0000 - fn: 68.0000 - accuracy: 0.9995 - precision: 0.9145 - recall: 0.7834 - auc: 0.9500 - val_loss: 0.0035 - val_tp: 51.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 23.0000 - val_accuracy: 0.9993 - val_precision: 0.8644 - val_recall: 0.6892 - val_auc: 0.9379\n", "Epoch 39/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0026 - tp: 245.0000 - fp: 25.0000 - tn: 181937.0000 - fn: 69.0000 - accuracy: 0.9995 - precision: 0.9074 - recall: 0.7803 - auc: 0.9515 - val_loss: 0.0035 - val_tp: 49.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8750 - val_recall: 0.6622 - val_auc: 0.9312\n", "Epoch 40/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0025 - tp: 249.0000 - fp: 24.0000 - tn: 181938.0000 - fn: 65.0000 - accuracy: 0.9995 - precision: 0.9121 - recall: 0.7930 - auc: 0.9500 - val_loss: 0.0034 - val_tp: 49.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8750 - val_recall: 0.6622 - val_auc: 0.9380\n", "Epoch 41/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0025 - tp: 247.0000 - fp: 25.0000 - tn: 181937.0000 - fn: 67.0000 - accuracy: 0.9995 - precision: 0.9081 - recall: 0.7866 - auc: 0.9532 - val_loss: 0.0034 - val_tp: 49.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8750 - val_recall: 0.6622 - val_auc: 0.9380\n", "Epoch 42/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0025 - tp: 248.0000 - fp: 22.0000 - tn: 181940.0000 - fn: 66.0000 - accuracy: 0.9995 - precision: 0.9185 - recall: 0.7898 - auc: 0.9532 - val_loss: 0.0034 - val_tp: 49.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8750 - val_recall: 0.6622 - val_auc: 0.9380\n", "Epoch 43/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0024 - tp: 248.0000 - fp: 21.0000 - tn: 181941.0000 - fn: 66.0000 - accuracy: 0.9995 - precision: 0.9219 - recall: 0.7898 - auc: 0.9548 - val_loss: 0.0034 - val_tp: 50.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 24.0000 - val_accuracy: 0.9993 - val_precision: 0.8621 - val_recall: 0.6757 - val_auc: 0.9380\n", "Epoch 44/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0024 - tp: 249.0000 - fp: 23.0000 - tn: 181939.0000 - fn: 65.0000 - accuracy: 0.9995 - precision: 0.9154 - recall: 0.7930 - auc: 0.9548 - val_loss: 0.0034 - val_tp: 50.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 24.0000 - val_accuracy: 0.9993 - val_precision: 0.8621 - val_recall: 0.6757 - val_auc: 0.9247\n", "Epoch 45/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0024 - tp: 250.0000 - fp: 21.0000 - tn: 181941.0000 - fn: 64.0000 - accuracy: 0.9995 - precision: 0.9225 - recall: 0.7962 - auc: 0.9549 - val_loss: 0.0033 - val_tp: 50.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 24.0000 - val_accuracy: 0.9993 - val_precision: 0.8621 - val_recall: 0.6757 - val_auc: 0.9381\n", "Epoch 46/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0023 - tp: 247.0000 - fp: 20.0000 - tn: 181942.0000 - fn: 67.0000 - accuracy: 0.9995 - precision: 0.9251 - recall: 0.7866 - auc: 0.9549 - val_loss: 0.0033 - val_tp: 51.0000 - val_fp: 9.0000 - val_tn: 45486.0000 - val_fn: 23.0000 - val_accuracy: 0.9993 - val_precision: 0.8500 - val_recall: 0.6892 - val_auc: 0.9449\n", "Epoch 47/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0023 - tp: 247.0000 - fp: 23.0000 - tn: 181939.0000 - fn: 67.0000 - accuracy: 0.9995 - precision: 0.9148 - recall: 0.7866 - auc: 0.9549 - val_loss: 0.0033 - val_tp: 49.0000 - val_fp: 9.0000 - val_tn: 45486.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8448 - val_recall: 0.6622 - val_auc: 0.9449\n", "Epoch 48/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0023 - tp: 249.0000 - fp: 20.0000 - tn: 181942.0000 - fn: 65.0000 - accuracy: 0.9995 - precision: 0.9257 - recall: 0.7930 - auc: 0.9565 - val_loss: 0.0033 - val_tp: 51.0000 - val_fp: 9.0000 - val_tn: 45486.0000 - val_fn: 23.0000 - val_accuracy: 0.9993 - val_precision: 0.8500 - val_recall: 0.6892 - val_auc: 0.9449\n", "Epoch 49/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0023 - tp: 247.0000 - fp: 19.0000 - tn: 181943.0000 - fn: 67.0000 - accuracy: 0.9995 - precision: 0.9286 - recall: 0.7866 - auc: 0.9565 - val_loss: 0.0033 - val_tp: 45.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 29.0000 - val_accuracy: 0.9992 - val_precision: 0.8491 - val_recall: 0.6081 - val_auc: 0.9382\n", "Epoch 50/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0023 - tp: 246.0000 - fp: 19.0000 - tn: 181943.0000 - fn: 68.0000 - accuracy: 0.9995 - precision: 0.9283 - recall: 0.7834 - auc: 0.9565 - val_loss: 0.0032 - val_tp: 51.0000 - val_fp: 9.0000 - val_tn: 45486.0000 - val_fn: 23.0000 - val_accuracy: 0.9993 - val_precision: 0.8500 - val_recall: 0.6892 - val_auc: 0.9517\n", "Epoch 51/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0022 - tp: 248.0000 - fp: 20.0000 - tn: 181942.0000 - fn: 66.0000 - accuracy: 0.9995 - precision: 0.9254 - recall: 0.7898 - auc: 0.9581 - val_loss: 0.0033 - val_tp: 51.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 23.0000 - val_accuracy: 0.9993 - val_precision: 0.8644 - val_recall: 0.6892 - val_auc: 0.9450\n", "Epoch 52/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0022 - tp: 247.0000 - fp: 21.0000 - tn: 181941.0000 - fn: 67.0000 - accuracy: 0.9995 - precision: 0.9216 - recall: 0.7866 - auc: 0.9581 - val_loss: 0.0032 - val_tp: 50.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 24.0000 - val_accuracy: 0.9993 - val_precision: 0.8621 - val_recall: 0.6757 - val_auc: 0.9450\n", "Epoch 53/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0022 - tp: 245.0000 - fp: 19.0000 - tn: 181943.0000 - fn: 69.0000 - accuracy: 0.9995 - precision: 0.9280 - recall: 0.7803 - auc: 0.9581 - val_loss: 0.0032 - val_tp: 45.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 29.0000 - val_accuracy: 0.9992 - val_precision: 0.8491 - val_recall: 0.6081 - val_auc: 0.9450\n", "Epoch 54/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0022 - tp: 250.0000 - fp: 18.0000 - tn: 181944.0000 - fn: 64.0000 - accuracy: 0.9996 - precision: 0.9328 - recall: 0.7962 - auc: 0.9581 - val_loss: 0.0032 - val_tp: 47.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 27.0000 - val_accuracy: 0.9992 - val_precision: 0.8545 - val_recall: 0.6351 - val_auc: 0.9517\n", "Epoch 55/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0021 - tp: 249.0000 - fp: 16.0000 - tn: 181946.0000 - fn: 65.0000 - accuracy: 0.9996 - precision: 0.9396 - recall: 0.7930 - auc: 0.9581 - val_loss: 0.0032 - val_tp: 51.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 23.0000 - val_accuracy: 0.9993 - val_precision: 0.8644 - val_recall: 0.6892 - val_auc: 0.9450\n", "Epoch 56/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0021 - tp: 248.0000 - fp: 19.0000 - tn: 181943.0000 - fn: 66.0000 - accuracy: 0.9995 - precision: 0.9288 - recall: 0.7898 - auc: 0.9597 - val_loss: 0.0032 - val_tp: 52.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 22.0000 - val_accuracy: 0.9993 - val_precision: 0.8667 - val_recall: 0.7027 - val_auc: 0.9517\n", "Epoch 57/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0021 - tp: 252.0000 - fp: 19.0000 - tn: 181943.0000 - fn: 62.0000 - accuracy: 0.9996 - precision: 0.9299 - recall: 0.8025 - auc: 0.9597 - val_loss: 0.0032 - val_tp: 47.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 27.0000 - val_accuracy: 0.9992 - val_precision: 0.8545 - val_recall: 0.6351 - val_auc: 0.9450\n", "Epoch 58/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0021 - tp: 253.0000 - fp: 19.0000 - tn: 181943.0000 - fn: 61.0000 - accuracy: 0.9996 - precision: 0.9301 - recall: 0.8057 - auc: 0.9597 - val_loss: 0.0032 - val_tp: 48.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 26.0000 - val_accuracy: 0.9993 - val_precision: 0.8571 - val_recall: 0.6486 - val_auc: 0.9517\n", "Epoch 59/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0021 - tp: 249.0000 - fp: 18.0000 - tn: 181944.0000 - fn: 65.0000 - accuracy: 0.9995 - precision: 0.9326 - recall: 0.7930 - auc: 0.9582 - val_loss: 0.0031 - val_tp: 48.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 26.0000 - val_accuracy: 0.9993 - val_precision: 0.8571 - val_recall: 0.6486 - val_auc: 0.9517\n", "Epoch 60/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0020 - tp: 252.0000 - fp: 18.0000 - tn: 181944.0000 - fn: 62.0000 - accuracy: 0.9996 - precision: 0.9333 - recall: 0.8025 - auc: 0.9598 - val_loss: 0.0031 - val_tp: 50.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 24.0000 - val_accuracy: 0.9993 - val_precision: 0.8621 - val_recall: 0.6757 - val_auc: 0.9518\n", "Epoch 61/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0020 - tp: 251.0000 - fp: 15.0000 - tn: 181947.0000 - fn: 63.0000 - accuracy: 0.9996 - precision: 0.9436 - recall: 0.7994 - auc: 0.9598 - val_loss: 0.0031 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9518\n", "Epoch 62/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0020 - tp: 255.0000 - fp: 14.0000 - tn: 181948.0000 - fn: 59.0000 - accuracy: 0.9996 - precision: 0.9480 - recall: 0.8121 - auc: 0.9598 - val_loss: 0.0031 - val_tp: 48.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 26.0000 - val_accuracy: 0.9993 - val_precision: 0.8571 - val_recall: 0.6486 - val_auc: 0.9518\n", "Epoch 63/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0020 - tp: 252.0000 - fp: 19.0000 - tn: 181943.0000 - fn: 62.0000 - accuracy: 0.9996 - precision: 0.9299 - recall: 0.8025 - auc: 0.9598 - val_loss: 0.0032 - val_tp: 48.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 26.0000 - val_accuracy: 0.9993 - val_precision: 0.8571 - val_recall: 0.6486 - val_auc: 0.9451\n", "Epoch 64/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0020 - tp: 251.0000 - fp: 15.0000 - tn: 181947.0000 - fn: 63.0000 - accuracy: 0.9996 - precision: 0.9436 - recall: 0.7994 - auc: 0.9614 - val_loss: 0.0031 - val_tp: 52.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 22.0000 - val_accuracy: 0.9993 - val_precision: 0.8667 - val_recall: 0.7027 - val_auc: 0.9518\n", "Epoch 65/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0020 - tp: 254.0000 - fp: 18.0000 - tn: 181944.0000 - fn: 60.0000 - accuracy: 0.9996 - precision: 0.9338 - recall: 0.8089 - auc: 0.9598 - val_loss: 0.0031 - val_tp: 49.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8596 - val_recall: 0.6622 - val_auc: 0.9518\n", "Epoch 66/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0020 - tp: 253.0000 - fp: 18.0000 - tn: 181944.0000 - fn: 61.0000 - accuracy: 0.9996 - precision: 0.9336 - recall: 0.8057 - auc: 0.9614 - val_loss: 0.0032 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9384\n", "Epoch 67/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0020 - tp: 254.0000 - fp: 17.0000 - tn: 181945.0000 - fn: 60.0000 - accuracy: 0.9996 - precision: 0.9373 - recall: 0.8089 - auc: 0.9614 - val_loss: 0.0031 - val_tp: 48.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 26.0000 - val_accuracy: 0.9993 - val_precision: 0.8571 - val_recall: 0.6486 - val_auc: 0.9519\n", "Epoch 68/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0019 - tp: 253.0000 - fp: 17.0000 - tn: 181945.0000 - fn: 61.0000 - accuracy: 0.9996 - precision: 0.9370 - recall: 0.8057 - auc: 0.9645 - val_loss: 0.0031 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9519\n", "Epoch 69/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0019 - tp: 254.0000 - fp: 17.0000 - tn: 181945.0000 - fn: 60.0000 - accuracy: 0.9996 - precision: 0.9373 - recall: 0.8089 - auc: 0.9630 - val_loss: 0.0031 - val_tp: 46.0000 - val_fp: 5.0000 - val_tn: 45490.0000 - val_fn: 28.0000 - val_accuracy: 0.9993 - val_precision: 0.9020 - val_recall: 0.6216 - val_auc: 0.9519\n", "Epoch 70/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0019 - tp: 254.0000 - fp: 15.0000 - tn: 181947.0000 - fn: 60.0000 - accuracy: 0.9996 - precision: 0.9442 - recall: 0.8089 - auc: 0.9630 - val_loss: 0.0031 - val_tp: 52.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 22.0000 - val_accuracy: 0.9993 - val_precision: 0.8667 - val_recall: 0.7027 - val_auc: 0.9519\n", "Epoch 71/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0019 - tp: 256.0000 - fp: 18.0000 - tn: 181944.0000 - fn: 58.0000 - accuracy: 0.9996 - precision: 0.9343 - recall: 0.8153 - auc: 0.9630 - val_loss: 0.0031 - val_tp: 51.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 23.0000 - val_accuracy: 0.9993 - val_precision: 0.8644 - val_recall: 0.6892 - val_auc: 0.9519\n", "Epoch 72/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0019 - tp: 254.0000 - fp: 16.0000 - tn: 181946.0000 - fn: 60.0000 - accuracy: 0.9996 - precision: 0.9407 - recall: 0.8089 - auc: 0.9630 - val_loss: 0.0031 - val_tp: 48.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 26.0000 - val_accuracy: 0.9993 - val_precision: 0.8571 - val_recall: 0.6486 - val_auc: 0.9519\n", "Epoch 73/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0018 - tp: 260.0000 - fp: 15.0000 - tn: 181947.0000 - fn: 54.0000 - accuracy: 0.9996 - precision: 0.9455 - recall: 0.8280 - auc: 0.9646 - val_loss: 0.0031 - val_tp: 47.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8868 - val_recall: 0.6351 - val_auc: 0.9519\n", "Epoch 74/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0018 - tp: 254.0000 - fp: 16.0000 - tn: 181946.0000 - fn: 60.0000 - accuracy: 0.9996 - precision: 0.9407 - recall: 0.8089 - auc: 0.9630 - val_loss: 0.0031 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9519\n", "Epoch 75/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0018 - tp: 255.0000 - fp: 15.0000 - tn: 181947.0000 - fn: 59.0000 - accuracy: 0.9996 - precision: 0.9444 - recall: 0.8121 - auc: 0.9646 - val_loss: 0.0030 - val_tp: 49.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8750 - val_recall: 0.6622 - val_auc: 0.9519\n", "Epoch 76/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0018 - tp: 259.0000 - fp: 16.0000 - tn: 181946.0000 - fn: 55.0000 - accuracy: 0.9996 - precision: 0.9418 - recall: 0.8248 - auc: 0.9646 - val_loss: 0.0031 - val_tp: 47.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8704 - val_recall: 0.6351 - val_auc: 0.9452\n", "Epoch 77/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0018 - tp: 258.0000 - fp: 14.0000 - tn: 181948.0000 - fn: 56.0000 - accuracy: 0.9996 - precision: 0.9485 - recall: 0.8217 - auc: 0.9630 - val_loss: 0.0030 - val_tp: 49.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8750 - val_recall: 0.6622 - val_auc: 0.9519\n", "Epoch 78/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0018 - tp: 261.0000 - fp: 14.0000 - tn: 181948.0000 - fn: 53.0000 - accuracy: 0.9996 - precision: 0.9491 - recall: 0.8312 - auc: 0.9630 - val_loss: 0.0031 - val_tp: 47.0000 - val_fp: 5.0000 - val_tn: 45490.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.9038 - val_recall: 0.6351 - val_auc: 0.9453\n", "Epoch 79/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0018 - tp: 256.0000 - fp: 15.0000 - tn: 181947.0000 - fn: 58.0000 - accuracy: 0.9996 - precision: 0.9446 - recall: 0.8153 - auc: 0.9630 - val_loss: 0.0030 - val_tp: 52.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 22.0000 - val_accuracy: 0.9994 - val_precision: 0.8814 - val_recall: 0.7027 - val_auc: 0.9519\n", "Epoch 80/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0017 - tp: 258.0000 - fp: 12.0000 - tn: 181950.0000 - fn: 56.0000 - accuracy: 0.9996 - precision: 0.9556 - recall: 0.8217 - auc: 0.9646 - val_loss: 0.0030 - val_tp: 48.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 26.0000 - val_accuracy: 0.9993 - val_precision: 0.8727 - val_recall: 0.6486 - val_auc: 0.9519\n", "Epoch 81/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0017 - tp: 261.0000 - fp: 13.0000 - tn: 181949.0000 - fn: 53.0000 - accuracy: 0.9996 - precision: 0.9526 - recall: 0.8312 - auc: 0.9630 - val_loss: 0.0030 - val_tp: 49.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8750 - val_recall: 0.6622 - val_auc: 0.9519\n", "Epoch 82/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0017 - tp: 258.0000 - fp: 16.0000 - tn: 181946.0000 - fn: 56.0000 - accuracy: 0.9996 - precision: 0.9416 - recall: 0.8217 - auc: 0.9646 - val_loss: 0.0031 - val_tp: 47.0000 - val_fp: 6.0000 - val_tn: 45489.0000 - val_fn: 27.0000 - val_accuracy: 0.9993 - val_precision: 0.8868 - val_recall: 0.6351 - val_auc: 0.9453\n", "Epoch 83/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0017 - tp: 258.0000 - fp: 12.0000 - tn: 181950.0000 - fn: 56.0000 - accuracy: 0.9996 - precision: 0.9556 - recall: 0.8217 - auc: 0.9662 - val_loss: 0.0030 - val_tp: 48.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 26.0000 - val_accuracy: 0.9993 - val_precision: 0.8571 - val_recall: 0.6486 - val_auc: 0.9520\n", "Epoch 84/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0017 - tp: 259.0000 - fp: 13.0000 - tn: 181949.0000 - fn: 55.0000 - accuracy: 0.9996 - precision: 0.9522 - recall: 0.8248 - auc: 0.9662 - val_loss: 0.0031 - val_tp: 54.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 20.0000 - val_accuracy: 0.9994 - val_precision: 0.8710 - val_recall: 0.7297 - val_auc: 0.9452\n", "Epoch 85/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0017 - tp: 259.0000 - fp: 13.0000 - tn: 181949.0000 - fn: 55.0000 - accuracy: 0.9996 - precision: 0.9522 - recall: 0.8248 - auc: 0.9662 - val_loss: 0.0030 - val_tp: 51.0000 - val_fp: 9.0000 - val_tn: 45486.0000 - val_fn: 23.0000 - val_accuracy: 0.9993 - val_precision: 0.8500 - val_recall: 0.6892 - val_auc: 0.9520\n", "Epoch 86/100\n", "90/90 [==============================] - 1s 10ms/step - loss: 0.0017 - tp: 264.0000 - fp: 15.0000 - tn: 181947.0000 - fn: 50.0000 - accuracy: 0.9996 - precision: 0.9462 - recall: 0.8408 - auc: 0.9678 - val_loss: 0.0031 - val_tp: 49.0000 - val_fp: 7.0000 - val_tn: 45488.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8750 - val_recall: 0.6622 - val_auc: 0.9386\n", "Epoch 87/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0017 - tp: 259.0000 - fp: 11.0000 - tn: 181951.0000 - fn: 55.0000 - accuracy: 0.9996 - precision: 0.9593 - recall: 0.8248 - auc: 0.9662 - val_loss: 0.0030 - val_tp: 51.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 23.0000 - val_accuracy: 0.9993 - val_precision: 0.8644 - val_recall: 0.6892 - val_auc: 0.9520\n", "Epoch 88/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0017 - tp: 260.0000 - fp: 13.0000 - tn: 181949.0000 - fn: 54.0000 - accuracy: 0.9996 - precision: 0.9524 - recall: 0.8280 - auc: 0.9662 - val_loss: 0.0031 - val_tp: 54.0000 - val_fp: 9.0000 - val_tn: 45486.0000 - val_fn: 20.0000 - val_accuracy: 0.9994 - val_precision: 0.8571 - val_recall: 0.7297 - val_auc: 0.9519\n", "Epoch 89/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0018 - tp: 271.0000 - fp: 30.0000 - tn: 181932.0000 - fn: 43.0000 - accuracy: 0.9996 - precision: 0.9003 - recall: 0.8631 - auc: 0.9678 - val_loss: 0.0031 - val_tp: 48.0000 - val_fp: 5.0000 - val_tn: 45490.0000 - val_fn: 26.0000 - val_accuracy: 0.9993 - val_precision: 0.9057 - val_recall: 0.6486 - val_auc: 0.9453\n", "Epoch 90/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0016 - tp: 263.0000 - fp: 12.0000 - tn: 181950.0000 - fn: 51.0000 - accuracy: 0.9997 - precision: 0.9564 - recall: 0.8376 - auc: 0.9694 - val_loss: 0.0031 - val_tp: 51.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 23.0000 - val_accuracy: 0.9993 - val_precision: 0.8644 - val_recall: 0.6892 - val_auc: 0.9452\n", "Epoch 91/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0016 - tp: 268.0000 - fp: 13.0000 - tn: 181949.0000 - fn: 46.0000 - accuracy: 0.9997 - precision: 0.9537 - recall: 0.8535 - auc: 0.9678 - val_loss: 0.0031 - val_tp: 49.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8596 - val_recall: 0.6622 - val_auc: 0.9386\n", "Epoch 92/100\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0016 - tp: 265.0000 - fp: 13.0000 - tn: 181949.0000 - fn: 49.0000 - accuracy: 0.9997 - precision: 0.9532 - recall: 0.8439 - auc: 0.9726 - val_loss: 0.0031 - val_tp: 48.0000 - val_fp: 4.0000 - val_tn: 45491.0000 - val_fn: 26.0000 - val_accuracy: 0.9993 - val_precision: 0.9231 - val_recall: 0.6486 - val_auc: 0.9453\n", "Epoch 93/100\n", "86/90 [===========================>..] - ETA: 0s - loss: 0.0016 - tp: 253.0000 - fp: 10.0000 - tn: 175816.0000 - fn: 49.0000 - accuracy: 0.9997 - precision: 0.9620 - recall: 0.8377 - auc: 0.9715Restoring model weights from the end of the best epoch.\n", "90/90 [==============================] - 1s 9ms/step - loss: 0.0016 - tp: 264.0000 - fp: 13.0000 - tn: 181949.0000 - fn: 50.0000 - accuracy: 0.9997 - precision: 0.9531 - recall: 0.8408 - auc: 0.9726 - val_loss: 0.0031 - val_tp: 49.0000 - val_fp: 8.0000 - val_tn: 45487.0000 - val_fn: 25.0000 - val_accuracy: 0.9993 - val_precision: 0.8596 - val_recall: 0.6622 - val_auc: 0.9453\n", "Epoch 00093: early stopping\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "k48ktVgcTCD6" }, "source": [ "### Análise dos resultados\n", "\n", "Vamos fazer os gráficos da função de custo e de algumas métricas dos resultados dos conjuntos de treinamento e validação. Eles são úteis para verificar se há \"overfitting\". Além disso, vamos gráficos de algumas métricas criadas. " ] }, { "cell_type": "code", "metadata": { "id": "WRBHI7ojTFxm" }, "source": [ "# Define função para fazer graficos de algumas métricas\n", "def plot_metrics(history):\n", " metrics = ['loss', 'auc', 'precision', 'recall']\n", " plt.figure(figsize=(12,8))\n", " for n, metric in enumerate(metrics):\n", " name = metric.replace(\"_\",\" \").capitalize()\n", " plt.subplot(2,2,n+1)\n", " plt.plot(history.epoch, history.history[metric], color='crimson', label='Train')\n", " plt.plot(history.epoch, history.history['val_'+metric],\n", " color='darkblue', linestyle=\"--\", label='Val')\n", " plt.xlabel('Epoch')\n", " plt.ylabel(name)\n", " if metric == 'loss':\n", " plt.ylim([0, plt.ylim()[1]])\n", " elif metric == 'auc':\n", " plt.ylim([0.8,1])\n", " else:\n", " plt.ylim([0,1])\n", "\n", " plt.legend()\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "FyTxr2GUTJOM", "outputId": "ba4ed056-6528-41a8-8358-2c2f0378c023", "colab": { "base_uri": "https://localhost:8080/", "height": 464 } }, "source": [ "plot_metrics(history)" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "code", "metadata": { "id": "IZ6qr1YZTfbu", "outputId": "450dccb6-dadb-4eb8-ec0a-a08c6b7a01a9", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "print('Número de exemplos positivos do conjunto de teste =', len(test_labels[test_labels>0.9]))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Número de exemplos positivos do conjunto de teste = 104\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "zfy3XNSpTiyC", "outputId": "b151dd37-c22f-4497-b4ea-abb7b27cad3c", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "base_results = rna.evaluate(test_features, test_labels,\n", " batch_size=BATCH_SIZE, verbose=0)\n", "for name, value in zip(rna.metrics_names, base_results):\n", " print(name, ': ', value)\n", "print()" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "loss : 0.00329265627078712\n", "tp : 78.0\n", "fp : 4.0\n", "tn : 56854.0\n", "fn : 26.0\n", "accuracy : 0.9994733333587646\n", "precision : 0.9512194991111755\n", "recall : 0.75\n", "auc : 0.92237389087677\n", "\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "8E3rlXp0TpJ_", "outputId": "27606d1c-c5d1-4402-a032-2e49a3bd9597", "colab": { "base_uri": "https://localhost:8080/" } }, "source": [ "precision = base_results[5]\n", "recall = base_results[6]\n", "F1 = 2*precision*recall/(precision + recall)\n", "print('Pontuação F1 = ', F1)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Pontuação F1 = 0.9747495943056442\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "A2v-gX53T5YE", "outputId": "531a4733-e0e4-4a98-b361-dc294e82994f", "colab": { "base_uri": "https://localhost:8080/", "height": 346 } }, "source": [ "train_pred_base = rna.predict(train_features, batch_size=BATCH_SIZE)\n", "test_pred_base = rna.predict(test_features, batch_size=BATCH_SIZE)\n", "\n", "conf_mat = confusion_matrix(y_true=test_labels, y_pred=np.round(test_pred_base))\n", "print('Matriz de confusão:\\n', conf_mat)\n", "\n", "labels = ['Class 0', 'Class 1']\n", "plt.figure(figsize=(6,6))\n", "fig = plt.figure()\n", "ax = fig.add_subplot(111)\n", "cax = ax.matshow(conf_mat, cmap=plt.cm.Blues)\n", "fig.colorbar(cax)\n", "ax.set_xticklabels([''] + labels)\n", "ax.set_yticklabels([''] + labels)\n", "plt.xlabel('Previsto')\n", "plt.ylabel('Esperado')\n", "plt.show()" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Matriz de confusão:\n", " [[56854 4]\n", " [ 26 78]]\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "text/plain": [ "
" ] }, "metadata": { "tags": [] } }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "amkNfGmVT1la" }, "source": [ "Se o modelo tivesse previsto tudo perfeitamente, a matriz de confusão seria uma matriz diagonal com os valores fora da diagonal principal, indicando as previsões incorretas, iguais a zero. Nesse caso, a matriz mostra que se tem relativamente poucos falsos positivos, o que significa que havia relativamente poucas transações legítimas que foram sinalizadas incorretamente. No entanto, seria desejado ter menos falsos negativos, apesar do custo de aumentar o número de falsos positivos. Essa troca pode ser preferível porque os falsos negativos permitiriam a realização de transações fraudulentas, ao passo que os falsos positivos podem fazer com que um e-mail seja enviado a um cliente solicitando a verificação da atividade do cartão." ] } ] }