Evaluación y monitoreo de modelos TensorFlow
1. Conceptos básicos de evaluación de modelos
En los proyectos de aprendizaje automático, la evaluación de modelos es un paso clave para verificar el rendimiento del modelo. Nos ayuda a comprender el comportamiento del modelo en escenarios reales y nos guía para optimizarlo.
1.1 ¿Por qué se necesita la evaluación de modelos?
- Verificación del rendimiento: confirmar si el modelo alcanza el efecto esperado
- Selección del modelo: comparar las ventajas y desventajas de diferentes modelos
- Ajuste de parámetros: orientar la dirección del ajuste de hiperparámetros
- Evitar el sobreajuste: detectar si el modelo se adapta en exceso a los datos de entrenamiento
1.2 Tipos de métricas de evaluación
| Tipo de métrica | Escenario de aplicación | Métricas comunes |
|---|---|---|
| Métricas de clasificación | Problemas de clasificación | Exactitud, precisión, recall (sensibilidad), puntuación F1 |
| Métricas de regresión | Problemas de regresión | MSE、MAE、R² |
| Métricas de agrupamiento (clustering) | Aprendizaje no supervisado | Coeficiente de silueta, índice de Davies-Bouldin |
2. Herramientas de evaluación de TensorFlow
TensorFlow ofrece múltiples herramientas y métodos para evaluar el rendimiento del modelo.
2.1 Métricas de evaluación integradas
Ejemplo
import tensorflow as tf
# Métricas de clasificación comunes
metrics = [
tf.keras.metrics.BinaryAccuracy(),
tf.keras.metrics.Precision(),
tf.keras.metrics.Recall(),
tf.keras.metrics.AUC()
]
# Métricas de regresión comunes
metrics = [
tf.keras.metrics.MeanSquaredError(),
tf.keras.metrics.MeanAbsoluteError(),
tf.keras.metrics.RootMeanSquaredError()
]
# Métricas de clasificación comunes
metrics = [
tf.keras.metrics.BinaryAccuracy(),
tf.keras.metrics.Precision(),
tf.keras.metrics.Recall(),
tf.keras.metrics.AUC()
]
# Métricas de regresión comunes
metrics = [
tf.keras.metrics.MeanSquaredError(),
tf.keras.metrics.MeanAbsoluteError(),
tf.keras.metrics.RootMeanSquaredError()
]
2.2 Proceso de evaluación
1. Especificar métricas al compilar el modelo
Ejemplo
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy', tf.keras.metrics.AUC()]
)
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy', tf.keras.metrics.AUC()]
)
2. Evaluar con el método evaluate
Ejemplo
test_loss, test_acc, test_auc = model.evaluate(
test_images, test_labels, verbose=2
)
test_images, test_labels, verbose=2
)
3. Función de evaluación personalizada
Ejemplo
import tensorflow as tf
@tf.function
def custom_metric(y_true, y_pred):
threshold = 0.5
y_pred = tf.cast(y_pred > threshold, tf.float32)
# Calcular la exactitud, no solo la proporción de positivos
correct_predictions = tf.cast(tf.equal(y_true, y_pred), tf.float32)
return tf.reduce_mean(correct_predictions)
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=[custom_metric, 'accuracy'] # También se puede mantener la métrica de exactitud estándar como referencia
)
@tf.function
def custom_metric(y_true, y_pred):
threshold = 0.5
y_pred = tf.cast(y_pred > threshold, tf.float32)
# Calcular la exactitud, no solo la proporción de positivos
correct_predictions = tf.cast(tf.equal(y_true, y_pred), tf.float32)
return tf.reduce_mean(correct_predictions)
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=[custom_metric, 'accuracy'] # También se puede mantener la métrica de exactitud estándar como referencia
)
3. Monitoreo y visualización de modelos
1. Integración de TensorBoard
TensorBoard es la herramienta de visualización de TensorFlow que permite monitorear el proceso de entrenamiento en tiempo real.
Ejemplo
# Configurar la función de devolución de llamada (callback)
tensorboard_callback = tf.keras.callbacks.TensorBoard(
log_dir='./logs',
histogram_freq=1,
write_graph=True,
write_images=True
)
# Añadir el callback al entrenar el modelo
model.fit(
train_data,
epochs=10,
validation_data=val_data,
callbacks=[tensorboard_callback]
)
tensorboard_callback = tf.keras.callbacks.TensorBoard(
log_dir='./logs',
histogram_freq=1,
write_graph=True,
write_images=True
)
# Añadir el callback al entrenar el modelo
model.fit(
train_data,
epochs=10,
validation_data=val_data,
callbacks=[tensorboard_callback]
)
Iniciar TensorBoard:
tensorboard --logdir=./logs
2. Métricas clave de monitoreo

4. Técnicas avanzadas de evaluación
4.1 Validación cruzada
Ejemplo
from sklearn.model_selection import KFold
import numpy as np
# Preparar los datos
X = np.array(...)
y = np.array(...)
# Validación cruzada de 5 pliegues
kfold = KFold(n_splits=5, shuffle=True)
fold_no = 1
for train, test in kfold.split(X, y):
# Crear el modelo
model = create_model()
# Entrenar el modelo
model.fit(X[train], y[train], epochs=10)
# Evaluar el modelo
scores = model.evaluate(X[test], y[test])
print(f'Fold {fold_no} - {model.metrics_names[0]}: {scores[0]}')
fold_no += 1
import numpy as np
# Preparar los datos
X = np.array(...)
y = np.array(...)
# Validación cruzada de 5 pliegues
kfold = KFold(n_splits=5, shuffle=True)
fold_no = 1
for train, test in kfold.split(X, y):
# Crear el modelo
model = create_model()
# Entrenar el modelo
model.fit(X[train], y[train], epochs=10)
# Evaluar el modelo
scores = model.evaluate(X[test], y[test])
print(f'Fold {fold_no} - {model.metrics_names[0]}: {scores[0]}')
fold_no += 1
4.2 Análisis de la matriz de confusión
Ejemplo
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as plt
# Obtener las predicciones
y_pred = model.predict(test_images)
y_pred_classes = np.argmax(y_pred, axis=1)
# Generar la matriz de confusión
conf_mat = confusion_matrix(test_labels, y_pred_classes)
# Visualización
plt.figure(figsize=(10, 8))
sns.heatmap(conf_mat, annot=True, fmt='d')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()
import seaborn as sns
import matplotlib.pyplot as plt
# Obtener las predicciones
y_pred = model.predict(test_images)
y_pred_classes = np.argmax(y_pred, axis=1)
# Generar la matriz de confusión
conf_mat = confusion_matrix(test_labels, y_pred_classes)
# Visualización
plt.figure(figsize=(10, 8))
sns.heatmap(conf_mat, annot=True, fmt='d')
plt.xlabel('Predicted')
plt.ylabel('Actual')
plt.show()
5. Monitoreo después del despliegue del modelo
5.1 Puntos clave de monitoreo en producción
- Detección de deriva de datos: monitorear los cambios en la distribución de los datos de entrada
- Detección de deriva de concepto: monitorear los cambios en la relación entre las características y el objetivo
- Detección de degradación del rendimiento: evaluar periódicamente el rendimiento del modelo
- Detección de entradas anómalas: identificar muestras de entrada anómalas
5.2 Arquitectura del sistema de monitoreo

6. Ejercicios prácticos
6.1 Tareas de práctica
- Entrenar un modelo CNN simple en el conjunto de datos MNIST
- Implementar las siguientes funcionalidades de evaluación:
- Monitoreo de la exactitud y la pérdida durante el entrenamiento
- Análisis de la matriz de confusión en el conjunto de prueba
- Visualizar el proceso de entrenamiento con TensorBoard
- Intentar implementar métricas de evaluación personalizadas
6.2 Estructura de código de referencia
Ejemplo
import tensorflow as tf
from tensorflow.keras import layers
# 1. Preparación de datos
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
# 2. Construcción del modelo
model = tf.keras.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)),
layers.Flatten(),
layers.Dense(10, activation='softmax')
])
# 3. Compilar el modelo (añade las métricas que elijas)
model.compile(...)
# 4. Entrenar el modelo (añade el callback de TensorBoard)
history = model.fit(...)
# 5. Evaluar el modelo
test_loss, test_acc = model.evaluate(...)
# 6. Análisis de la matriz de confusión
# Tu código...
from tensorflow.keras import layers
# 1. Preparación de datos
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255
# 2. Construcción del modelo
model = tf.keras.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
layers.MaxPooling2D((2, 2)),
layers.Flatten(),
layers.Dense(10, activation='softmax')
])
# 3. Compilar el modelo (añade las métricas que elijas)
model.compile(...)
# 4. Entrenar el modelo (añade el callback de TensorBoard)
history = model.fit(...)
# 5. Evaluar el modelo
test_loss, test_acc = model.evaluate(...)
# 6. Análisis de la matriz de confusión
# Tu código...