En el artículo anterior «Introducción a la clasificación y a la regresión logística» esbocé los fundamentos matemáticos del algoritmo de regresión logística, cuya tarea es separar las cosas en el ejemplo de entrenamiento calculando el límite de decisión.
El límite de decisión puede describirse mediante una ecuación. Al igual que en la regresión lineal, el algoritmo de regresión logística será capaz de encontrar los mejores parámetros \thetas para que el límite de decisión realmente separe los puntos de datos correctamente. En este artículo veremos cómo calcular esas \thetas.
Supongamos que tenemos un conjunto de entrenamiento genérico
{ (x^{1)}, y^{1)}), (x^{2)}, y^{2)}), \dots, (x^{(m)}, y^{(m)}) \}
hecho de m ejemplos de entrenamiento, donde (x^{(1)}, y^{(1)}) es el primer ejemplo y así sucesivamente. Más concretamente, x^{(m)} es la variable de entrada del m-ésimo ejemplo, mientras que y^{(m)} es su variable de salida. Siendo este un problema de clasificación, cada ejemplo tiene por supuesto la salida y acotada entre 0 y 1. En otras palabras, y \Nestá en {0,1}.
Cada ejemplo está representado como siempre por su vector de características
\vec{x} = \begin{bmatrix} x_0 \ x_1 \\dots \n \end{bmatrix}
donde x_0 = 1 (el mismo truco de siempre). Este es un ejemplo genérico, no sabemos el número exacto de características.
Por último tenemos la función de hipótesis para la regresión logística, como se vio en el artículo anterior:
h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}
Nuestra tarea ahora es elegir los mejores parámetros \thetas en la ecuación anterior, dado el conjunto de entrenamiento actual, con el fin de minimizar los errores. Recuerde que \theta no es un solo parámetro: se expande a la ecuación de la frontera de decisión que puede ser una línea o una fórmula más compleja (con más \thetas para adivinar).
El procedimiento es similar a lo que hicimos para la regresión lineal: definir una función de coste y tratar de encontrar los mejores valores posibles de cada \theta minimizando la salida de la función de coste. La minimización será realizada por un algoritmo de descenso de gradiente, cuya tarea es analizar la salida de la función de coste hasta encontrar el punto mínimo más bajo.
La función de coste utilizada en la regresión lineal no funcionará aquí
Es posible que recuerdes la función de coste original J(\theta) utilizada en la regresión lineal. Puedo decirte ahora mismo que no va a funcionar aquí con la regresión logística. Si intentas utilizar la función de coste de la regresión lineal para generar J(\theta) en un problema de regresión logística, terminarías con una función no convexa: un gráfico con una forma extraña y sin un punto mínimo global fácil de encontrar, como se ve en la imagen de abajo.
Este extraño resultado se debe a que en la regresión logística tenemos la función sigmoide alrededor, que no es lineal (es decir, no es una recta). Con la J(\theta) representada en la figura 1. el algoritmo de descenso de gradiente podría quedarse atascado en un punto mínimo local. Por eso seguimos necesitando una función convexa ordenada como hicimos para la regresión lineal: una función en forma de cuenco que facilite el trabajo de la función de descenso de gradiente para converger al punto mínimo óptimo.
Una mejor función de coste para la regresión logística
Permítanme volver un momento a la función de coste que utilizamos en la regresión lineal:
J(\vec{\theta}) = \frac{1}{2m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)})^2
que puede reescribirse de forma ligeramente diferente:
J(\vec{\theta}) = \frac{1}{m} \sum_{i=1}^{m} \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
No ha pasado nada de miedo: Sólo he movido el \frac{1}{2} junto a la parte de la suma. Ahora hagámoslo más general definiendo una nueva función
\mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) = \frac{1}{2}(h_\theta(x^{(i)}) – y^{(i)})^2
Es decir, una función \mathrm{Cost} que toma dos parámetros de entrada: h_\theta(x^{(i)}) como función de hipótesis y y^{(i)} como salida. Se puede pensar en ello como el coste que el algoritmo tiene que pagar si hace una predicción h_\theta(x^{(i)}) mientras que la etiqueta real era y^{(i)}.
Con esta nueva pieza del rompecabezas puedo reescribir la función de coste para la regresión lineal como sigue:
J(\theta) = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)})
Sin embargo, sabemos que la función de coste de la regresión lineal no se puede utilizar en problemas de regresión logística. Entonces, ¿a qué se debe todo esto? Bueno, resulta que para la regresión logística sólo tenemos que encontrar una función \mathrm{Cost} diferente, mientras que la parte de la suma sigue siendo la misma.
Función de coste de la regresión logística
Para la regresión logística, la función \mathrm{Cost} se define como:
\mathrm{Cost}(h_\theta(x),y) =\begin{cases}-\log(h_\theta(x)) & \text{si y = 1} \\-\log(1-h_\theta(x)) & \text{si y = 0}\cuestiones}
Se han eliminado los índices i para mayor claridad. En palabras, este es el coste que paga el algoritmo si predice un valor h_\theta(x) mientras que la etiqueta de coste real resulta ser y. Usando esta función concederemos la convexidad a la función que tiene que procesar el algoritmo de descenso de gradiente, como se ha comentado anteriormente. También hay una prueba matemática para ello, que está fuera del alcance de este curso introductorio.
En el caso y = 1, la salida (es decir, el coste a pagar) se acerca a 0 a medida que h_\theta(x) se acerca a 1. A la inversa, el coste a pagar crece hasta el infinito a medida que h_\theta(x) se acerca a 0. Se puede ver claramente en el gráfico 2. de abajo, lado izquierdo. Esta es una propiedad deseable: queremos una mayor penalización a medida que el algoritmo predice algo muy alejado del valor real. Si la etiqueta es y = 1 pero el algoritmo predice h_\theta(x) = 0, el resultado es completamente erróneo.
A la inversa, la misma intuición se aplica cuando y = 0, representado en el gráfico 2. abajo, lado derecho. Mayores penalizaciones cuando la etiqueta es y = 0 pero el algoritmo predice h_\theta(x) = 1.
Optimizaciones adicionales de la función de coste
Lo que acabamos de ver es la versión verbosa de la función de coste para la regresión logística. Podemos hacerla más compacta en una expresión de una sola línea: esto ayudará a evitar las aburridas declaraciones if/else al convertir la fórmula en un algoritmo.
mathrm{Cost}(h_\theta(x),y) = -y \log(h_\theta(x)) – (1 – y) \log(1-h_\theta(x))
Prueba: intenta sustituir y por 0 y 1 y acabarás con los dos trozos de la función original.
Con la optimización en su lugar, la función de coste de la regresión logística se puede reescribir como:
{iniciar{alinear}J(\theta) & = \dfrac{1}{m} \sum_{i=1}^m \mathrm{Cost}(h_\theta(x^{(i)}),y^{(i)}) \\N – \N -dfrac{1}{m} \\\N-end{align}
He movido el signo menos fuera para evitar paréntesis adicionales.
Colocando la función de coste y el descenso de gradiente
¿Qué queda? Tenemos la función de hipótesis y la función de coste: casi hemos terminado. Ahora es el momento de encontrar los mejores valores para los parámetros \thetas en la función de coste, o en otras palabras para minimizar la función de coste mediante la ejecución del algoritmo de descenso de gradiente. El procedimiento es idéntico al que hicimos para la regresión lineal.
Más formalmente, queremos minimizar la función de coste:
\min_{\theta} J(\theta)
Que dará como resultado un conjunto de parámetros \theta, los mejores (es decir, con menos error). Una vez hecho esto, estaremos preparados para hacer predicciones sobre nuevos ejemplos de entrada con sus características x, utilizando las nuevas \thetas en la función de hipótesis:
h_\theta(x) = \frac{1}{1 + e^{\theta^{\top} x}
Donde h_\theta(x) es la salida, la predicción, o sin embargo la probabilidad de que y = 1.
La forma en que vamos a minimizar la función de coste es utilizando el descenso de gradiente. La buena noticia es que el procedimiento es idéntico en un 99% a lo que hicimos para la regresión lineal.
Para minimizar la función de coste tenemos que ejecutar la función de descenso de gradiente sobre cada parámetro:
\begin{align} \N – texto{repetir hasta la convergencia{{.} \\N – alfa \N – frac{{parcial}{parcial} \\N de la función de descenso de gradiente en cada parámetro:
{regresar}{repetir} hasta la convergencia. J(\theta) \text{\}{fin{align}
Recuerda actualizar simultáneamente todos los \theta_j como hicimos en la contraparte de regresión lineal: si tienes n características, es decir un vector de características \vec{\theta} = , todos esos parámetros tienen que ser actualizados simultáneamente en cada iteración:
{comenzar{align} \text{repetir hasta la convergencia \} \\N-theta_0 & := \cdots \\N-\N-theta_1 & := \cdots \N-\N-\N-theta_n & := \cdots \\\ctexto{{final{de{alineación}
Volviendo al algoritmo, os ahorraré el cálculo de la desalentadora derivada \frac{parcial}{parcial \theta_j} J(\theta), que se convierte en:
frac{parcial}{parcial \theta_j} J(\theta) = \dfrac{1}{m} \sum_{i=1}^{m} (h_\theta(x^{(i)}) – y^{(i)}) x_j^(i)}
Por tanto, el bucle anterior puede reescribirse como:
{comenzar{alinear} \N – texto{repetir hasta la convergencia{{.} \N – alfa \N – frac{1} {m} \(h_theta(x^(i)}) – y^(i)}) x_j^(i)} \text{{}}end{align}
Sorprendentemente, parece idéntico a lo que estábamos haciendo para la regresión lineal multivariante. Sin embargo, lo que ha cambiado es la definición de la hipótesis h_\theta(x): para la regresión lineal teníamos h_\theta(x) = \theta^{top}{x}, mientras que para la regresión logística tenemos h_\theta(x) = \frac{1}{1 + e^{\theta^{top} x}.
A partir de ahora puedes aplicar las mismas técnicas para optimizar el algoritmo de descenso de gradiente que hemos visto para la regresión lineal, para asegurarte de que la conversión al punto mínimo funciona correctamente. En el próximo capítulo profundizaré en algunos trucos avanzados de optimización, así como en la definición y evitación del problema del sobreajuste.