Usando regresión logística

La regresión logística nos proporciona una función analítica con garantías teóricas sobre la precisión y el rendimiento. Es como una regresión lineal, excepto que usamos una función de costo diferente y ligeramente transformada a la función de respuesta del modelo.
Revisemos la función lineal a continuación.

y(x) = wx

En la regresión lineal, una línea con pendiente no nula puede ir desde el infinito negativo hasta el infinito. Si los únicos resultados razonables para la clasificación son 0 o 1, sería intuitivo ajustar una función con esa propiedad. Afortunadamente, la función sigmoide visualizada en la figura 4.9 funciona bien porque converge a 0 o 1 muy rápidamente.


Cuando x es 0, la función sigmoidal resulta en 0.5. A medida que x aumenta, la función converge a
1 y a medida que x disminuye a infinito negativo, la función converge a 0. En regresión logística, nuestro modelo es sig (lineal (x)). Resulta que, los parámetros de mejor ajuste de la función implica una separación lineal entre las dos clases. Esta línea de separación también se denomina límite de decisión lineal.

Resolución de regresión logística unidimensional.
Solving one-dimensional logistic regression

La función de costo utilizada en la regresión logística es un poco diferente de la que usamos en la regresión lineal. Aunque podríamos usar la misma función de costo que antes, no será tan rápida ni garantizará una solución óptima. La función sigmoide es la culpable aquí, ya que causa que la función de costo tenga muchos "baches". TensorFlow y la mayoría de las otras bibliotecas de aprendizaje automático funcionan mejor con funciones de costo simples. Los académicos han encontrado una forma clara de modificar la función de costo para usar sigmoides para la regresión logística. La nueva función de costo entre el valor real y y la respuesta del modelo h será la siguiente ecuación de dos partes:


Podemos condensar las dos ecuaciones en una larga ecuación de la siguiente manera.


Esta función tiene exactamente las cualidades necesarias para un aprendizaje eficiente y óptimo. Específicamente, es convexo, pero no te preocupes demasiado por lo que eso significa. Estamos tratando de minimizar el costo: piense en el costo como una altitud y la función del costo como un terreno. Estamos tratando de encontrar el punto más bajo del terreno. Es mucho más fácil encontrar el punto más bajo del terreno si no hay un lugar al que puedas ir cuesta arriba. Tal lugar se llama "convexo". No hay colinas. Puedes pensar que es como una pelota rodando por una colina. Finalmente, la bola se asentará en la parte inferior, que es el "punto óptimo". Una función no convexa puede tener un terreno accidentado, lo que hace difícil predecir dónde rodará una bola. Puede que ni siquiera termine en el punto más bajo. Nuestra función es convexa, por lo que el algoritmo descubrirá fácilmente cómo minimizar este costo y "rodar la pelota cuesta abajo". La convexidad es buena, pero la corrección también es un criterio importante al elegir una función de costo. ¿Cómo sabemos que esta función de costo hace exactamente lo que pretendíamos que hiciera? Para responder esa pregunta de la manera más intuitiva, observe la figura 4.10. Usamos –log (x) para calcular el costo cuando queremos que nuestro valor deseado sea 1 (aviso: –log (1) = 0). El algoritmo se aleja de establecer el valor en 0, ya que el costo se acerca al infinito. Al sumar estas funciones se obtiene una curva que se aproxima al infinito tanto en cero como en 1, con la cancelación de las partes negativas. Claro, las cifras son una forma informal de convencerlo, pero la discusión técnica de por qué la función de costo es óptima está más allá del alcance del libro. Si está interesado en las matemáticas, le interesará saber que la función de costo se deriva del principio de máxima entropía, que puede buscar en cualquier lugar en línea.


Consulte la figura 4.10 para ver el mejor resultado de ajuste de la regresión logística en un conjunto de datos unidimensional. la curva sigmoidal que generaremos proporcionará un mejor límite de decisión lineal que la regresión lineal.


Comenzarás a notar un patrón en las listas de códigos. En un uso simple / típico de TensorFlow, genera un conjunto de datos falso, define marcadores de posición, define variables, define un modelo, define una función de costo en ese modelo (que a menudo es un error de cuadrado medio o un error de registro de cuadrado cuadrado), crea un train_op utilizando el descenso de degradado, alimenta iterativamente los datos de ejemplo (posibles con una etiqueta o salida) y finalmente recopila los valores optimizados. Cree un nuevo archivo fuente llamado logistic_1d.py y siga junto con el listado 4.5, que generará la figura 4.11.

import numpy as np #A
import tensorflow as tf #A
import matplotlib.pyplot as plt #A

learning_rate = 0.01 #B
training_epochs = 1000 #B

def sigmoid(x): #C
return 1. / (1. + np.exp(-x)) #C

x1 = np.random.normal(-4, 2, 1000) #D
x2 = np.random.normal(4, 2, 1000) #D
xs = np.append(x1, x2) #D
ys = np.asarray([0.] * len(x1) + [1.] * len(x2)) #D

plt.scatter(xs, ys) #E

X = tf.placeholder(tf.float32, shape=(None,), name="x") #F
Y = tf.placeholder(tf.float32, shape=(None,), name="y") #F
w = tf.Variable([0., 0.], name="parameter", trainable=True) #G
y_model = tf.sigmoid(w[1] * X + w[0]) #H
cost = tf.reduce_mean(-Y * tf.log(y_model) - (1 - Y) * tf.log(1 - y_model)) #I

train_op = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #J

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
prev_err = 0 #L
for epoch in range(training_epochs):
err, _ = sess.run([cost, train_op], {X: xs, Y: ys}) #N
print(epoch, err)
if abs(prev_err - err) < 0.0001: #O
break
prev_err = err #P
w_val = sess.run(w, {X: xs, Y: ys}) #Q

all_xs = np.linspace(-10, 10, 100) #R
plt.plot(all_xs, sigmoid(-(all_xs * w_val[1] + w_val[0]))) #R
plt.show() #R

#A Import relevant libraries
#B Set the hyper-parameters
#C Define a helper function to calculate the sigmoid function
#D Initialize fake data
#E Visualize the data
#F Define the input/output placeholders
#G Define the parameter node
#H Define the model using TensorFlow’s sigmoid function
#I Define the cross-entropy loss function
#J Define the minimizer to use
#K Open a session and define all variables
#L Define a variable to track of the previous error
#M Iterate until convergence or until maximum number of epochs reached
#N Computer the cost as well as update the learning parameters
#O Check for convergence – if we’re changing by < .01% per iteration, we’re done
#P Update the previous error value
#Q Obtain the learned parameter value
#R Plot the learned sigmoid function






¡Y ahí lo tienes! Si jugabas al ajedrez contra Alicia, ahora tienes un binario clasificador para decidir el umbral para cuando una partida de ajedrez puede resultar en una victoria o pérdida.

4.4.2 Resolución de regresión logística bidimensional.

Ahora exploraremos cómo usar la regresión logística con múltiples variables independientes. El número de variables independientes corresponde al número de dimensiones. En nuestro caso, un problema de regresión logística bidimensional intentará etiquetar un par de variables independientes. Los conceptos aprendidos en esta sección extrapolan a dimensiones arbitrarias.

¿MÁS DE DOS DIMENSIONES?
Digamos que estamos pensando en comprar un teléfono nuevo. Lo único los atributos que nos interesan son (1) sistema operativo, (2) tamaño y (3) costo. Estimado lector, sé que has adquirido un
Sabor más rico, pero por simplicidad solo nos interesan los tres. El objetivo es decidir si un teléfono es una compra que vale la pena. En este caso, hay tres variables independientes (los atributos del teléfono), y una variable dependiente (valga o no la compra). Así que consideramos esto como un problema de clasificación donde el vector de entrada es tridimensional.

Considere el conjunto de datos que se muestra en la figura 4.12. Representa la actividad delictiva de dos pandillas diferentes en una ciudad. La primera dimensión es el eje x, que se puede considerar como la latitud, y la segunda dimensión es el eje y que representa la longitud. Hay un grupo alrededor (3, 2) y el otro alrededor (7, 6). Su trabajo es decidir qué pandilla es más probable responsable de un nuevo crimen que ocurrió en el lugar (6,4).


Cree un nuevo archivo fuente llamado logistic_2d.py y siga junto con el listado 4.6.

Tenemos dos variables independientes (x1 y x2). Una forma sencilla de modelar el mapeo.
entre la entrada x y la salida M (x) es la siguiente ecuación, donde w es el parámetro a
ser encontrado por TensorFlow.

En el listado 4.7, implementará la ecuación y su función de costo correspondiente para aprender los parametros:



La Figura 4.13 visualiza la línea de límite lineal aprendida de los datos de entrenamiento. Un crimen que ocurre en esta línea que tiene la misma posibilidad de ser parte de cualquiera de las pandillas.





Comentarios