{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Regressão Logística" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introdução\n", "\n", "Na aprendizagem de máquina supervisionada, quando a resposta que precisa ser prevista é qualitativa (discreta), é usado o processo chamado de Classificação. São problemas de classificação, por exemplo, decidir se um e-mail recebido é spam ou não, ou decidir se uma foto contém a imagem de um gato, cachorro ou um pássaro.\n", "\n", "Para funcionar, um classificador precisa ser treinado usando dados de treinamento. Cada exemplo nos dados de treinamento possui um vetor de características $(x_1, x_2, ..., x_n)$ e uma resposta associada $y$ que é a classificação do exemplo.\n", "\n", "Apesar do nome, Regressão Logística é um algoritmo de classificação que pode ser usado para resolver problemas com duas ou mais possíveis classes. Entretanto, para facilitar o entendimento, consideraremos que $y$ pode ter apenas dois valores, 0 ou 1, sendo 0 uma classe e 1 a outra." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Função logística\n", "\n", "Com as respostas variando apenas entre dois valores, 0 e 1, usar regressão linear não é adequado, pois ela pode prever qualquer valor contínuo que pode ir muito além dos limites de 0 e 1. Assim, mudaremos a função $f(x)$, que representa a hipótese para explicar os dados, para uma função que varie apenas entre 0 e 1.\n", "\n", "Na regressão logística usaremos a função logística da seguinte forma:\n", "\n", "$$f(x) = g(w^Tx)$$\n", "\n", "$$g(z) = \\frac{1}{1+e^{-z}}$$\n", "\n", "Perceba que continua-se usando $w^Tx$ como na regressão linear, mas agora aplica-se o resultado na função logística $g(z)$.\n", "\n", "A seguir temos a implementação das duas funções acima, $f(x)$ e $g(z)$. $f(x)$ recebe o vetor de coeficientes $w$ e as características $x$, já $g(z)$ recebe apenas um valor que é aplicado a função logística." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "import math\n", "\n", "def f(x, w):\n", " z = 0\n", "\n", " for i in range(len(x)):\n", " z += x[i]*w[i]\n", " \n", " return g(z)\n", "\n", "def g(z):\n", " return 1 / (1 + math.exp(-z))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A função logística tem uma forma de \"S\" como pode ser vista no gráfico seguir:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "\n", "(function(global) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " var force = true;\n", "\n", " if (typeof (window._bokeh_onload_callbacks) === \"undefined\" || force === true) {\n", " window._bokeh_onload_callbacks = [];\n", " window._bokeh_is_loading = undefined;\n", " }\n", "\n", "\n", " \n", " if (typeof (window._bokeh_timeout) === \"undefined\" || force === true) {\n", " window._bokeh_timeout = Date.now() + 5000;\n", " window._bokeh_failed_load = false;\n", " }\n", "\n", " var NB_LOAD_WARNING = {'data': {'text/html':\n", " \"\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"
\\n\"+\n", " \"\\n\"+\n",
" \"from bokeh.resources import INLINE\\n\"+\n",
" \"output_notebook(resources=INLINE)\\n\"+\n",
" \"
\\n\"+\n",
" \"<Bokeh Notebook handle for In[2]>
<Bokeh Notebook handle for In[3]>
<Bokeh Notebook handle for In[4]>
<Bokeh Notebook handle for In[7]>
<Bokeh Notebook handle for In[11]>
<Bokeh Notebook handle for In[16]>