La regresión logística tiene como objetivo resolver problemas de clasificación. Lo hace mediante la predicción de resultados categóricos, a diferencia de la regresión lineal que predice un resultado continuo.
En el caso más simple hay dos resultados, lo que se llama binomial, un ejemplo de lo cual es predecir si un tumor es maligno o benigno. Otros casos tienen más de dos resultados para clasificar, en este caso se llama multinomial. Un ejemplo común de regresión logística multinomial sería predecir la clase de una flor de iris entre 3 especies diferentes.
Aquí usaremos la regresión logística básica para predecir una variable binomial. Esto significa que solo tiene dos resultados posibles.
¿Cómo funciona?
En Python tenemos módulos que harán el trabajo por nosotros. Comience importando el módulo NumPy.
import numpy
Almacene las variables independientes en X.
Almacene la variable dependiente en y.
A continuación se muestra un conjunto de datos de muestra:
#X represents the size of a tumor in centimeters. X = numpy.array([3.78,2.44,2.09,0.14,1.72,1.65,4.92,4.37,4.96,4.52,3.69, 5.88]).reshape(-1,1) #Note: X has to be reshaped into a column from a row for the LogisticRegression() function to work. #y represents whether or not the tumor is cancerous (0 for "No", 1 for "Yes"). y = numpy.array([0,0,0,0,0,0,1,1,1,1,1,1])
Usaremos un método del módulo sklearn, por lo que también tendremos que importar ese módulo:
from sklearn import linear_model
Desde el módulo sklearn usaremos el método LogisticRegression() para crear un objeto de regresión logística.
Este objeto tiene un método llamado fit() que toma los valores independientes y dependientes como parámetros y llena el objeto de regresión con datos que describen la relación:
logr = linear_model.LogisticRegression() logr.fit(X,y)
Ahora tenemos un objeto de regresión logística que está listo para determinar si un tumor es canceroso en función del tamaño del tumor:
#predict if tumor is cancerous where the size is 3.46mm: predicted = logr.predict(numpy.array([3.46]).reshape(-1,1))
Ejemplo
Vea el ejemplo completo en acción:
import numpy from sklearn import linear_model #Reshaped for Logistic function. X = numpy.array([3.78,2.44,2.09,0.14,1.72,1.65,4.92,4.37,4.96,4.52,3.69, 5.88]).reshape(-1,1) y = numpy.array([0,0,0,0,0,0,1,1,1,1,1,1]) logr = linear_model.LogisticRegression() logr.fit(X,y) #predict if tumor is cancerous where the size is 3.46mm: predicted = logr.predict(numpy.array([3.46]).reshape(-1,1)) print(predicted)
Resultado:
[0]
Coeficiente
En la regresión logística, el coeficiente es el cambio esperado en log-odds de que el resultado por unidad cambie en X.
Esto no tiene la comprensión más intuitiva, así que usémoslo para crear algo que tenga más sentido, probabilidades.
Ejemplo
Vea el ejemplo completo en acción:
import numpy from sklearn import linear_model #Reshaped for Logistic function. X = numpy.array([3.78,2.44,2.09,0.14,1.72,1.65,4.92,4.37,4.96,4.52,3.69, 5.88]).reshape(-1,1) y = numpy.array([0,0,0,0,0,0,1,1,1,1,1,1]) logr = linear_model.LogisticRegression() logr.fit(X,y) log_odds = logr.coef_ odds = numpy.exp(log_odds) print(odds)
Resultado:
[4.03541657]
Esto nos dice que a medida que el tamaño de un tumor aumenta en 1 mm, las probabilidades de que sea un tumor aumentan en 4x.
Probabilidad
Los valores del coeficiente y del intercepto se pueden usar para encontrar la probabilidad de que cada tumor sea canceroso.
Cree una función que use el coeficiente del modelo y los valores de intercepción para devolver un nuevo valor. Este nuevo valor representa la probabilidad de que la observación dada sea un tumor:
def logit2prob(logr,x): log_odds = logr.coef_ * x + logr.intercept_ odds = numpy.exp(log_odds) probability = odds / (1 + odds) return(probability)
Función Explicada
Para encontrar las probabilidades logarítmicas de cada observación, primero debemos crear una fórmula similar a la de la regresión lineal, extrayendo el coeficiente y la intersección.
log_odds = logr.coef_ * x + logr.intercept_
Para luego convertir las probabilidades logarítmicas en probabilidades, debemos exponenciar las probabilidades logarítmicas.
odds = numpy.exp(log_odds)
Ahora que tenemos las probabilidades, podemos convertirlo en probabilidad dividiéndolo por 1 más las probabilidades.
probability = odds / (1 + odds)
Usemos ahora la función con lo que hemos aprendido para averiguar la probabilidad de que cada tumor sea canceroso.
Ejemplo
Vea el ejemplo completo en acción:
import numpy from sklearn import linear_model X = numpy.array([3.78,2.44,2.09,0.14,1.72,1.65,4.92,4.37,4.96,4.52,3.69, 5.88]).reshape(-1,1) y = numpy.array([0,0,0,0,0,0,1,1,1,1,1,1]) logr = linear_model.LogisticRegression() logr.fit(X,y) def logit2prob(logr,x): log_odds = logr.coef_ * x + logr.intercept_ odds = numpy.exp(log_odds) probability = odds / (1 + odds) return(probability) print(logit2prob(logr, X))
Resultado:
[[0.60749955] [0.19268876] [0.12775886] [0.00955221] [0.08038616] [0.07345637] [0.88362743] [0.77901378] [0.88924409] [0.81293497] [0.57719129] [0.96664243]]
Resultado Explicado
3,78 0,61 La probabilidad de que un tumor de 3,78 cm sea canceroso es del 61%.
2,44 0,19 La probabilidad de que un tumor de 2,44 cm de tamaño sea canceroso es del 19%.
2,09 0,13 La probabilidad de que un tumor de 2,09 cm de tamaño sea canceroso es del 13%.