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 pltCLASE 7. Regresión Logística en Python
Importar los paquetes a utilizar
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.
LogisticRegression()
Ajustar el modelo utilizando la base de prueba (Exclusivamente x\_test)
y_pred=reg_logist.predict(x_test)
y_predarray([0, 0, 0, ..., 0, 0, 0])
Diagnóstico
cnf_matriz=metrics.confusion_matrix(y_test,y_pred)
cnf_matrizarray([[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}