Clase 12: Regresión Logística
Supongamos el siguiente dataset:
¿Cómo puedo separar ambas clases?
La frontera de decisión
se puede caracterizar como la ecuación de una recta (en forma general).
Además definiremos \(h_\theta(X) = \theta_0 + \theta_1 X_1 + \theta_2 X_2\).
Podríamos pensar que si \(h_\theta(X)\) es positivo entonces pertenece a la clase 1 y si \(h_\theta(X)\) es negativo pertenece a la clase 0.
\[ g(z) = \frac{1}{1 + e^{-z}}\]
De acá sale la noción del umbral 0.5 que hemos visto en clases anteriores.
¿Qué pasaría si ahora decimos que \(z = \theta_0 + \theta_1 X_1 + \theta_2 X_2\)?
\[P[y = 1|X, \theta] = g(\theta_0 + \theta_1 X_1 + \theta_2 X_2) = \frac{1}{1 + e^{-(\theta_0 + \theta_1 X_1 + \theta_2 X_2)}}\]
Regla de Decisión:
\(g(z)\) se puede interpretar como una probabilidad de pertenecer a la Clase 1.
\(1 -g(z)\) se puede interpretar como una probabilidad de NO pertenecer a la Clase 1, es decir, pertenecer a la Clase 0.
Supongamos lo siguiente:
\[P(y = 1| X, \theta) = g(z)\]
\[P(y = 0| X, \theta) = 1-g(z)\]
Ambas ecuaciones pueden comprimirse en una sola de la siguiente manera: \[ P(y|X,\theta) = g(z)^y (1 - g(z))^{1-y}\]
Para encontrar los parámetros \(\theta\) podemos utilizar una técnica llamada Maximum Likelihood Estimation.
\[\mathcal{L}(\theta) = \prod_{i=1}^n P(y^{(i)} | x^{(i)}, \theta)\]
\[ \underset{\theta}{argmin} \ -l(\theta)\] \[l(\theta) = log (\mathcal{L(\theta)}) = \sum_{i=1}^n y^{(i)} \cdot log(g(z)) + (1-y^{(i)})\cdot log(1-g(z))\]
Esta ecuación se conoce como Entropía Cruzada o como Negative Log Loss (NLL) y tiene la gracia de que es una curva convexa lo que garantiza un valor único de los parámetros \(\theta\).
La técnica más famosa para minimizar este tipo de problemas se conoce como Stochastic Gradient Descent
. Lo que genera la siguiente solución:
\[\theta_j \leftarrow \theta_j - \alpha \frac{1}{n}\sum_{i=1}^n\left(g(z)-y^{(i)}\right)x_j^{(i)}\]
A pesar de lo complicado que se ve la ecuación, implementarla en código es bastante sencillo.
En este caso se calcula: \[g_\theta(x^{(i)})=sigmoid(\theta^t x^{(i)})\]
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=1, penalty="l2", random_state = 42)
lr.fit(X_train, y_train)
y_pred = lr.predict(X_test)
y_proba = lr.predict_proba(X_test)
## Visualizacion de los Parámetros
lr.coef_
lr.intercept_
Para cambiar la regularización, consultar la documentación de Scikit-Learn.
Una de las grandes ventajas que tiene la Regresión Logística es que sus predicciones son interpretables.
\[g_\theta(x) = 0.5 - 3.5 \cdot W + 1.5 \cdot qsec \]
El valor del parámetro representa también la magnitud de la contribución.