CLASE 7. Regresión Logística en Python

Autor/a

Gerson Rivera

Fecha de publicación

19 julio 2024

Importar los paquetes a utilizar

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn import metrics
import matplotlib.pyplot as plt

Cargar la base de datos

Url=“https://raw.githubusercontent.com/Statology/Python-Guides/main/default.csv”

url=" https://raw.githubusercontent.com/Statology/Python-Guides/main/default.csv "
datos=pd.read_csv(url)
datos.head(6)
default student balance income
0 0 0 729.526495 44361.625074
1 0 1 817.180407 12106.134700
2 0 0 1073.549164 31767.138947
3 0 0 529.250605 35704.493935
4 0 0 785.655883 38463.495879
5 0 1 919.588530 7491.558572
datos[25:30]
default student balance income
25 0 0 855.008523 25211.332161
26 0 0 642.999739 41473.511801
27 0 0 1454.863272 32189.094952
28 0 0 615.704277 39376.394619
29 0 1 1119.569353 16556.070205
len(datos)
10000

El objetivo es:

  • Determinar un modelo de la forma: y=a_0+a_1x_1+a_2x_2+a_3x_3

Estimar el Modelo de Regresión Logística

x=datos[['student','balance','income']]
y=datos[['default']]
x.head()
student balance income
0 0 729.526495 44361.625074
1 1 817.180407 12106.134700
2 0 1073.549164 31767.138947
3 0 529.250605 35704.493935
4 0 785.655883 38463.495879
y.head()
default
0 0
1 0
2 0
3 0
4 0

Dividir la base de datos en 2 partes:

  • Base de entrenamiento (70%) 𝑡𝑟𝑎𝑖𝑛
  • Base de prueba (30%) 𝑡𝑒𝑠𝑡𝑖𝑛𝑔
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)

Instanciamos al modelo

reg_logist=LogisticRegression()

Validación

Ajustar el modelo utilizando la base de entrenamiento

reg_logist.fit(x_train,y_train)
C:\Users\Usuario\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\utils\validation.py:1339: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().
  y = column_or_1d(y, warn=True)
LogisticRegression()
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

Ajustar el modelo utilizando la base de prueba (Exclusivamente x\_test)

y_pred=reg_logist.predict(x_test)
y_pred
array([0, 0, 0, ..., 0, 0, 0])

Diagnóstico

cnf_matriz=metrics.confusion_matrix(y_test,y_pred)
cnf_matriz
array([[2878,    9],
       [  74,   39]])

INTERPRETACIÓN.

Los valores de la diagonal principal, corresponden a los valores pronósticados correctamente en el orden:

  • La columna 1 con CERO (no incumplen)
  • La columna 2 con UNO (incumplen)

Los valores de la diagonal secundaria, corresponden a los valores falsos positivos (falsos negativos), indicando que:

  • Los 17 de la posición 1-2, corresponden a “CERO” y toman el valor equivocado de “UNO”
  • Los 93 de la posición 2-1, corresponden a “UNO” y toman el valor equivocado de “CERO”

Por el análisis anterior es necesario estudiar la estructura de confiabilidad o precisión del modelo. En todo caso:

\left(\dfrac{2870+20}{3000}\right)\cdot(100\%)=96.3\%

Verificar la precisión del modelo

print("Accuracy:",metrics.accuracy_score(y_test,y_pred))
Accuracy: 0.9723333333333334

Conclusión


Por las etapas anteriores y con el pronóstico del modelo, se considera que tenemos un modelo confiable en un 96.3%. Lo que indica que la toma de decisión en función de los datos, serán válidos y robustos; lo que hará que el hecho de decidir sea algo más factible.

Prueba del modelo

Ejecutando un caso 1 de prueba

reg_logist.predict([[0 ,    729.526495 ,    44361.625074]])
C:\Users\Usuario\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\base.py:493: UserWarning: X does not have valid feature names, but LogisticRegression was fitted with feature names
  warnings.warn(
array([0])

Análisis del Resultado 1

  • El valor de 𝑦=0 indica, que el cliente no ha incumplido
  • El valor de 𝑦=1 indica, que el cliente ha incumplido

Debido a que fue CERO y se esperaba CERO, entonces este resultado cae en la precisión o confiabilidad del modelo

Ejecutando un caso 2 de prueba

reg_logist.predict([[1,1502.18673866603,18603.495531833]])
C:\Users\Usuario\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\base.py:493: UserWarning: X does not have valid feature names, but LogisticRegression was fitted with feature names
  warnings.warn(
array([0])

Análisis del Resultado 2

  • El valor de 𝑦=0 indica, que el cliente no ha incumplido
  • El valor de 𝑦=1 indica, que el cliente ha incumplido

Debido a que fue CERO y se esperaba UNO, entonces este resultado cae en el error del modelo

Modelo formal según estructura

reg_logist.coef_
array([[-6.37897117e-01,  5.64570321e-03,  1.74340563e-07]])
reg_logist.intercept_
array([-10.68247761])

El modelo resultante es:

\begin{aligned} y&=a_0+a_1x_1+a_2x_2+a_3x_3\\ y&=−2.86843745−3.79999456e^{+00}x_1+4.03495132e^{-03}x_2−1.36823955e^{-04}x_3 \end{aligned}