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
ID:(1791, 0)
Cargar conjunto de datos
Descripción
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
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
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
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
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
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
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
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
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
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
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
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
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
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=\displaystyle\frac{TP}{TP+FN}$
\\n\\ndonde true-positive
$FPR=\displaystyle\frac{FP}{FP+TN}$
donde false-positive
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)