Usuario:


Modelo DNN con estimador (dataset Titanic)

Storyboard

Una aplicación es el estudio de los datos de los pasajeros del Titanic y la probabilidad de sobre-vivencia según sus características. En este caso se usa un modelo del tipo DNN estimador de clasificaciones.

Código y datos

DNNTitanic.ipynb

titanic_dnn_train.csv

titanic_dnn_test.csv

titanic_dnn_eval.csv

>Modelo

ID:(1791, 0)



Cargar conjunto de datos

Descripción

>Top


Cargar los datos de los pasajeros del viaje inaugural del Titanic.

import pandas as pd
import numpy as np

train = pd.read_csv('train_short.csv')
eval = pd.read_csv('eval_short.csv')
test = pd.read_csv('test-ready.csv')

ID:(13843, 0)



Mostrar estructuras y datos de entrenamiento

Descripción

>Top


Mostrar estructuras y datos del conjunto de datos de los pasajeros del Titanic:

# show structure and data
train.head(5)


ID:(13844, 0)



Mostrar estructuras y datos de evaluación

Descripción

>Top


Mostrar estructuras y datos del conjunto de datos de los pasajeros del Titanic:

# show structure and data
eval.head(5)


ID:(13845, 0)



Mostrar estructuras y datos de testeo

Descripción

>Top


Mostrar estructuras y datos del conjunto de datos de los pasajeros del Titanic:

# show structure and data
test.head(5)


ID:(13846, 0)



Número de registros

Descripción

>Top


El numero de registros para cada grupo se puede determinar con la función shape[0]:

# count number of records
train.shape[0], eval.shape[0], test.shape[0]

(627, 264, 418)

ID:(13847, 0)



Cargar datos para entrenar y evaluar

Descripción

>Top


Para poder correr el entrenamiento se debe cargar los datos tanto de entrenamiento train_input_fn y evaluación eval_input_fn en tensores y barajarlos:

# input function for training
def train_input_fn(features, labels, batch_size):
    dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
    dataset = dataset.shuffle(10).repeat().batch(batch_size)
    return dataset

# input function for evaluation or prediction
def eval_input_fn(features, labels, batch_size):
    features=dict(features)
    if labels is None:
        inputs = features
    else:
        inputs = (features, labels)

    dataset = tf.data.Dataset.from_tensor_slices(inputs)
    
    assert batch_size is not None, 'batch_size must not be None'
    dataset = dataset.batch(batch_size)

    return dataset

ID:(13848, 0)



Formar arreglos entrenar y evaluar

Descripción

>Top


Crear arreglos de datos base y variable a predecir para entrenar y evaluar. En este caso la columna a ser predicha es la sobrevivencia, la que se obtiene mediante pop('Survived'):

# define training arrays
y_train = train.pop('Survived')
X_train = train

# define evaluation arrays
y_eval = eval.pop('Survived')
X_eval = eval

ID:(13849, 0)



Crear arreglo de columnas para definir modelo

Descripción

>Top


Para definir el modelo se crea el arreglo de las columnas feature_columns que se van a usar mediante:

# import tensorflow
import tensorflow as tf

# define columns
feature_columns = []

for key in X_train.keys():
    feature_columns.append(tf.feature_column.numeric_column(key=key))

ID:(13850, 0)



Definir el modelo DNN

Descripción

>Top


Con las columnas feature_columns se puede definir con estimator.DNNClassifier el modelo DNN_model:

# define the DNN model
DNN_model = tf.estimator.DNNClassifier(
    feature_columns=feature_columns,
    hidden_units=[10, 10],
    n_classes=2)

ID:(13851, 0)



Entrenar el modelo DNN

Descripción

>Top


Entrenar el modelo con los datos creados por train_input_fn:

# train the DNN model
batch_size = 100
train_steps = 400

for i in range(0,100):    
    DNN_model.train(input_fn=lambda:train_input_fn(X_train, y_train,batch_size),steps=train_steps)

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Create CheckpointSaverHook.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 0...

INFO:tensorflow:Saving checkpoints for 0 into C:\Users\KLAUSS~1\AppData\Local\Temp\tmp9f9txo1c\model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 0...

INFO:tensorflow:loss = 0.6394816, step = 0

INFO:tensorflow:global_step/sec: 807.462

INFO:tensorflow:loss = 0.60958487, step = 100 (0.125 sec)

INFO:tensorflow:global_step/sec: 1143.95

INFO:tensorflow:loss = 0.6261593, step = 200 (0.086 sec)

INFO:tensorflow:global_step/sec: 1233.15

INFO:tensorflow:loss = 0.58592194, step = 300 (0.081 sec)

...

INFO:tensorflow:Calling checkpoint listeners before saving checkpoint 40000...

INFO:tensorflow:Saving checkpoints for 40000 into C:\Users\KLAUSS~1\AppData\Local\Temp\tmp9f9txo1c\model.ckpt.

INFO:tensorflow:Calling checkpoint listeners after saving checkpoint 40000...

INFO:tensorflow:Loss for final step: 0.49167815.

ID:(13852, 0)



Evaluar el modelo DNN

Descripción

>Top


Evaluar el modelo con los datos creados por train_input_fn:

# evaluate the DNN model
eval_result = DNN_model.evaluate(input_fn=lambda:eval_input_fn(X_eval, y_eval,batch_size))

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Starting evaluation at 2021-07-26T22:14:15

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from C:\Users\KLAUSS~1\AppData\Local\Temp\tmp9f9txo1c\model.ckpt-40000

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

INFO:tensorflow:Inference Time : 0.36007s

INFO:tensorflow:Finished evaluation at 2021-07-26-22:14:15

INFO:tensorflow:Saving dict for global step 40000: accuracy = 0.7765151, accuracy_baseline = 0.6363636, auc = 0.8616692, auc_precision_recall = 0.80749995, average_loss = 0.44881073, global_step = 40000, label/mean = 0.36363637, loss = 0.44580325, precision = 0.7078652, prediction/mean = 0.36897483, recall = 0.65625

INFO:tensorflow:Saving 'checkpoint_path' summary for global step 40000: C:\Users\KLAUSS~1\AppData\Local\Temp\tmp9f9txo1c\model.ckpt-40000

ID:(13853, 0)



Realizar pronóstico con el modelo DNN

Descripción

>Top


Pronosticar el resultado del modelo con los datos de evaluación creados por eval_input_fn:

# forcast with the DNN model
predictions = DNN_model.predict(
    input_fn=lambda:eval_input_fn(eval,labels=None,
    batch_size=batch_size))

results = list(predictions)

INFO:tensorflow:Calling model_fn.

INFO:tensorflow:Done calling model_fn.

INFO:tensorflow:Graph was finalized.

INFO:tensorflow:Restoring parameters from C:\Users\KLAUSS~1\AppData\Local\Temp\tmp9f9txo1c\model.ckpt-40000

INFO:tensorflow:Running local_init_op.

INFO:tensorflow:Done running local_init_op.

ID:(13854, 0)



Histograma de las probabilidades de sobrevivir

Descripción

>Top


Si se evalúa la probabilidad de sobre-vivencia pronosticada en función de su frecuencia:

# histogram of the probability
probs = pd.Series([pred['probabilities'][1] for pred in results])

probs.plot(kind='hist', bins=20, title='predicted probabilities')


se obtiene una distribución de la forma:

ID:(13855, 0)



Curva ROC

Descripción

>Top


Para usar este pronostico se debe definir un valor limite de la propiedad para definir sobre que valor se va a pronosticar que se sobrevive y bajo la cual se pronosticara la no sobre-vivencia. Para ello se debe evaluar la probabilidad de que se pronostique la sobre-vivencia y se observe esta (true positive) y compararla con la probabilidad que de pronostique la sobre-vivencia cuando no se sobrevive (false positive).\\nEl factor true-positive TPR o sensitividad se define como\\n\\n

$TPR=\displaystyle\frac{TP}{TP+FN}$

\\n\\ndonde true-positive TP los casos pronosticados correctamente como positivos y los false-negative FN que corresponden a los casos pronosticados como negativos que resultan negativos.\\nEl factor false-positive FPR o sensitividad se define como\\n\\n

$FPR=\displaystyle\frac{FP}{FP+TN}$



donde false-positive FP los casos pronosticados como positivos cuando es en realidad falso y los false-negative FN que corresponden a los casos pronosticados como negativos que resultan negativos.

from sklearn.metrics import roc_curve
from matplotlib import pyplot as plt

fpr, tpr, _ = roc_curve(y_eval, probs)
plt.plot(fpr, tpr)
plt.title('ROC curve')
plt.xlabel('false positive rate')
plt.ylabel('true positive rate')
plt.xlim(0,)
plt.ylim(0,)


La representación de ambas probabilidades se denominan un diagrama de ROC (Receiver Operating Characteristic):

ID:(13842, 0)