Está en la página 1de 25

26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

Regresión logística con Python


En esta parte trabajaremos con el Conjunto de Datos Titanic de Kaggle (https://www.kaggle.com/c/titanic).
¡Este es un conjunto de datos muy famoso y muy a menudo es el primer paso de un estudiante en el
aprendizaje automático!

Trataremos de predecir una clasificación: supervivencia o muerte.


Comencemos nuestra comprensión de la
implementación de Regresión logística en Python para clasificación.

Usaremos una versión "semi-limpia" del conjunto de datos Titanic, si usa el conjunto de datos alojado
directamente en Kaggle, es posible que necesite realizar una limpieza adicional que no se muestra en este
notebook.

Importación de Librerias
Vamos a importar algunas de las librerias para comenzar!

In [1]:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

Los datos
Comencemos leyendo el archivo titanic_train.csv en un dataframe de pandas.

In [2]:

train = pd.read_csv('titanic_train.csv')

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 1/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [3]:

train.head()

Out[3]:

PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare C

Braund,
0 1 0 3 Mr. Owen male 22.0 1 0 A/5 21171 7.2500
Harris

Cumings,
Mrs. John
Bradley
1 2 1 1 female 38.0 1 0 PC 17599 71.2833
(Florence
Briggs
Th...

Heikkinen,
STON/O2.
2 3 1 3 Miss. female 26.0 0 0 7.9250
3101282
Laina

Futrelle,
Mrs.
Jacques
3 4 1 1 female 35.0 1 0 113803 53.1000
Heath
(Lily May
Peel)

Allen, Mr.
4 5 0 3 William male 35.0 0 0 373450 8.0500
Henry

In [4]:

train.info()

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 891 entries, 0 to 890

Data columns (total 12 columns):

# Column Non-Null Count Dtype

--- ------ -------------- -----

0 PassengerId 891 non-null int64

1 Survived 891 non-null int64

2 Pclass 891 non-null int64

3 Name 891 non-null object

4 Sex 891 non-null object

5 Age 714 non-null float64

6 SibSp 891 non-null int64

7 Parch 891 non-null int64

8 Ticket 891 non-null object

9 Fare 891 non-null float64

10 Cabin 204 non-null object

11 Embarked 889 non-null object

dtypes: float64(2), int64(5), object(5)

memory usage: 83.7+ KB

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 2/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

Análisis exploratorio de datos


Hagamos análisis de datos exploratorio, ¡Comenzaremos por verificar los datos que faltan!

Datos perdidos
¡Podemos usar Seaborn para crear un mapa de calor simple para ver dónde nos faltan datos!

In [5]:

sns.heatmap(train.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Out[5]:

<AxesSubplot:>

Aproximadamente el 20 por ciento de los datos Age falta. La proporción de datos Age faltantes es
probablemente lo suficientemente pequeña para un reemplazo razonable con alguna forma de imputación. Al
mirar la columna Cabin, parece que se está perdiendo demasiados datos para hacer algo útil a un nivel básico.
Probablemente lo eliminaremos más tarde o lo cambiemos a otra característica como "Cabina Conocida: 1 or
0".

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 3/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [6]:

sns.set_style('whitegrid')
sns.countplot(x='Survived',data=train,palette='RdBu_r')

Out[6]:

<AxesSubplot:xlabel='Survived', ylabel='count'>

In [7]:

sns.set_style('whitegrid')
sns.countplot(x='Survived',hue='Sex',data=train,palette='RdBu_r')

Out[7]:

<AxesSubplot:xlabel='Survived', ylabel='count'>

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 4/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [8]:

sns.set_style('whitegrid')
sns.countplot(x='Survived',hue='Pclass',data=train,palette='rainbow')

Out[8]:

<AxesSubplot:xlabel='Survived', ylabel='count'>

In [9]:

sns.displot(train['Age'].dropna(),kde=True,color='darkblue',bins=30)

Out[9]:

<seaborn.axisgrid.FacetGrid at 0x19e7d40e760>

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 5/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [10]:

train['Age'].hist(bins=30,color='darkred',alpha=0.5)

Out[10]:

<AxesSubplot:>

In [11]:

sns.countplot(x='SibSp',data=train)

Out[11]:

<AxesSubplot:xlabel='SibSp', ylabel='count'>

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 6/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [12]:

sns.countplot(x='Parch',data=train)

Out[12]:

<AxesSubplot:xlabel='Parch', ylabel='count'>

In [13]:

train['Fare'].hist(color='green',bins=40,figsize=(8,4))

Out[13]:

<AxesSubplot:>

Limpieza de datos
localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 7/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

Queremos completar los datos de edad faltantes en lugar de simplemente eliminar las filas con datos de edad
faltantes. Una forma de hacerlo es rellenándolos con la edad promedio de todos los pasajeros (imputación).
Sin embargo, podemos ser más cuidadosos al respecto y verificar la edad promedio por clase de pasajeros.
Por ejemplo:

In [14]:

plt.figure(figsize=(12, 7))
sns.boxplot(x='Pclass',y='Age',data=train,palette='winter')

Out[14]:

<AxesSubplot:xlabel='Pclass', ylabel='Age'>

In [15]:

fil_no_null = pd.notnull(train['Age'])
edades=train[fil_no_null]

In [16]:

fil_1ra = edades['Pclass'] == 1
pas_1ra = edades[fil_1ra]
print('promedio',pas_1ra['Age'].mean())
print('Percentiles')
print(pas_1ra[['Age']].quantile([0.25,0.50,0.75]))

promedio 38.233440860215055

Percentiles

Age

0.25 27.0

0.50 37.0

0.75 49.0

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 8/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [17]:

fil_2da = edades['Pclass'] == 2
pas_2da = edades[fil_2da]
print('promedio',pas_2da['Age'].mean())
print('Percentiles')
print(pas_2da[['Age']].quantile([0.25,0.50,0.75]))

promedio 29.87763005780347

Percentiles

Age

0.25 23.0

0.50 29.0

0.75 36.0

In [18]:

fil_3ra = edades['Pclass'] == 3
pas_3ra = edades[fil_3ra]
print('promedio',pas_3ra['Age'].mean())
print('Percentiles')
print(pas_3ra[['Age']].quantile([0.25,0.50,0.75]))

promedio 25.14061971830986

Percentiles

Age

0.25 18.0

0.50 24.0

0.75 32.0

Podemos ver que los pasajeros más ricos en las clases superiores tienden a ser mayores, lo que tiene sentido.
Utilizaremos los valores de la edad mediana para imputar Age según Pclass.

In [19]:

def imputar_edad(cols):
Age = cols[0]
Pclass = cols[1]

if pd.isnull(Age):

if Pclass == 1:
return 37

elif Pclass == 2:
return 29

else:
return 24

else:
return Age

¡Ahora apliquemos está función!

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 9/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [20]:

train['Age'] = train[['Age','Pclass']].apply(imputar_edad,axis=1)

¡Ahora vamos a revisar el mapa de calor de nuevo!

In [21]:

sns.heatmap(train.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Out[21]:

<AxesSubplot:>

In [22]:

train.info()

<class 'pandas.core.frame.DataFrame'>

RangeIndex: 891 entries, 0 to 890

Data columns (total 12 columns):

# Column Non-Null Count Dtype

--- ------ -------------- -----

0 PassengerId 891 non-null int64

1 Survived 891 non-null int64

2 Pclass 891 non-null int64

3 Name 891 non-null object

4 Sex 891 non-null object

5 Age 891 non-null float64

6 SibSp 891 non-null int64

7 Parch 891 non-null int64

8 Ticket 891 non-null object

9 Fare 891 non-null float64

10 Cabin 204 non-null object

11 Embarked 889 non-null object

dtypes: float64(2), int64(5), object(5)

memory usage: 83.7+ KB

¡Estupendo! Avancemos y eliminemos la columna Cabin y la fila de Embarked que es NaN.

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 10/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [23]:

#Elimina la columna cabina, inplace hace que la


# eliminación tenga efecto en el dataframe que lo usa
train.drop('Cabin',axis=1,inplace=True)

In [24]:

train.head()

Out[24]:

PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare E

Braund,
0 1 0 3 Mr. Owen male 22.0 1 0 A/5 21171 7.2500
Harris

Cumings,
Mrs. John
Bradley
1 2 1 1 female 38.0 1 0 PC 17599 71.2833
(Florence
Briggs
Th...

Heikkinen,
STON/O2.
2 3 1 3 Miss. female 26.0 0 0 7.9250
3101282
Laina

Futrelle,
Mrs.
Jacques
3 4 1 1 female 35.0 1 0 113803 53.1000
Heath
(Lily May
Peel)

Allen, Mr.
4 5 0 3 William male 35.0 0 0 373450 8.0500
Henry

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 11/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [25]:

sns.heatmap(train.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Out[25]:

<AxesSubplot:>

In [26]:

train.dropna(inplace=True)

In [27]:

sns.heatmap(train.isnull(),yticklabels=False,cbar=False,cmap='viridis')

Out[27]:

<AxesSubplot:>

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 12/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [28]:

train.info()

<class 'pandas.core.frame.DataFrame'>

Int64Index: 889 entries, 0 to 890

Data columns (total 11 columns):

# Column Non-Null Count Dtype

--- ------ -------------- -----

0 PassengerId 889 non-null int64

1 Survived 889 non-null int64

2 Pclass 889 non-null int64

3 Name 889 non-null object

4 Sex 889 non-null object

5 Age 889 non-null float64

6 SibSp 889 non-null int64

7 Parch 889 non-null int64

8 Ticket 889 non-null object

9 Fare 889 non-null float64

10 Embarked 889 non-null object

dtypes: float64(2), int64(5), object(4)

memory usage: 83.3+ KB

In [29]:

#valores que tiene Sex


train['Sex'].unique()

Out[29]:

array(['male', 'female'], dtype=object)

In [30]:

#valores que tiene Embarked


train['Embarked'].unique()

Out[30]:

array(['S', 'C', 'Q'], dtype=object)

Conversión de características categóricas


¡Necesitamos convertir características categóricas a variables dummy usando pandas! De lo contrario, nuestro
algoritmo de aprendizaje automático no podrá tomar directamente esas características como entradas.

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 13/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [31]:

train.info()

<class 'pandas.core.frame.DataFrame'>

Int64Index: 889 entries, 0 to 890

Data columns (total 11 columns):

# Column Non-Null Count Dtype

--- ------ -------------- -----

0 PassengerId 889 non-null int64

1 Survived 889 non-null int64

2 Pclass 889 non-null int64

3 Name 889 non-null object

4 Sex 889 non-null object

5 Age 889 non-null float64

6 SibSp 889 non-null int64

7 Parch 889 non-null int64

8 Ticket 889 non-null object

9 Fare 889 non-null float64

10 Embarked 889 non-null object

dtypes: float64(2), int64(5), object(4)

memory usage: 83.3+ KB

In [32]:

train.head()
#[['Pclass', 'Age', 'SibSp', 'Parch', 'Fare', 'male', 'Q','S']]

Out[32]:

PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare E

Braund,
0 1 0 3 Mr. Owen male 22.0 1 0 A/5 21171 7.2500
Harris

Cumings,
Mrs. John
Bradley
1 2 1 1 female 38.0 1 0 PC 17599 71.2833
(Florence
Briggs
Th...

Heikkinen,
STON/O2.
2 3 1 3 Miss. female 26.0 0 0 7.9250
3101282
Laina

Futrelle,
Mrs.
Jacques
3 4 1 1 female 35.0 1 0 113803 53.1000
Heath
(Lily May
Peel)

Allen, Mr.
4 5 0 3 William male 35.0 0 0 373450 8.0500
Henry

In [33]:

sex = pd.get_dummies(train['Sex'],drop_first=True)
embark = pd.get_dummies(train['Embarked'],drop_first=True)

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 14/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [34]:

train.drop(['Sex','Embarked','Name','Ticket','PassengerId'],axis=1,inplace=True)

In [35]:

train.head()

Out[35]:

Survived Pclass Age SibSp Parch Fare

0 0 3 22.0 1 0 7.2500

1 1 1 38.0 1 0 71.2833

2 1 3 26.0 0 0 7.9250

3 1 1 35.0 1 0 53.1000

4 0 3 35.0 0 0 8.0500

In [36]:

train = pd.concat([train,sex,embark],axis=1)

In [37]:

train.head()

Out[37]:

Survived Pclass Age SibSp Parch Fare male Q S

0 0 3 22.0 1 0 7.2500 1 0 1

1 1 1 38.0 1 0 71.2833 0 0 0

2 1 3 26.0 0 0 7.9250 0 0 1

3 1 1 35.0 1 0 53.1000 0 0 1

4 0 3 35.0 0 0 8.0500 1 0 1

In [38]:

train.to_csv("titanic_procesado.csv")

¡Estupendo! ¡Nuestros datos están listos para nuestro modelo!

Construcción del modelo de Regresión Logística


Comencemos dividiendo nuestros datos en un conjunto de entrenamiento y un conjunto de pruebas (hay otro
archivo test.csv que puede usar en caso de que desee utilizar todos estos datos para el entrenamiento).

División de datos de entrenamiento y prueba

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 15/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [39]:

#X = train[['Pclass', 'Age', 'SibSp', 'Parch', 'Fare', 'male', 'Q','S']]


X = train.drop('Survived',axis=1)
y = train['Survived']

In [40]:

from sklearn.model_selection import train_test_split

In [41]:

X_train, X_test, y_train, y_test = train_test_split(X,


y,
test_size=0.30,
random_state=101)

Estandarizaciòn
In [42]:

from sklearn.preprocessing import StandardScaler

In [43]:

escala = StandardScaler()

In [44]:

escala.fit(X_train)

Out[44]:

StandardScaler()

In [45]:

X_train_escala = escala.transform(X_train)

In [46]:

X_test_escala = escala.transform(X_test)

Entrenamiento y predicción

Modelo sin estandarizar

In [47]:

from sklearn.linear_model import LogisticRegression

In [48]:

logmodel = LogisticRegression(max_iter=1000)

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 16/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [49]:

#logmodel.get_params()

In [50]:

help(LogisticRegression)
| See Also

| --------

| SGDClassifier : Incrementally trained logistic regression (when given

| the parameter ``loss="log"``).

| LogisticRegressionCV : Logistic regression with built-in cross validat


ion.

| Notes

| -----

| The underlying C implementation uses a random number generator to

| select features when fitting the model. It is thus not uncommon,


| to have slightly different results for the same input data. If

| that happens, try with a smaller tol parameter.

| Predict output may not match that of standalone liblinear in certain

| cases. See :ref:`differences from liblinear <liblinear_differences>`

| in the narrative documentation.

| References

| ----------

Entrenamiento

In [51]:

logmodel.fit(X_train,y_train)

Out[51]:

LogisticRegression(max_iter=1000)

Realiza las predicciones

In [52]:

predictions = logmodel.predict(X_test)

In [53]:

y_test[0:5]

Out[53]:

511 0

613 0

615 1

337 1

718 0

Name: Survived, dtype: int64

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 17/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [54]:

X_test[0:5]

Out[54]:

Pclass Age SibSp Parch Fare male Q S

511 3 24.0 0 0 8.05 1 0 1

613 3 24.0 0 0 7.75 1 1 0

615 2 24.0 1 2 65.00 0 0 1

337 1 41.0 0 0 134.50 0 0 0

718 3 24.0 0 0 15.50 1 1 0

In [55]:

predictions[0:5]

Out[55]:

array([0, 0, 1, 1, 0], dtype=int64)

Modelo estandarizado

In [57]:

from sklearn.linear_model import LogisticRegression

In [58]:

logmodelStd = LogisticRegression(max_iter=1000)

In [59]:

logmodelStd.fit(X_train_escala,y_train)

Out[59]:

LogisticRegression(max_iter=1000)

In [60]:

predictionsStd = logmodelStd.predict(X_test_escala)

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 18/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [61]:

y_test[0:5]

Out[61]:

511 0

613 0

615 1

337 1

718 0

Name: Survived, dtype: int64

In [62]:

X_test[0:5]

Out[62]:

Pclass Age SibSp Parch Fare male Q S

511 3 24.0 0 0 8.05 1 0 1

613 3 24.0 0 0 7.75 1 1 0

615 2 24.0 1 2 65.00 0 0 1

337 1 41.0 0 0 134.50 0 0 0

718 3 24.0 0 0 15.50 1 1 0

In [63]:

predictionsStd[0:5]

Out[63]:

array([0, 0, 1, 1, 0], dtype=int64)

¡Pasemos a evaluar nuestro modelo!

Evaluación Modelo Sin Estandarizar

¡Podemos verificar la precisión, recuperación, puntaje f1 usando el informe de clasificación!

In [64]:

from sklearn.metrics import confusion_matrix,classification_report

In [65]:

confusion_matrix(y_test,predictions)

Out[65]:

array([[150, 13],

[ 32, 72]], dtype=int64)

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 19/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [66]:

from sklearn.metrics import plot_confusion_matrix

In [67]:

plot_confusion_matrix(logmodel,X_test,y_test,colorbar=False)

C:\Users\Jimmy\anaconda3\lib\site-packages\sklearn\utils\deprecation.py:87:
FutureWarning: Function plot_confusion_matrix is deprecated; Function `plot_
confusion_matrix` is deprecated in 1.0 and will be removed in 1.2. Use one o
f the class methods: ConfusionMatrixDisplay.from_predictions or ConfusionMat
rixDisplay.from_estimator.

warnings.warn(msg, category=FutureWarning)

Out[67]:

<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay at 0x19e7f537
f70>

In [68]:

print(classification_report(y_test,predictions,target_names=['No Sob','Sí Sob']))

precision recall f1-score support

No Sob 0.82 0.92 0.87 163

Sí Sob 0.85 0.69 0.76 104

accuracy 0.83 267

macro avg 0.84 0.81 0.82 267

weighted avg 0.83 0.83 0.83 267

Curvas ROC

Estos gráficos usan dos métricas:

Sensibilidad (Sensitivity): La probabilidad de que el modelo prediga un resultado positivo para una
observación cuando el resultado es en verdad positivo.
Especificidad (Specificity): La probabilidad de que el modelo prediga un resultado negativo para una
observación cuando el resultado es en verdad negativo.
localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 20/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

La curva ROC muestra estas dos métricas

TPR Tasa de Verdaderos Positivos


FPR Tasa de Falsos Positivos

In [69]:

from sklearn.metrics import plot_roc_curve

In [70]:

plot_roc_curve(logmodel,X_test,y_test,pos_label=0)

C:\Users\Jimmy\anaconda3\lib\site-packages\sklearn\utils\deprecation.py:87:
FutureWarning: Function plot_roc_curve is deprecated; Function :func:`plot_r
oc_curve` is deprecated in 1.0 and will be removed in 1.2. Use one of the cl
ass methods: :meth:`sklearn.metric.RocCurveDisplay.from_predictions` or :met
h:`sklearn.metric.RocCurveDisplay.from_estimator`.

warnings.warn(msg, category=FutureWarning)

Out[70]:

<sklearn.metrics._plot.roc_curve.RocCurveDisplay at 0x19e7f612670>

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 21/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [71]:

plot_roc_curve(logmodel,X_test,y_test,pos_label=1)

C:\Users\Jimmy\anaconda3\lib\site-packages\sklearn\utils\deprecation.py:87:
FutureWarning: Function plot_roc_curve is deprecated; Function :func:`plot_r
oc_curve` is deprecated in 1.0 and will be removed in 1.2. Use one of the cl
ass methods: :meth:`sklearn.metric.RocCurveDisplay.from_predictions` or :met
h:`sklearn.metric.RocCurveDisplay.from_estimator`.

warnings.warn(msg, category=FutureWarning)

Out[71]:

<sklearn.metrics._plot.roc_curve.RocCurveDisplay at 0x19e7f722580>

Evaluación Modelo Estandarizado


In [72]:

confusion_matrix(y_test,predictionsStd)

Out[72]:

array([[150, 13],

[ 33, 71]], dtype=int64)

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 22/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [73]:

plot_confusion_matrix(logmodelStd,X_test_escala,y_test,colorbar=False)

C:\Users\Jimmy\anaconda3\lib\site-packages\sklearn\utils\deprecation.py:87:
FutureWarning: Function plot_confusion_matrix is deprecated; Function `plot_
confusion_matrix` is deprecated in 1.0 and will be removed in 1.2. Use one o
f the class methods: ConfusionMatrixDisplay.from_predictions or ConfusionMat
rixDisplay.from_estimator.

warnings.warn(msg, category=FutureWarning)

Out[73]:

<sklearn.metrics._plot.confusion_matrix.ConfusionMatrixDisplay at 0x19e7ed5a
e50>

In [74]:

print(classification_report(y_test,predictionsStd,target_names=['No Sob','Sí Sob']))

precision recall f1-score support

No Sob 0.82 0.92 0.87 163

Sí Sob 0.85 0.68 0.76 104

accuracy 0.83 267

macro avg 0.83 0.80 0.81 267

weighted avg 0.83 0.83 0.82 267

Curvas R

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 23/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [78]:

plot_roc_curve(logmodelStd,X_test_escala,y_test,pos_label=0)

C:\Users\Jimmy\anaconda3\lib\site-packages\sklearn\utils\deprecation.py:87:
FutureWarning: Function plot_roc_curve is deprecated; Function :func:`plot_r
oc_curve` is deprecated in 1.0 and will be removed in 1.2. Use one of the cl
ass methods: :meth:`sklearn.metric.RocCurveDisplay.from_predictions` or :met
h:`sklearn.metric.RocCurveDisplay.from_estimator`.

warnings.warn(msg, category=FutureWarning)

Out[78]:

<sklearn.metrics._plot.roc_curve.RocCurveDisplay at 0x19e00178af0>

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 24/25
26/12/22, 13:12 01RegresionLogisticaConPython - Jupyter Notebook

In [79]:

plot_roc_curve(logmodelStd,X_test_escala,y_test,pos_label=1)

C:\Users\Jimmy\anaconda3\lib\site-packages\sklearn\utils\deprecation.py:87:
FutureWarning: Function plot_roc_curve is deprecated; Function :func:`plot_r
oc_curve` is deprecated in 1.0 and will be removed in 1.2. Use one of the cl
ass methods: :meth:`sklearn.metric.RocCurveDisplay.from_predictions` or :met
h:`sklearn.metric.RocCurveDisplay.from_estimator`.

warnings.warn(msg, category=FutureWarning)

Out[79]:

<sklearn.metrics._plot.roc_curve.RocCurveDisplay at 0x19e0002ca30>

Conclusiones
Las algunas metricas (recall, macro-avg, precision, etc) del modelo estandarizado son menores por 0.01 en
comparacion de las metricas del modelo sin estandarizar porque lo que se concluye que el modelo sin
estandarizar da mejores resultados por una minima diferencia, es decir, la estandarizacion no tuvo impacto en
los datos de este caso de estudio.

In [ ]:

localhost:8888/notebooks/Desktop/03RegresionLogistica/03RegresionLogistica/01RegresionLogisticaConPython.ipynb#Curvas-R# 25/25

También podría gustarte