<jupyter_start><jupyter_text>Regresión Logística La regresión logística implica que las salidas no son numéricas sino categoricas.Si los predictores son categoricos entonces utilizamos variables dummies.Por ejemplo, dado un puntaje de SAT queremos saber si un estudiante será o no admitido en la universidad.La regresión logística calcula la probabilidad de que ocurra un evento.La curva que se calcula es una funcón logística: forma de S y acotada [0,1]. Modelo de Regresion Logistica: $ p(X) = \frac{e^{B_0+B_1x_1+...+b_kx_k}}{1+e^{B_0+B_1x_1+...+b_kx_k}}$Podemos transformar esta ecuacion.$ \frac{p(X)}{1-P(X)} = e^{B_0+B_1x_1+...+b_kx_k} $La parte izquierda de la ecuación se conoce como OddsModelo de Regresión Logit:$ log(\frac{p(X)}{1-P(X)}) = B_0+B_1x_1+...+b_kx_k $Podemos usar cualquiera de los dos modelos: Regresión Logistica o Regrasión Logit  Importar bibliotecas<jupyter_code>import numpy as np
import pandas as pd
import statsmodels.api as sm
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()<jupyter_output><empty_output><jupyter_text>Datos<jupyter_code>raw_data = pd.read_csv('Admittance.csv')
raw_data
# Sustituimos las entradas No=0 y Yes=1
data = raw_data.copy()
data['Admitted'] = data['Admitted'].map({'Yes': 1, 'No': 0})
data<jupyter_output><empty_output><jupyter_text>Variables<jupyter_code># Definimos variables dependientes e independientes
y = data['Admitted']
x1 = data['SAT']<jupyter_output><empty_output><jupyter_text>Graficamos  Gráfica de puntos<jupyter_code># Tenemos una grafica con solo dos valores binarios
plt.scatter(x1,y, color='blue')
plt.xlabel('SAT')
plt.ylabel('Admitted')
plt.show()<jupyter_output><empty_output><jupyter_text>Regresión lineal<jupyter_code># Calculamos la linea de regresion 
x = sm.add_constant(x1)
reg_lin = sm.OLS(y,x)
results_lin = reg_lin.fit()

# Graficamos los puntos
plt.scatter(x1,y,color = 'blue')
# Graficamos la regresion lineal.
# Los coeficientes estan dentro de los parametros
y_hat = x1*results_lin.params[1]+results_lin.params[0]

plt.plot(x1,y_hat,color='orange')
plt.xlabel('SAT')
plt.ylabel('Admitted')
plt.show()<jupyter_output><empty_output><jupyter_text>La regresión Lineal no nos sirve, no ajusta bien los datos, icluso se sale del rango de [0,1] de los datos.  Curva de regresión logística<jupyter_code>reg_log = sm.Logit(y,x)
results_log = reg_log.fit()

def f(x,b0,b1):
    return np.array(np.exp(b0+x*b1) / (1 + np.exp(b0+x*b1)))

f_sorted = np.sort(f(x1,results_log.params[0],results_log.params[1]))
x_sorted = np.sort(np.array(x1))

plt.scatter(x1,y,color='blue')
plt.xlabel('SAT')
plt.ylabel('Admitted')
plt.plot(x_sorted,f_sorted,color='orange')
plt.show()<jupyter_output>Optimization terminated successfully.
         Current function value: 0.137766
         Iterations 10<jupyter_text>La curva en realidad muestra la probabilidad de ser admitido dado un puntaje de SAT.La probabilidad de ser admitido con un puntaje SAT bajo es 0, mientras que la probabilidad de ser admitido con un puntaje SAT alto es 1.Un puntaje SAT entre 1600 y 1800 va cambiando. Con un valor SAT de 1650 hay un 50% de probabilidad de ser admitido, esta probabilidad sube a 80% con un valor SAT de 1700.  Resumen de resultados<jupyter_code>results_log.summary()<jupyter_output><empty_output><jupyter_text>Entendiendo el resumen      Method: MLE (Maximum Likelihood Estimation)                Función Likelihood: estima la probabilidad de que el modelo describa la verdadera relación entre las variables. Entre más alto sea la función likelihood más cercano es la estimación del modelo al real.                     LL Null (log likelihood null)                 Es el log-likelihood de un modelo sin variables independientes. Y=B0                                                            LLR (log likelihood ratio)                         Mide si el modelo es estadisticamente diferente de LL-Null                                                      Pseudo R-squared                                 Algunas métricas que se asemejan a R-squared son: AIC, BIC, McFadden's R-squared.                                                          LL-Null<jupyter_code># Creamos una variable de solo 1s
const = np.ones(168)
const
reg_null = sm.Logit(y,const)
results_null = reg_null.fit()
results_null.summary()<jupyter_output>Optimization terminated successfully.
         Current function value: 0.686044
         Iterations 4
{'fraction_non_alphanumeric': 0.09566007725516928, 'fraction_numerical': 0.019768234492160874, 'mean_word_length': 4.053960964408725, 'pattern_counts': {'":': 0, '<': 31, '<?xml version=': 0, '>': 31, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 7, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '8', 'dir': 'jupyter-structured-clean-dedup', 'id': '522714', 'license': 'MIT', 'n_tokens_mistral': 1619, 'n_tokens_neox': 1539, 'n_words': 428, 'path': '9-logit Regression.ipynb', 'repo_name': 'jrtorresb/Clases-Proyecto-I-Machine-Learning', 'size': '4401'}