No artigo anterior “Introdução à classificação e regressão logística” esbocei os fundamentos matemáticos do algoritmo de regressão logística, cuja tarefa é separar coisas no exemplo de treinamento através do cálculo do limite de decisão.
O limite de decisão pode ser descrito por uma equação. Tal como na regressão linear, o algoritmo de regressão logística será capaz de encontrar os melhores parâmetros para que o limite de decisão realmente separe os pontos de dados corretamente. Neste artigo veremos como computar esses \thetas.
Suponha que temos um conjunto de treinamento genérico
\{ (x^{(1)}, y^{(1)}), (x^{(2)}, y^{(2)}), \dots, (x^{(m)}, y^{(m)})
exemplos de treino m, onde (x^{(1)}, y^{(1)}) é o 1º exemplo e assim por diante. Mais especificamente, x^{(m)} é a variável de entrada do m-ésimo exemplo, enquanto y^{(m)} é a sua variável de saída. Sendo este um problema de classificação, cada exemplo tem, naturalmente, a saída y ligada entre 0 e 1. Em outras palavras, y \ em {0,1}.
Cada exemplo é representado como de costume pelo seu vector de característica
\vec{x} = \begin{bmatrix} x_0 \\ x_1 \ \ {bmatrix}
onde x_0 = 1 (o mesmo velho truque). Este é um exemplo genérico, não sabemos o número exato de características.
Finalmente temos a função de hipótese para regressão logística, como visto no artigo anterior:
h_theta(x) = \frac{1}{1 + e^{\theta^{\theta^{\top} x}}
A nossa tarefa agora é escolher os melhores parâmetros na equação acima, dado o conjunto de treinamento atual, a fim de minimizar erros. Lembre-se que \theta não é um parâmetro único: ele se expande para a equação do limite de decisão que pode ser uma linha ou uma fórmula mais complexa (com mais \thetas para adivinhar).
O procedimento é semelhante ao que fizemos para a regressão linear: definir uma função de custo e tentar encontrar os melhores valores possíveis de cada \theta, minimizando a saída da função de custo. A minimização será feita por um algoritmo de descida de gradiente, cuja tarefa é analisar a saída da função de custo até encontrar o menor ponto mínimo.
A função de custo usada na regressão linear não funcionará aqui
Você deve se lembrar da função de custo original J(\theta) usada na regressão linear. Posso dizer-lhe agora mesmo que não vai funcionar aqui com a regressão logística. Se você tentar usar a função de custo da regressão linear para gerar J(\theta) em um problema de regressão logística, você acabaria com uma função não convexa: um gráfico em forma de esferográfica, sem facilidade de encontrar o ponto global mínimo, como visto na figura abaixo.
Este estranho resultado é devido ao fato de que na regressão logística temos a função sigmóide ao redor, que é não-linear (ou seja, não uma linha). Com o J(\theta) representado na figura 1. o algoritmo de descida de gradiente pode ficar preso em um ponto mínimo local. É por isso que ainda necessitamos de uma função convexa limpa como fizemos para a regressão linear: uma função em forma de taça que facilita o trabalho da função de descida de gradiente para convergir para o ponto mínimo ideal.
Uma melhor função de custo para a regressão logística
Deixe-me voltar por um minuto à função de custo que usamos na regressão linear:
J(\vec{\theta}) = \frac{1}{2m} \(h_theta(x^{(i)}) – y^{(i)})^2
que pode ser reescrito de uma forma ligeiramente diferente:
J(\vec{\theta}) = \frac{1}{m} \SUM_{i=1}^{m} \Frac{1}{2}(h_theta(x^{(i)}) – y^{(i)})^2
Nada assustadora aconteceu: Acabei de mover o \frac{1}{2}{2} para junto da parte da soma. Agora vamos torná-la mais geral definindo uma nova função
\mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) = \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
Em palavras, uma função \mathrm{Cost} que leva dois parâmetros na entrada: h_\theta(x^{(i)}) como função de hipótese e y^{(i)} como saída. Você pode pensar nele como o custo que o algoritmo tem que pagar se ele fizer uma previsão h_\theta(x^{(i)}) enquanto a etiqueta real era y^{(i)}.
Com esta nova peça do quebra-cabeça eu posso reescrever a função de custo para a regressão linear da seguinte forma:
J(Theta) = {1}dfrac{m} \sum_{i=1}^m {Cost}(h_theta(x^{(i)}),y^{(i)})
No entanto, sabemos que a função de custo da regressão linear não pode ser usada em problemas de regressão logística. Então, do que se trata tudo isto? Bem, acontece que para a regressão logística só temos de encontrar uma função diferente \mathrm{Cost}, enquanto a parte da soma permanece a mesma.
Função de custo da regressão logística
Para a regressão logística, a função {Custo} é definida como:
\mathrm{Custo}(h_theta(x),y) ={casos}-log(h_theta(x)) & {se y = 1}text \\-\log(1-h_\theta(x)) & {se y = 0}{cases}
Os índices i foram removidos para maior clareza. Em palavras este é o custo que o algoritmo paga se ele prevê um valor h_\theta(x) enquanto a etiqueta de custo real acaba sendo y. Ao usar esta função vamos conceder a convexidade à função que o algoritmo de descida de gradiente tem que processar, como discutido acima. Há também uma prova matemática para isso, que está fora do escopo deste curso introdutório.
No caso y = 1, a saída (ou seja, o custo a pagar) aproxima-se de 0 como h_\theta(x) aproxima-se de 1. Inversamente, o custo a pagar cresce até ao infinito à medida que h_theta(x) se aproxima de 0. Você pode vê-lo claramente no gráfico 2. abaixo, do lado esquerdo. Esta é uma propriedade desejável: queremos uma penalização maior, pois o algoritmo prevê algo muito longe do valor real. Se a etiqueta é y = 1 mas o algoritmo prevê h_\theta(x) = 0, o resultado é completamente errado.
Conversamente, a mesma intuição aplica-se quando y = 0, representado no gráfico 2. abaixo, do lado direito. Penalidades maiores quando a etiqueta é y = 0 mas o algoritmo prevê h_\theta(x) = 1.
Otimizações da função de custo adicional
O que acabamos de ver é a versão verbosa da função de custo para regressão logística. Podemos torná-la mais compacta em uma expressão de uma linha: isto ajudará a evitar declarações if/else chatas ao converter a fórmula em um algoritmo.
\mathrm{Cost}(h_\theta(x),y) = -y \log(h_\theta(x)) – (1 – y) \log(1-h_\theta(x))
Proof: tente substituir y por 0 e 1 e você vai acabar com as duas partes da função original.
Com a optimização no lugar, a função de regressão logística pode ser reescrita como:
\begin{align}J(\theta) & = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \\& = -dfrac{1}{m}
Mudei o sinal menos para fora para evitar parênteses adicionais.
Ajustar a função de custo e a descida do gradiente juntos
O que resta? Nós temos a função hipótese e a função custo: estamos quase terminando. Agora é hora de encontrar os melhores valores para os parâmetros da função de custo, ou seja, minimizar a função de custo executando o algoritmo de descida de gradiente. O procedimento é idêntico ao que fizemos para a regressão linear.
Mais formalmente, queremos minimizar a função de custo:
\min_{\theta} J(\theta)
Que irá gerar um conjunto de parâmetros \theta, os melhores (ou seja, com menos erro). Uma vez feito, estaremos prontos para fazer previsões sobre novos exemplos de entrada com suas características x, usando as novas ^tetas na função de hipóteses:
h_theta(x) = \frac{1}{1 + e^theta^{\theta^{\theta} x}}
Onde h_theta(x) é a saída, a previsão, ou ainda a probabilidade de y = 1.
A forma como vamos minimizar a função de custo é usando a descida de gradiente. A boa notícia é que o procedimento é 99% idêntico ao que fizemos para a regressão linear.
Para minimizar a função de custo temos de executar a função de descida de gradiente em cada parâmetro:
\begin{align} \texto (repetição até à convergência) \\\theta_j & :=theta_j -alpha {\an1}frac{\an1}theta_j J(theta) {\i1}text{\i}}end{\i}
Rembrar de atualizar simultaneamente todos {\i}theta_j como fizemos na contrapartida da regressão linear: se você tem n características, isso é um vetor de característica {\i}vec{\i} = , todos esses parâmetros têm de ser atualizados simultaneamente em cada iteração:
\i}begin{align} \texto (repetição até à convergência) \\\theta_0 & :=cdots {\an1}theta_1 & :=cdots {\an1}theta_n & := Tradução: Equipa PT-Subs J(theta), que se torna:
frac{\i1}{\i1}parcialmente {\i}theta_j} J(\theta) = \dfrac{1}{m} \(h_theta(x^{(i)}) – y^{(i)}) x_j^{(i)}) x_j^{(i)}
Assim o laço acima pode ser reescrito como:
\begin{align} \texto (repetição até à convergência) \\\theta_j & :=theta_j – alpha {1}dfrac{1}{m} \h_theta(x^{(i)}) – y^{(i)}) x_j^{(i)}) x_j^{(i)} \\ …e, surpreendentemente, parece idêntico ao que estávamos a fazer para a regressão linear multivariada. O que mudou, contudo, é a definição da hipótese h_theta(x): para a regressão linear tínhamos h_theta(x) = ^theta^{\i}{x}, enquanto que para a regressão logística temos h_theta(x) = ^frac{1}{1 + e^theta^{\i} x}}.
De agora em diante você pode aplicar as mesmas técnicas para otimizar o algoritmo de descida de gradiente que vimos para a regressão linear, para garantir que a conversão para o ponto mínimo funcione corretamente. No próximo capítulo vou aprofundar alguns truques de otimização avançados, bem como definir e evitar o problema de overfitting.